vim 括号补全小技巧
这两天工作老跟括号打交道。
一般我们见到的 vim 括号补全都类似这样:
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endf
inoremap ( ()<ESC>i
inoremap ) <c-r>=ClosePair(')')<CR>
很粗暴,任何时候都补全。但其实还是有很多时候我们是不想补全的,比如想把:
a + b / 2
改成:
(a + b) / 2
补全之后还得 delete 。
稍加统计发现,需要补全的基本上是两种场景,一是光标在行末,二是光标下一个字符是空格。
于是我给改成这样:
function! AutoPair(open, close)
let line = getline('.')
if col('.') > strlen(line) || line[col('.') - 1] == ' '
return a:open.a:close."\<ESC>i"
else
return a:open
endif
endf
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endf
inoremap ( <c-r>=AutoPair('(', ')')<CR>
inoremap ) <c-r>=ClosePair(')')<CR>
舒爽。
一般我们见到的 vim 括号补全都类似这样:
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endf
inoremap ( ()<ESC>i
inoremap ) <c-r>=ClosePair(')')<CR>
很粗暴,任何时候都补全。但其实还是有很多时候我们是不想补全的,比如想把:
a + b / 2
改成:
(a + b) / 2
补全之后还得 delete 。
稍加统计发现,需要补全的基本上是两种场景,一是光标在行末,二是光标下一个字符是空格。
于是我给改成这样:
function! AutoPair(open, close)
let line = getline('.')
if col('.') > strlen(line) || line[col('.') - 1] == ' '
return a:open.a:close."\<ESC>i"
else
return a:open
endif
endf
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endf
inoremap ( <c-r>=AutoPair('(', ')')<CR>
inoremap ) <c-r>=ClosePair(')')<CR>
舒爽。