题
我最近开始使用 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
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.