如何在Vim中使用带参数的缩写?

Mar*_*man 3 vim abbreviation

在Vim中,你可以这样做,所以每次你在插入模式上写"FF"改变一些代码使用:

:iab FF for ( int i = 0 ; i < n ; i++ )
Run Code Online (Sandbox Code Playgroud)

但有没有办法用这个参数?有点像C的#defines,所以如果我写的话

FF(e, 10)
Run Code Online (Sandbox Code Playgroud)

它成为了:

for ( int e = 0 ; e < 10 ; e++ )
Run Code Online (Sandbox Code Playgroud)

nea*_*ith 7

看看SnipMate(一个vim插件).你不会得到参数,但是在扩展缩写时,它允许你通过可修改的区域进行制表.在该for示例中,您将被带到第i一个,可以将其编辑为e,并且它将efor声明的所有区域中将其更改为.然后只需选择要更改的下一个区域.

来自文档:

snipMate.vim旨在成为一个不引人注目,简洁的vim脚本,在Vim中实现TextMate的一些片段功能.代码段是一段经常输入的文本,您可以使用触发词后跟a来插入文档.

例如,在使用默认安装的snipMate.vim的C文件中,如果在插入模式下键入"for",它将在C中扩展典型的for循环:

for (i = 0; i < count; i++) {

}
Run Code Online (Sandbox Code Playgroud)

要转到循环中的下一个项目,只需转到它; 如果有重复的代码,例如本例中的"i"变量,只要突出显示并且代码段中指定的所有匹配项都将更新,您就可以简单地开始输入.

以下是重新映射一个很好的有益的变化tab,并s-tabc-dc-a,如果你不想失去的功能tab(中~/.vim/after/plugin/snipMate.vim):

"""ino <silent> <tab> <c-r>=TriggerSnippet()<cr>
"""snor <silent> <tab> <esc>i<right><c-r>=TriggerSnippet()<cr>
"""ino <silent> <s-tab> <c-r>=BackwardsSnippet()<cr>
"""snor <silent> <s-tab> <esc>i<right><c-r>=BackwardsSnippet()<cr>
"""ino <silent> <c-r><tab> <c-r>=ShowAvailableSnips()<cr>
ino <silent> <c-d> <c-r>=TriggerSnippet()<cr>
snor <silent> <c-d> <esc>i<right><c-r>=TriggerSnippet()<cr>
ino <silent> <c-a> <c-r>=BackwardsSnippet()<cr>
snor <silent> <c-a> <esc>i<right><c-r>=BackwardsSnippet()<cr>
ino <silent> <c-r><tab> <c-r>=ShowAvailableSnips()<cr>
Run Code Online (Sandbox Code Playgroud)


kpr*_*bst 5

您可以在缩写中包含函数定义,但它们不能带参数。这是 vimdocs 中的一个示例:

func Eatchar(pat)
   let c = nr2char(getchar(0))
   return (c =~ a:pat) ? '' : c
endfunc
iabbr <silent> if if ()<Left><C-R>=Eatchar('\s')<CR>
Run Code Online (Sandbox Code Playgroud)

我想您也许可以解析函数中的缩写表达式,但我不确定您是否还可以在缩写中包含括号等字符。也许这里的一些东西会给你一个想法。

编辑:你总是可以做这样的事情:

:iab for() for(int i = 0; i < ; i++)<C-o>T<
Run Code Online (Sandbox Code Playgroud)

当然,它缺少参数自动完成功能,但可以让您立即开始输入。