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

时间:2010-06-24 17:44:32

标签: vim abbreviation

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

:iab FF for ( int i = 0 ; i < n ; i++ )

但是有没有办法在参数中使用它?像C的#defines,所以如果我写

FF(e, 10)

变成:

for ( int e = 0 ; e < 10 ; e++ )

4 个答案:

答案 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-tabc-d重新映射到c-atab的有用的有用更改,以防您不想失去{{~/.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已在当前范围内使用),并在文本中使用结果你会扩大。