在Vim中,你可以这样做,所以每次你在插入模式下写“FF”改变一些代码使用:
:iab FF for ( int i = 0 ; i < n ; i++ )
但是有没有办法在参数中使用它?像C的#defines,所以如果我写
FF(e, 10)
变成:
for ( int e = 0 ; e < 10 ; e++ )
答案 0 :(得分:7)
看看SnipMate(vim插件)。你不会得到参数,但是在扩展缩写时,它允许你通过可修改的区域进行制表。在for
示例中,您首先会被带到i
,可以将其编辑为e
,并且会在e
的所有区域将其更改为for
for (i = 0; i < count; i++) {
}
声明。然后只需标记到您想要更改的下一个区域。
来自文档:
snipMate.vim旨在成为一个不引人注目,简洁的vim脚本,它在Vim中实现了TextMate的一些片段功能。代码段是一段经常输入的文本,您可以使用后跟a的触发词插入到文档中。
例如,在使用默认安装的snipMate.vim的C文件中,如果在插入模式下键入“for”,它将在C中扩展典型的for循环:
tab
要转到循环中的下一个项目,只需转到它;如果有重复的代码,例如本例中的“i”变量,只要突出显示并且代码段中指定的所有匹配项都将更新,您就可以简单地开始输入。
以下是将s-tab
和c-d
重新映射到c-a
和tab
的有用的有用更改,以防您不想失去{{~/.vim/after/plugin/snipMate.vim
的功能1}}(在"""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>
中):
{{1}}
答案 1 :(得分:2)
您可以在缩写中包含函数定义,但它们不能接受参数。这是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>
我猜你可以解析函数中的缩写表达式,但我不确定你是否也可以在缩写中包含括号等字符。也许here会给你一个想法。
编辑:您可以随时执行以下操作:
:iab for() for(int i = 0; i < ; i++)<C-o>T<
当然缺少自动填充的参数,但让你立即开始输入。
答案 2 :(得分:1)
对我有用:
iab FF <c-o>:FF
com -nargs=* FF call s:FF(<f-args>)
fu s:FF(i, n)
let t = "for (int a = 0; a < b; ++a) {\e"
let t1 = substitute(t, 'a', a:i, 'g')
exe 'normal! A'.substitute(t1, 'b', a:x, 'g')
exe "normal o\<space>\<BS>\e"
endf
在插入模式FF e 10<cr>
下将为for (int e = 0; e < 10; ++e) {<cr>
。
答案 3 :(得分:0)
mu-template支持互动模板。有了它,您可以向用户询问某些内容,或者重用任何变量,对其应用计算(如果您检测到i
已在当前范围内使用),并在文本中使用结果你会扩大。