Vim中的代码片段与缩写

2024-05-19 12:04:00 发布

您现在位置:Python中文网/ 问答频道 /正文

使用“snippets”插件,例如snipmateultisnips,与简单使用内置的“abbreviations”功能相比,有哪些优点和/或缺点?

是否存在声明iabbrcabbr等的特定用例,从而缺少snippets插件提供的一些主要特性?我一直未能在这两个“特性”和它们各自的实现之间找到一个彻底的比较。在

正如@peter rincker在评论中指出的:

It should be noted that abbreviations can execute code as well. Often via <c-r>= or via an expression abbreviation (<expr>). Example which expands @@ to the current file's path: :iabbrev @@ <c-r>=expand('%:p')<cr>

作为python的一个例子,让我们比较一个snipmate片段和Vim中用于插入类声明行的缩写。在

Snipmate

# New Class
snippet cl 
  class ${1:ClassName}(${2:object}):
    """${3:docstring for $1}"""
    def __init__(self, ${4:arg}):
      ${5:super($1, self).__init__()}
      self.$4 = $4 
      ${6}

Vimscript

^{pr2}$

当Vim的abbr:help template模板能够完成代码片段中大部分的功能时,我是不是缺少了一些基本的功能,或者假设它们在很大程度上是多余的呢?在

我认为代码片段更容易实现,它们还提供了额外的美学/视觉特性。例如,如果我在Vim和其他插件中使用abbr来运行/测试Vim中的python代码——例如syntasticpytestropevimpep8)等等,我是否遗漏了代码片段提供的一些关键特性?在


Tags: 代码self功能插件声明init特性vim
3条回答

片段类似于类固醇的内置:abbreviate,通常有:

  • 参数插入:您可以在代码段的不同位置插入(键入或选择)文本片段。缩写词只会扩展一次。在
  • 镜像:参数可能在代码段的其他地方重复(甚至以转换的方式),通常在键入时更新。在
  • 多个停止内部:您可以在片段内从一个点跳到另一个点,有时甚至递归地在一个点内展开片段。在

在一个snippet插件中需要评估三件事:第一,代码段引擎本身的特性,第二,作者或其他人提供的代码段的质量和广度;第三,添加新代码段有多容易。在

代码片段更强大。在

根据实现的不同,代码段可以让您更改(或接受默认值)多个占位符,甚至可以在扩展代码段时执行代码。在

例如,使用ultisnips,您可以让它执行shell命令、vimscript以及Python代码。在

一个(ultisnips)示例:

snippet hdr "General file header" b
# file: `!v expand('%:t')`
# vim:fileencoding=utf-8:ft=`!v &filetype`
# ${1}
#
# Author: ${2:J. Doe} ${3:<jdoe@gmail.com>}
# Created: `!v strftime("%F %T %z")`
# Last modified: `!v strftime("%F %T %z")`
endsnippet

这将为您提供三个要填充的占位符(它提供其中两个的默认值),并设置文件名、文件类型和当前日期和时间。在

在单词“snippet”之后,开始行包含三个项目

  • 触发字符串
  • 和说明
  • 代码段的选项。在

就个人而言,我主要使用b选项,其中代码段在行首展开,而w选项用于在触发器字符串从单词开头开始时展开代码段。在

请注意,您必须键入触发器字符串,然后输入一个键或键组合来实际触发扩展。因此,除非您希望,否则片段不会展开。在

此外,代码段可以按文件类型进行专门化。假设您要定义四个级别的标题,h1。。h4。您可以在HTML、markdown、LaTeX或RestructedText文件之间使用不同的扩展名。在

所有可以用代码片段完成的事情都可以用缩写来完成,反之亦然。你可以有(镜像或不镜像)带有缩写的占位符,也可以有上下文敏感的代码段。在

有两个重要区别:

  • 当输入了缩写文本并命中非单词字符(或esc)时,将触发缩写。代码段是按需触发的,并且可以使用快捷方式(无需键入while+tab)。w+tab就足够了)。在
  • 定义新片段(或维护旧片段)比定义缩写要容易得多。用缩写,a lot of boiler plate code is required when we want to do neat things。在

还有一些其他的区别。例如,缩写总是在任何地方被触发。在注释或字符串上下文中看到for扩展为{},这肯定不是最终用户所期望的。对于代码段,这不再是一个问题:我们可以期望最终用户在请求扩展代码段时知道他在做什么。不过,我们可以提出context-aware snippets在注释中将throw扩展为{},或者在其他地方扩展到{}。在

相关问题 更多 >

    热门问题