
很多现代 IDE 都有自动补全配对括号的功能,比如输入了左括号“(”,IDE就自动在后面添加一个对应的右括号“)”,并且将光标移到括号中间。VIM 虽然没有直接提供这个功能,但要实现其实非常简单,只要在你的.vimrc 文件中添加下面的内容就可以了:
1 ' 插入匹配括号
2 inoremap ( ()
3 inoremap [ []
4 inoremap { {}
原理很简单,就是将左括号的键映射为一个新的操作,在输入左括号时,让 VIM立刻输入右括号,同时再将光标左移一格到括号中间。
除了括号的自动补全,有时我们也需要括号的自动删除。自动补全比如在输入了左括号后突然发现输错了,本来只需要简单地按一下退格键,将刚才输入的左括号删除就行了,但现在 VIM 自动加了一个右括号,退格键只能删除左括号,这个自动加上右括号还得按一下 DELETE键才能删掉。
所以,我们还需要一个功能,如果按退格键删除了左括号,那么也要自动地把对应的右括号删除。这个操作使用简单的键盘映射就有点难度了,需要借助函数,如下:
01 ' 按退格键时判断当前光标前一个字符,如果是左括号,则删除对应的右括号以及括号中间的内容
02 function! RemovePairs()
03 let s:line = getline('.')
04 let s:previous_char = s:line[col('.')-1] ' 取得当前光标前一个字符
05
06 if index(['(', '[', '{'], s:previous_char) != -1
07 execute 'normal! v%xi'
08 else
09 execute 'normal! a\'
10 end
11 endfunc
tion
12 ' 用退格键删除一个左括号时同时删除对应的右括号
13 inoremap :call RemovePairs()a
注:上面这段后来被 weakdancer 指出了一些问题,经过考虑及测试之后,我把它改写为这样了:
01 ' 按退格键时判断当前光标前一个字符,如果是左括号,则删除对应的右括号以及括号中间的内容
02 function! RemovePairs()
03 let l:line = getline('.')
04 let l:previous_char = l:line[col('.')-1] ' 取得当前光标前一个字符
05
06 if index(['(', '[', '{'], l:previous_char) != -1
07 let l:original_pos = getpos('.')
08 execute 'normal %'
09 let l:new_pos = getpos('.')
10
11 ' 如果没有匹配的右括号
12 if l:original_pos == l:new_pos
13 execute 'normal! a\'
14 return
15 end
16
17 let l:line2 = getline('.')
18 if len(l:line2) == col('.')
19 ' 如果右括号是当前行最后一个字符
20 execute 'normal! v%xa'
21 else
22 ' 如果右括号不是当前行最后一个字符
23 execute 'normal! v%xi'

24 end
25
26 else
27 execute 'normal! a\'
28 end
29 endfunction
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23051-1.html
直接问问他
公关了