VIM中括号和引号自动补全和删除
经过一整天的努力,vimrc总算可以正常的工作了(至少看起来是这样,如果发现问题,欢迎指正)。其他帖子基本上只是给出了自动补全括号的vimrc代码,而删除的却很少。这里分享一下我的自动补全的代码(主要参考其他网友给出的方法),其中包括一种括号删除的方法,在vim i模式下不影响BackSpace正常功能的前提下添加在删除几种常见的括号或引号时自动删除紧随其后的与之相匹配的反括号或引号的功能。
" 仅对指定文件格式设置自动补全功能
autocmd FileType c,cpp,sh,java,html,js,css,py exec AutoComplete()
func! AutoComplete()
"相关映射
:inoremap ( ()<Left>
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {}<Left>
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<Left>
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " <c-r>=DQuote()<CR>
:inoremap ' <c-r>=SQuote()<CR>
" 将BackSpace键映射为RemovePairs函数
:inoremap <BS> <c-r>=RemovePairs()<CR>
" 将回车键映射为BracketIndent函数
:inoremap <CR> <c-r>=BracketIndent()<CR>
endfunc
func! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endfunc
"自动补全双引号
func! DQuote()
if getline('.')[col('.') - 1] == '"'
return "\<Right>"
else
if getline('.')[col('.') - 2] == '"'
return '"'
else
return "\"\"\<Left>"
endif
endfunc
"自动补全单引号
func! SQuote()
if getline('.')[col('.') - 1] == "'"
return "\<Right>"
else
if getline('.')[col('.') - 2] == "'"
return "'"
else
return "''\<Left>"
endif
endfunc
" 按BackSpace键时判断当前字符和前一字符是否为括号对或一对引号,如果是则两者均删除,并保留BackSpace正常功能
func! RemovePairs()
let l:line = getline(".") " 取得当前行
let l:current_char = l:line[col(".")-1] " 取得当前光标字符
let l:previous_char = l:line[col(".")-2] " 取得光标前一个字符
if (l:previous_char == '"' || l:previous_char == "'") && l:previous_char == l:current_char
return "\<delete>\<bs>"
elseif index(["(", "[", "{"], l:previous_char) != -1
" 将光标定位到前括号上并取得它的索引值
execute "normal! h"
let l:front_col = col(".")
" 将光标定位到后括号上并取得它的行和索引值
execute "normal! %"
let l:line1 = getline(".")
let l:back_col = col(".")
" 将光标重新定位到前括号上
execute "normal! %"
" 当行相同且后括号的索引比前括号大1则匹配成功
if l:line1 == l:line && l:back_col == l:front_col + 1
return "\<right>\<delete>\<bs>"
else
return "\<right>\<bs>"
end
else
return "\<bs>"
end
endfunc
" 在大括号内换行时进行缩进
func! BracketIndent()
let l:line = getline(".")
let l:current_char = l:line[col(".")-1]
let l:previous_char = l:line[col(".")-2]
if l:previous_char == "{" && l:current_char == "}"
return "\<cr>\<esc>\ko"
else
return "\<cr>"
end
endfunc