有很多用于vim的代码片段插件:ultisnips,snipmate,xptemplate,neosnippet等。

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

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

这里有一个清单,可能是一个不错的开始,但是一些完整,清晰和精确的答案(我们的社区可以编写)将非常有用。

评论

您也可以在Marc Weber Wiki上获得此矩阵:vim-wiki.mawercer.de/wiki/topic/…

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

您应该使用此处的信息更新Wiki。谢谢。

@ChristianBrabandt:是的,请等一下(接下来的几天),我将对其进行更新。

首先,我感谢这种问题!似乎曾经是SE政策,对这样的问题不屑一顾,认为这是“过于开放”或“引发自以为是的辩论”,但还有哪些人可以如何获得更多有经验的用户的见识并建立自己的工作流程技能呢?

#1 楼

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

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


即使有大量代码片段,也可以快速实现。
定义新代码片段的基本语法很容易理解,因此
很容易快速创建新代码片段来完成您想做的事情。 (要获取更多
复杂的摘要,可能需要做一些额外的工作。)
开箱即用,效果很好;基本配置可让您快速使用
片段。
它确实是可配置的。即使基本配置运行良好,
如果您是高级用户,也可以对其进行非常精确的调整。


首先,ultisnips是一个片段引擎,这意味着该插件提供了
功能,可使用摘要,但本身未提供摘要。要获得
片段,作者建议使用
vim片段。

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

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

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

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

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

对于高级用户,Ultisnips还提供了一些功能来自定义扩展行为
,或以其他方式触发它。请参阅:h UltiSnips-trigger-functions


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

最后是一系列的电视广播,它们很好地介绍了
插件:


第1集:什么是代码片段,我是否需要它们?

评论


您是否知道如何制作它,以使其在触发时不会扩展,除非它以空格或a>开头(例如在HTML的大括号中。事实上,它不知道它在标签的末尾很烦人,因为如果我启用该选项,然后它使它扩展,即使它位于单词中间,也无法扩展。

–高个子
18年7月2日在15:10

#2 楼

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


它没有外部依赖性。
它使用非常简单的语法。
它设置非常简单。
自2009年起就被废弃了。

我没什么好抱怨的。

评论


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

–muru
16-4-22在23:43

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

– romainl
16年4月23日在9:10

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

–user859
16年4月26日在16:30

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

–statox♦
16 Jun 14'在8:08



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

–chb
18年8月14日在2:14



#3 楼

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


打开新缓冲区时,模板文件可以自动扩展:


(除非从.vimrc),
通过菜单或命令行明确显示,
从INSERT模式以类似代码段的方式;
从VISUAL模式以代码段环绕选择- -可以将环境应用于代码段中的不同区域(例如,while控制语句中的代码或条件区域);


所有代码段均在其自己的模板文件中定义-所有其他代码片段引擎会使用每种文件类型一个文件并将所有代码片段放入其中;
模板文件可以由用户或在特定项目的上下文中覆盖;
可以定义文件类型特定的代码片段对于INSERT模式(可以继承,例如可以从C ++,Java等使用C代码段),将为每个代码段显示匹配代码段的提示;
可以使用VimL计算表达式插入;
VimL指令可以在扩展期间执行-我用它自动添加缺少的include或import语句;
模板文件可以以类似函数的方式包含其他模板文件(甚至支持参数) -AFAIK,很少有摘录引擎实现此功能,它们甚至不支持摘录别名,这要归功于此功能,这是微不足道的;
与我的占位符系统完全集成;
支持re -indentation(如果需要)和Python缩进;弹出菜单);
样式选项会自动应用(如何选择括号? 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 Tom的StakeHolders插件,µTemplate确实绑定了占位符(修改一个命名占位符会修改其他具有相同名称的占位符)。不安装利益相关者不会阻止您使用µTemplate。

老实说,模板语法有点麻烦,并且占位符系统属于第一代占位符-mu-template是

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



C ++文件模板


,其中包括文件头(通常对每个项目按顺序进行微调)包括正确的版权声明)
,然后加载最适合当前文件类型(.h,.cpp或单元测试文件)的模板。

头文件大小写,反-reinclusion防护将被包括-在.cpp文件的情况下,它们的计算方式可能会被覆盖(再次遵循项目策略)
,如果找到匹配的.h文件,则会自动包含



我在lh-cpp中有一个通用的代码段/向导。还有几种使用此通用类模板但具有不同参数的专用类。


评论


感谢您的回答!我有一个问题:您说过所有代码段都在自己的模板文件中定义-所有其他代码段引擎每种文件类型都使用一个文件,并将所有代码段放入其中,与通常的代码段(即一个文件)相比,该体系结构的优势是什么按文件类型)?

–statox♦
16年6月14日在7:51

@statox我想说的是,这是一个摘要维护问题。一些片段过于复杂。例如,看一下lh-cpp internals / class-skeleton。我宁愿不要将其与控制语句片段混合在一起。但是我必须承认,将所有控制语句放在一起不会有什么问题。此外,由于采用了这种方法,我可以轻松地覆盖我的代码片段,即时更新它们,将它们用作函数,等等。

–卢克·赫米特(Luc Hermitte)
16 Jun 14'7:57



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

–statox♦
16 Jun 14'在8:11



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

–卢克·赫米特(Luc Hermitte)
16 Jun 14'在8:19



#4 楼

SnipMate和UltiSnips是Vim上两个最受欢迎的代码片段引擎。两者均受TextMate的代码段语法的启发。 UltiSnips可以运行所有SnipMate片段,但还具有使其更强大的附加语法。
一个好的经验法则是,如果您的Vim支持python,请使用UltiSnips。如果不是,请使用SnipMate。
UltiSnips在2019年11月5日放弃了对python2的支持,请参阅删除对Python2#1129的支持。
在您的.vimrc中,根据python加载(使用Plug)插件之一。可用性。
if has('python3')
    Plug 'SirVer/ultisnips'
elseif has('python')
    Plug 'SirVer/ultisnips', {
        \   'tag': '3.2',
        \   'dir': get(g:, 'plug_home', '~/.vim/plugged') . '/ultisnips_py2',
        \ }
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) + '┐'`
│  │
`!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'`
┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
endsnippet

有了这个片段,我可以输出如下内容:
q4312078q