vim代码片段插件之间有什么区别?


25

vim有很多片段插件:ultisnipssnipmatexptemplateneosnippet等。

它们都有优点和缺点以及或多或少的依赖性。到目前为止,我一直在使用ultisnips,但从未对其完全满意。

由于我们对插件管理器有一个非常有趣且完整的问题,我认为对片段插件进行相同的解释将非常有用。

有一个上市这里可能是一个良好的开端,但一些完整,清晰,precises答案为我们的社会能写会非常有用。


1
您还可以提供马克·韦伯维基这个矩阵:vim-wiki.mawercer.de/wiki/topic/...
吕克Hermitte

2
恕我直言,这是相当通用的,也许如果您阐述“从未完全满意”?我使用Shougo的“ neosnippet.vim”。
VanLaser

您应该使用此处的信息更新Wiki。谢谢。
克里斯蒂安·布拉班德

@ChristianBrabandt:是的,一会儿(接下来的几天)我就会更新它。
statox

Answers:


22

我已经使用了ultisnips好几个星期了。

我认为此插件的主要优点如下:

  • 即使有大量的摘要,它也非常快。
  • 定义新代码段的基本语法很容易理解,因此可以轻松地按照自己的意愿快速创建新代码段。(对于更复杂的代码段,可能需要一些额外的工作。)
  • 开箱即用,效果很好。基本配置可让您快速使用摘要。
  • 它确实是可配置的。即使基本配置运行良好,如果您是高级用户,也可以对其进行微调。

首先,ultisnips是一个代码片段引擎,这意味着该插件提供了使用代码片段的功能,但本身并不提供代码片段。为了获得这些片段,作者推荐使用 vim-snippets

一旦安装了两个插件,就可以使用您的代码片段。

代码段的定义存储在以以下模式命名的文件中: ft.snippetsft_*.snippetsft/*,其中ft是当前文档的“文件类型”,并且*是类似于shell的通配符,可匹配包括空字符串在内的任何字符串。(请注意,cuda.cpp支持点文件类型的语法,例如。)

这样,仅当设置了缓冲区的文件类型时,才扩展特定于文件类型的代码片段。特殊文件类型all可用于创建在所有缓冲区上扩展的代码段。

除了vim片段提供的片段外,用户还可以定义自己的片段。我的建议是将它们放置在目录中, ~/.vim/my-snippets/Ultisnips这样Ultisnips无需额外配置即可找到它们,并且很容易将它们维护在点文件存储库中。

为了扩展代码片段,Ultisnips提供了一个变量g:UltiSnipsExpandTrigger ,该变量定义了将触发扩展的映射(我选择了 **对我来说非常方便)。请注意,应该可以进行集成,但我自己没有对其进行测试。

对于高级用户,Ultisnips还提供一些功能以自定义扩展的行为或以不同方式触发它。看到:h UltiSnips-trigger-functions


这是我真正广泛使用的第一个代码片段管理器,我认为这是一个很好的开始,因为它具有开箱即用的简单性以及可以调整的可能性。

最后,这里是截屏视频的列表,它们对插件做了很好的介绍:


您知道如何制作它,以便它在触发时不会扩展,除非它前面有空格或a >(如HTML的大括号。在标签末尾不知道它的事实令人讨厌,因为如果启用选项i则使得它如此,即使它在一个字是没有好处的中间它扩展它。
督学

12

自从开始使用Vim以来,我一直在使用原始的SnipMate

  • 它没有外部依赖性。
  • 它使用非常简单的语法。
  • 设置非常容易。
  • 自2009年以来已被废弃。

我没什么好抱怨的。


16
这是我第一次看到有人提到遗弃是一项功能。:D
老师

6
一个废弃的项目是一个稳定的项目。您无需担心本地实例已过时,也不必担心更新会因API更改而中断您的工作流程。如果安装时满足您的需求,它将永远持续下去。除非您的需求发生变化。稳定性是我在任何工具中追求的第一大功能。
romainl '16

3
“如果安装时它满足了您的需求,它将永远持续下去。除非您的需求有所变化。” 或者,您发现一个错误,这时您需要自己修复,寻找其他人修复或寻找替代方法。也许没有被遗弃的那一种。

1
感谢您的回答@romainl!我有一个问题:您说该插件已被放弃,但是自述文件重定向到了一个更新的版本,该版本似乎非常活跃,并且多次提交似乎可以修复某些问题,使用新版本不是更好吗?
statox

1
UltraSnips中存在一些错误和文档错误,使入门经验不那么令人愉快。在最终使其运行之后,我决定检查SnipMate并可以理解@romainl的稳定性问题。
chb

7

这是mu-template的功能列表。Discl .:我是它的维护者。

  • 模板文件可以扩展:
    • 在打开新缓冲区时自动(除非从.vimrc禁用),
    • 通过菜单或命令行明确地
    • 以类似片段的方式从INSERT模式运行;
    • 从VISUAL模式到用片段包围选择-可以将环境应用于片段中的不同区域(例如,while控制语句中的代码或条件区域);
  • 所有代码段均在其自己的模板文件中定义-所有其他代码段引擎针对每种文件类型使用一个文件,并将所有代码段放入其中;
  • 模板文件可以由用户或在特定项目的上下文中覆盖;
  • 可以为INSERT模式定义特定于文件类型的代码段(它们可以被继承,例如可以从C ++,Java等使用C代码段),匹配代码段的列表将显示每个代码段的提示;
  • 可以插入计算的VimL表达式;
  • VimL指令可以在扩展期间执行-我使用它自动添加缺少的include或import语句;
  • 模板文件可以以类似函数的方式包含其他模板文件(甚至支持参数)-AFAIK,很少有摘录引擎实现此功能,它们甚至不支持摘录别名,这由于实现起来很简单这项特征 ;
  • 与我的占位符系统完全集成;
  • 支持重新缩进(如果需要)和Python缩进;
  • vim折叠效果很好;
  • 国际友好;
  • 当多个代码段匹配时,将弹出一个高级完成菜单(它受YouCompleteMe弹出菜单的启发);
  • 样式选项将自动应用(你如何喜欢你的括号?if (...) {\n}if (...)\n{\n}别的东西?),当然,它们可以被罚款根据当前的项目,或者当前的文件类型,甚至都调整;
  • 插件为100%VimL。不过,可以从模板文件中使用Python。
  • mu-template依赖于两个库插件(lh-vim-lib和lh-dev)以及我的占位符系统(lh-brackets)-这就是为什么我建议与VAM或VimFlavor一起安装,因为我提供了声明文件依赖;
  • 该许可证与代码生成兼容-这意味着虽然mu-template代码在GPLv3下,但代码段不在,您可以在专有代码中使用它们:某些代码段在Boost Software License下;

  • 扩展在加载任何存在的本地vimrc之后发生-为了在扩展完成之前设置项目特定的变量。

  • 多亏了Tom Link的StakeHolders插件,µTemplate确实绑定了占位符(修改一个命名占位符会修改其他具有相同名称的占位符)。不安装利益相关者不会阻止您使用µTemplate。

老实说,模板语法有点麻烦,并且占位符系统属于第一代占位符-mu-template是Vim最古老的模板/代码片段引擎之一。

但是,它允许片段包含(可能有条件或不能被覆盖的)其他片段(有条件且具有参数)的事实非常重要。典型的应用是

  • C ++文件模板

    1. 其中包括一个文件头(通常对每个项目进行微调,以包括正确的版权声明)
    2. 然后加载最适合当前文件类型(.h,.cpp或单元测试文件)的模板
      • 在头文件的情况下,将包含防重新包含保护措施-可以重写它们的计算方式(再次遵循项目策略)
      • 在.cpp文件的情况下,如果找到匹配的.h文件,则会自动包含
  • 我在lh-cpp中有一个通用的代码段/向导。以及使用该通用类模板但具有不同参数的几种专用类


感谢您的回答!我有一个问题:您说All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it 这种体系结构与通常的体系结构(即按文件类型一个文件)相比有什么优势?
statox

@statox我想说的是,这是一个摘要维护问题。一些片段过于复杂。以lh-cpp internals/class-skeleton为例。我宁愿不要将其与控制语句片段混合在一起。但是我必须承认,将所有控制语句放在一起不会有问题。此外,借助这种方法,我可以非常轻松地覆盖我的代码片段,实时更新它们,将它们用作功能,等等
Luc Hermitte

确实,当我看到您的链接时,我可以理解为什么某些片段更好地存在于自己的文件中。感谢您的澄清。
statox

1
@statox实际上,我编写的许多代码片段通常都很复杂:它们检测,推断并尝试执行尽可能多的智能操作。大多数时候,我会将代码移至自动加载的函数,但有时,使用几个相互调用的代码更有意义(并充当可以根据项目需求进行调整的变体点->版权声明,...)
卢克·赫米特(Luc Hermitte)2016年

4

SnipMate和UltiSnips是Vim上两个最受欢迎的代码片段引擎。两者均受TextMate的代码段语法的启发。UltiSnips可以运行所有SnipMate片段,但还具有其他语法以使其功能更强大。

一个好的经验法则是,如果您的Vim具有python支持,请使用UltiSnips。如果不是,则使用SnipMate。

在我的.vimrc插件中,我根据python的可用性加载(使用Plug)这两个插件。

if (has('python') || has('python3'))
    Plug 'SirVer/ultisnips'
else
    Plug 'garbas/vim-snipmate'
    Plug 'MarcWeber/vim-addon-mw-utils' "required for snipmate
    Plug 'tomtom/tlib_vim' "required for snipmate
endif

UltiSnips还可以在其代码段中运行python代码,从而使其可以执行一些很酷的技巧。这是我最喜欢的片段之一,它在文本周围画了一个框(摘自我如何使用LaTeX和Vim在数学讲座中做笔记| Gilles Castel

snippet box2 "Box"
`!p snip.rv = '┌' + '─' * (len(t[1]) + 2) + '┐'`
│ $1 │
`!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'`
$0
endsnippet

使用此代码段,我可以输出如下内容:

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.