如何在多行Vim缩写中使用Eatchar

时间:2012-08-09 05:11:54

标签: vim

我想在Vim中触发多行缩写,而不输入'trigger'字符,并且光标在特定位置以插入模式结束。

我快到了,但是没能成功。

到目前为止,我已将以下内容添加到我的_vimrc:

" eat characters after abbreviation
function! Eatchar(pat)
    let c = nr2char(getchar(0))
    return (c =~ a:pat) ? '' : c
endfunction
iabbr <silent> if if ()<left><C-R>=Eatchar('\s')<CR>

:iabbr <silent> rfF <- function( )<CR>{<CR>  <CR>}<Esc>3k$h<Insert><c-r>=Eatchar('\m\s<bar>/')<cr> 

这主要是成功的,因为当我输入rfF Ctr-]来触发缩写的扩展时会产生以下结果:

<- function(  )
{

}

然而,结果取决于我如何触发缩写。

如果我用<space>触发,括号之间的空格会扩展:

<- function(  )
{

}

...如果我<CR>

<- function( 
 )
{

}  

我最近问过,并且answered提出了一个关于防止在单行情况下添加触发缩写的字符的问题。

这可以用多行缩写吗?

1 个答案:

答案 0 :(得分:1)

这就是我想出来的。

" eat characters after abbreviation
function! Eatchar(pat)
    let c = nr2char(getchar(0))
    return (c =~ a:pat) ? '' : c
endfunction

inoreabbr <silent> rfF <- function()<cr>{<cr>}<esc>2k$i<c-r>=Eatchar('\m\s\<bar>\r')<cr> 

此命令m\s\<bar>\r中的正则表达式将占用任何空格或返回字符。我还删除了{}之间的额外空格,因为我想在更新函数参数列表后,您将退出到正常模式,然后使用j跳转一行然后执行o在功能块内打开一个新行。