29

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

我想键盘映射几乎可以做任何事情,但目前我几乎完全将它们用作一种片段工具。

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

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

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

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

在快速浏览了SnippetsEmu之后,它看起来是最好的选择,而且比我最初想象的更容易定制。

继续前面的示例:

:Snippet def <{}>():

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

4

6 回答 6

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}
于 2009-05-18T20:18:37.960 回答
14

作为使用 vim 内置功能的另一个建议(虽然略有不同):

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

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

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

您可能会担心被空格而不是制表符触发它会不必要地触发,但一般来说,vim 非常聪明地知道何时触发它。通过仅为某些文件类型(例如,python)启用缩写,可以额外缓解该问题:

au filetype python :iabbrev ... etc

Snip[ets] (Manager|Emu|Mate|.vim) 当然也是一个完美的解决方案,但很高兴了解替代方案(尤其是当它们内置时)。

于 2012-10-30T05:21:22.240 回答
6

如果 SnippetsEmu 对于您需要的东西太重或太雄心勃勃(对我来说),我写了一个插件来管理基于文件类型的片段。选择片段时,它甚至可以完成制表符!:)

在这里获取:snippets.vim

于 2008-11-01T08:21:41.973 回答
6

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

我没有使用任何其他的片段插件;当我获得更多 Vim 技能并想做更复杂的事情时,我决定尝试使用一款功能齐全且能够适应我的产品。

于 2012-03-29T06:06:49.340 回答
5

SnippetsEmu是一个有用的片段插件。

于 2008-08-19T08:13:01.020 回答
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.
于 2008-08-28T13:48:47.707 回答