现在的位置: 首页 > 电脑技巧 > 正文

VIM: 括号自动补全

2015年12月01日 电脑技巧 ⁄ 共 1575字 ⁄ 字号 VIM: 括号自动补全已关闭评论 ⁄ 阅读 445 次

方案一

先贴代码了,你可以将下面代码直接复制到你的.vimrc文件中,下次重启vim自动加载后就会生效了。

 1 inoremap ( ()<LEFT>
 2 inoremap [ []<LEFT>
 3 inoremap { {}<LEFT>
 4 inoremap " ""<LEFT>
 5 inoremap ' ''<LEFT>
 6 inoremap < <><LEFT>
 7 
 8 function! RemovePairs()
 9     let s:line = getline(".")
10     let s:previous_char = s:line[col(".")-1]
11 
12     if index(["(","[","{"],s:previous_char) != -1
13         let l:original_pos = getpos(".")
14         execute "normal %"
15         let l:new_pos = getpos(".")
16         " only right (
17         if l:original_pos == l:new_pos
18             execute "normal! a\<BS>"
19             return
20         end
21 
22         let l:line2 = getline(".")
23         if len(l:line2) == col(".")
24             execute "normal! v%xa"
25         else
26             execute "normal! v%xi"
27         end
28     else
29         execute "normal! a\<BS>"
30     end
31 endfunction
32 
33 function! RemoveNextDoubleChar(char)
34     let l:line = getline(".")
35     let l:next_char = l:line[col(".")]
36 
37     if a:char == l:next_char
38         execute "normal! l"
39     else
40         execute "normal! i" . a:char . ""
41     end
42 endfunction
43 
44 inoremap <BS> <ESC>:call RemovePairs()<CR>a
45 inoremap ) <ESC>:call RemoveNextDoubleChar(')')<CR>a
46 inoremap ] <ESC>:call RemoveNextDoubleChar(']')<CR>a
47 inoremap } <ESC>:call RemoveNextDoubleChar('}')<CR>a
48 inoremap > <ESC>:call RemoveNextDoubleChar('>')<CR>a

上面代码,分别自定义了insert模式下的{、[、(、<、”、‘自动补全键位映射,之后定义了两个函数,分别用来处理添加自动补全后带来的两个问题:

  1. 删除问题(即之前直接删除右括号就可以,现在还需要后移删除左括号)
  2. 自动补全后人为习惯性的成对输入括号。

第一个问题,通过%来查看括号成对情况,根据括号出现的位置分成三种情况处理。

第二个问题的解决方案是,判断用户输入是否与下一个紧挨着的字符相同,相同则忽略这次输入,否则照常输入即可。

因为双引号、单引号以及大于、小于不支持通过%来查找成对括号,所以也不适用上面两个算法,不过这四个字符上面两个问题对其影响并不明显。

最后分别把这两个函数与删除回退(delete)键位,以及}、]、>、)进行映射。

在v2ex看到问怎么退出补全后的括号,解决方法直接<ESC>la即可。你也可以把它写到映射中,通过F1~F12这样的功能键进行一键处理,个人倾向于肌肉记忆。

1 inoremap <F9> <ESC>la

方案二

这个方案是直接用Snipmate这样的插件,定义括号补全的代码片段,通过tab键操作

1 snippet [
2     [${1}]${2}

上面是方括号的,其它括号类似. 这样做确实比较轻量,直接输入括号也不影响,适合有使用Snipmate的同学.

抱歉!评论已关闭.