在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)
看看SnipMate(一个vim插件).你不会得到参数,但是在扩展缩写时,它允许你通过可修改的区域进行制表.在该for示例中,您将被带到第i一个,可以将其编辑为e,并且它将e在for声明的所有区域中将其更改为.然后只需选择要更改的下一个区域.
来自文档:
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-tab以c-d和c-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)
您可以在缩写中包含函数定义,但它们不能带参数。这是 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)
当然,它缺少参数自动完成功能,但可以让您立即开始输入。