【问题标题】:Snippets vs. Abbreviations in VimVim 中的片段与缩写
【发布时间】:2018-12-06 02:14:46
【问题描述】:

使用“sn-ps”插件有哪些优点和/或缺点,例如snipmateultisnips,用于 VIM 而不是简单地使用内置的“abbreviations”功能?

是否存在声明iabbrcabbr 等的特定用例。缺少 sn-ps 插件提供的一些主要 功能?我一直未能找到这两个“功能”及其各自实现之间的彻底比较。

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

需要注意的是,缩写也可以执行代码。通常通过<c-r>= 或通过表达式缩写(<expr>)。将@@ 扩展为当前文件路径的示例::iabbrev @@ <c-r>=expand('%:p')<cr>

以 python 为例,让我们比较一下 Vim 中的 snipmate sn-p 和 abbrev 用于插入类声明的行。

截图

# 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

au FileType python :iabbr cl class ClassName(object):<CR><Tab>"""docstring for ClassName"""<CR>def __init__(self, arg):<CR><Tab>super(ClassName, self).__init__()<CR>self.arg = arg

当 Vim 的 abbr:help template 模板能够做到 所有 大部分 sn-ps 做了什么?

我认为实现 sn-ps 更容易,并且它们提供了额外的美学/视觉功能。例如,如果我在 Vim 和其他插件中使用 abbr 在 vi​​m 中运行/测试 python 代码——例如syntasticpytestropevimpep8 等等——我错过了 sn-ps 提供的一些关键功能吗?

【问题讨论】:

  • 你能提供一个sn-p插件的具体例子吗?
  • 请参阅 this,了解您可以使用 ultisnips 做什么的演示。然后想想你如何用缩写来完成同样的事情。 :)
  • 正如@peter-rincker 在评论中指出的那样,您可以通过&lt;c-r&gt;=... 使用vimscript 实现相同的目的。我认为它更容易实现 sn-ps,以及一些美学/视觉特征。
  • 我不知道 iabbr 可以执行代码!谢谢!谢谢!我有没有提到它?谢谢!!

标签: python vim text-editor


【解决方案1】:

所有可以用 sn-ps 完成的事情都可以用缩写来完成,反之亦然。你可以有(镜像或不镜像)带有缩写的占位符,你可以有上下文相关的 sn-ps。

有两个重要的区别:

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

还有一些其他差异。例如,缩写总是随处触发。在评论或字符串上下文中看到for 扩展为for(placeholder) {\n} 肯定不是最终用户所期望的。使用 sn-ps,这不再是问题:我们可以期望最终用户在请求扩展 sn-p 时知道他在做什么。不过,我们可以建议 context-aware snippets 在评论中将 throw 扩展为 @throw {domain::exception} {explanation},或在其他地方扩展为 throw domain::exception({message});

【讨论】:

  • 虽然我在精神上更同意其他一些答案,但从逻辑上讲,这是一个接近的赢家,因此是公认的答案。多年来对我来说仍然如此,但仍然很接近:)
【解决方案2】:

片段

Vim 本地缩写的粗略超集。以下是重点:

  • 仅在按键时触发
  • 使用用户可以跳转的占位符
  • 只存在于插入模式
  • 动态扩展

缩写

非常适合常见的拼写错误和小的 sn-ps。

  • Vim 原生,因此无需插件
  • 通常在空格或&lt;c-]&gt; 上展开
  • 触发文本的一些特殊规则(参见:h abbreviations
  • 可以通过:cabbrev在命令模式下使用(常用于创建命令别名)
  • 没有占位符
  • 动态扩展

结论

在大多数情况下,sn-ps 更强大,并提供了许多其他编辑器喜欢的功能,但您可以同时使用这两种方法,很多人也可以使用。缩写享有原生的好处,这对远程环境很有用。缩写还有另一个明显的优势,就是可以在命令模式下使用。

【讨论】:

  • 这就是我一直在做的,同时使用两者;但这似乎有点矫枉过正,也许是因为我不知道如何充分利用 sn-ps。
  • mu-template 有可以在视觉模式下触发的 sn-ps(周边功能)。我认为其他 sn-ps 引擎也有类似的功能。占位符绝对可以使用缩写。
【解决方案3】:

片段更强大。

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

例如使用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

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

在“sn-p”之后,起始行包含三个项目;

  • 触发字符串,
  • 描述和
  • sn-p 的选项。

我个人主要使用b选项,其中sn-p在行首展开,w选项在触发字符串从单词开头开始时展开sn-p。

请注意,您必须键入触发字符串,然后输入实际触发扩展的键或组合键。所以一个 sn-p 不会被扩展除非你想要它

此外,sn-ps 可以通过文件类型进行专门化。假设您要定义四个级别的标题,h1 .. h4。您可以让相同的名称以不同的方式扩展,例如HTML、markdown、LaTeX 或重组文本文件。

【讨论】:

  • 需要注意的是,缩写也可以执行代码。通常通过 &lt;c-r&gt;= 或表达式缩写 (&lt;expr&gt;)。将@@ 扩展为当前文件路径的示例::iabbrev @@ &lt;c-r&gt;=expand('%:p')&lt;cr&gt;
  • 有趣!我不知道缩写可以做到这一点。但我必须承认,自从安装 ultisnips 以来,我并没有过多使用缩写词。
  • 感谢您的回复;至于文件类型专业化,我相信你也可以用 vimscript 做到这一点:au FileType html...
  • 您对 Vim-snipmate 与 ultisnips 有何看法? ultisnips 更强大吗?
【解决方案4】:

sn-ps 就像类固醇上的内置:abbreviate,通常带有:

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

一个sn-p插件要评价三个方面:一是sn-p引擎本身的特点,二是作者或他人提供的sn-ps的质量和广度;第三,添加新的sn-ps是多么容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2015-12-31
    • 2019-12-15
    • 2013-09-26
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多