vim有很多片段插件:ultisnips,snipmate,xptemplate,neosnippet等。
它们都有优点和缺点以及或多或少的依赖性。到目前为止,我一直在使用ultisnips,但从未对其完全满意。
由于我们对插件管理器有一个非常有趣且完整的问题,我认为对片段插件进行相同的解释将非常有用。
有一个上市这里可能是一个良好的开端,但一些完整,清晰,precises答案为我们的社会能写会非常有用。
vim有很多片段插件:ultisnips,snipmate,xptemplate,neosnippet等。
它们都有优点和缺点以及或多或少的依赖性。到目前为止,我一直在使用ultisnips,但从未对其完全满意。
由于我们对插件管理器有一个非常有趣且完整的问题,我认为对片段插件进行相同的解释将非常有用。
有一个上市这里可能是一个良好的开端,但一些完整,清晰,precises答案为我们的社会能写会非常有用。
Answers:
我已经使用了ultisnips好几个星期了。
我认为此插件的主要优点如下:
首先,ultisnips是一个代码片段引擎,这意味着该插件提供了使用代码片段的功能,但本身并不提供代码片段。为了获得这些片段,作者推荐使用 vim-snippets。
一旦安装了两个插件,就可以使用您的代码片段。
代码段的定义存储在以以下模式命名的文件中:
ft.snippets
,ft_*.snippets
或ft/*
,其中ft
是当前文档的“文件类型”,并且*
是类似于shell的通配符,可匹配包括空字符串在内的任何字符串。(请注意,cuda.cpp
支持点文件类型的语法,例如。)
这样,仅当设置了缓冲区的文件类型时,才扩展特定于文件类型的代码片段。特殊文件类型all
可用于创建在所有缓冲区上扩展的代码段。
除了vim片段提供的片段外,用户还可以定义自己的片段。我的建议是将它们放置在目录中,
~/.vim/my-snippets/Ultisnips
这样Ultisnips无需额外配置即可找到它们,并且很容易将它们维护在点文件存储库中。
为了扩展代码片段,Ultisnips提供了一个变量g:UltiSnipsExpandTrigger
,该变量定义了将触发扩展的映射(我选择了
**对我来说非常方便)。请注意,应该可以进行集成,但我自己没有对其进行测试。
对于高级用户,Ultisnips还提供一些功能以自定义扩展的行为或以不同方式触发它。看到:h
UltiSnips-trigger-functions
这是我真正广泛使用的第一个代码片段管理器,我认为这是一个很好的开始,因为它具有开箱即用的简单性以及可以调整的可能性。
最后,这里是截屏视频的列表,它们对插件做了很好的介绍:
>
(如HTML的大括号。在标签末尾不知道它的事实令人讨厌,因为如果启用选项i
则使得它如此,即使它在一个字是没有好处的中间它扩展它。
这是mu-template的功能列表。Discl .:我是它的维护者。
while
控制语句中的代码或条件区域);if (...) {\n}
?if (...)\n{\n}
别的东西?),当然,它们可以被罚款根据当前的项目,或者当前的文件类型,甚至都调整;该许可证与代码生成兼容-这意味着虽然mu-template代码在GPLv3下,但代码段不在,您可以在专有代码中使用它们:某些代码段在Boost Software License下;
扩展在加载任何存在的本地vimrc之后发生-为了在扩展完成之前设置项目特定的变量。
多亏了Tom Link的StakeHolders插件,µTemplate确实绑定了占位符(修改一个命名占位符会修改其他具有相同名称的占位符)。不安装利益相关者不会阻止您使用µTemplate。
老实说,模板语法有点麻烦,并且占位符系统属于第一代占位符-mu-template是Vim最古老的模板/代码片段引擎之一。
但是,它允许片段包含(可能有条件或不能被覆盖的)其他片段(有条件且具有参数)的事实非常重要。典型的应用是
C ++文件模板
我在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
这种体系结构与通常的体系结构(即按文件类型一个文件)相比有什么优势?
internals/class-skeleton
为例。我宁愿不要将其与控制语句片段混合在一起。但是我必须承认,将所有控制语句放在一起不会有问题。此外,借助这种方法,我可以非常轻松地覆盖我的代码片段,实时更新它们,将它们用作功能,等等
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! │
└─────────────────────┘