如何在Vim中创建简短的片段?

时间:2008-08-18 22:41:11

标签: vim

我最近开始使用Vim作为我的文本编辑器,目前正在进行自己的自定义。

我认为键盘映射几乎可以做任何事情,但暂时我几乎只使用它们作为一种片段设施。

因此,例如,如果我输入def{TAB}:imap def{TAB} def ():<ESC>3ha),它会扩展为:

def |(): # '|' represents the caret

这可以按预期工作,但是当我输入一个包含“def”的单词并且我对扩展它不感兴趣时​​Vim等待完整命令时,我觉得很烦人。

  • 有没有办法避免这种情况或为此更有效地使用此功能?
  • 其他任何Vim功能是否更适合这个?

快速查看SnippetsEmu后,它看起来是最好的选择,比我原先想象的更容易定制。

继续上一个例子:

:Snippet def <{}>():

定义完毕后,您可以通过输入def{TAB}来扩展您的代码段。

6 个答案:

答案 0 :(得分:35)

Snipmate - 喜欢texmate :) http://www.vim.org/scripts/script.php?script_id=2540

视频: http://vimeo.com/3535418

snippet def 
     """ ${1:docstring} """
     def ${2:name}:
         return ${3:value}

答案 1 :(得分:11)

使用vim内置功能的另一个建议(尽管略有不同):

:iabbrev def def(): #<LEFT><LEFT><LEFT><LEFT><LEFT>

现在,无论何时键入def后跟空格或其他非单词字符,它都将扩展为与您作为SnippetsEmu的输出所给出的相同(该空间来自您输入的空间以触发完成) 。

这种方法不会遇到您使用的“滞后”问题:inoremap,并且内置于vim中。有关此功能的更多信息,请查看:help abbrev

你可能担心被空格而不是标签触发它会不必要地触发,但一般来说vim对何时触发它非常聪明。通过仅为某些文件类型(例如,python)启用缩写,可以进一步减轻该问题:

au filetype python :iabbrev ... etc

Snip [ets](经理| Emu | Mate | .vim)当然也是一个完美的解决方案,但很高兴知道其他选择(特别是当它们内置时)。

答案 2 :(得分:6)

如果SnippetsEmu过于繁重或雄心勃勃,无法满足您的需求(这对我而言),我编写了一个基于文件类型管理片段的插件。选择片段时,它甚至可以完成标签! :)

在此处获取:snippets.vim

答案 3 :(得分:5)

SnippetsEmu是一个有用的代码段插件。

答案 4 :(得分:5)

我刚刚安装了UltiSnips。有一篇很好的文章解释了为什么你可以选择UltiSnips:Why UltiSnips?

我没有使用任何其他代码段插件;我决定采用一种看起来功能齐全的功能,并能够容纳我,因为我获得了更多的Vim技能,并希望做更复杂的事情。

答案 5 :(得分:4)

正如MDCore所指出的那样,SnippetsEmu是一个流行的Vim脚本,可以做到这一点以及更多。如果只需要扩展(不需要移回插入符号),则可以使用标准:ab[breviate]命令。

:ab[breviate] [<expr>] {lhs} {rhs}
        add abbreviation for {lhs} to {rhs}.  If {lhs} already
        existed it is replaced with the new {rhs}.  {rhs} may
        contain spaces.
        See |:map-<expr>| for the optional <expr> argument.