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

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

所以,举例来说,如果我输入 def{TAB} (:imap def{TAB} def ():<ESC>3ha),它扩展为:

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

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

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

快速浏览后 片段鸸鹋, ,它看起来是最好的选择,而且比我最初想象的更容易定制。

继续前面的示例:

:Snippet def <{}>():

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

有帮助吗?

解决方案

片段鸸鹋 是一个有用的片段插件。

其他提示

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}

作为使用 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) 当然也是一个完美的解决方案,但了解替代方案是件好事(特别是当它们是内置的时)。

如果 SnippetsEmu 太重或太雄心勃勃,无法满足您的需求(对我来说),我编写了一个根据文件类型管理片段的插件。当选择片段时,它甚至具有制表符补全功能!:)

在这里获取: 片段.vim

我刚刚安装 多功能剪. 。有一篇很好的文章解释了为什么您可能选择 UltiSnips: 为什么选择 UltiSnips?

我没有使用过任何其他片段插件;我决定冒险尝试一款看起来功能齐全的产品,并且能够在我获得更多 Vim 技能并想做更复杂的事情时满足我的需要。

正如 MDCore 指出的那样, 片段鸸鹋 是一个流行的 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.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top