先放来源 http://oldj.net/article/vim-parenthesis/

很多现代 IDE 都有自动补全配对括号的功能,比如输入了左括号“(”,IDE 就自动在后面添加一个对应的右括号“)”,并且将光标移到括号中间。VIM 虽然没有直接提供这个功能,但要实现其实非常简单,只要在你的 .vimrc 文件中添加下面的内容就可以了:

 
1
2
3
4
" 插入匹配括号
inoremap ( ()<LEFT>
inoremap [ []<LEFT>
inoremap { {}<LEFT>

原理很简单,就是将左括号的键映射为一个新的操作,在输入左括号时,让 VIM 立刻输入右括号,同时再将光标左移一格到括号中间。

除了括号的自动补全,有时我们也需要括号的自动删除。比如在输入了左括号后突然发现输错了,本来只需要简单地按一下退格键,将刚才输入的左括号删除就行了,但现在 VIM 自动加了一个右括号,退格键只能删除左括号,这个自动加上右括号还得按一下 DELETE 键才能删掉。

所以,我们还需要一个功能,如果按退格键删除了左括号,那么也要自动地把对应的右括号删除。这个操作使用简单的键盘映射就有点难度了,需要借助函数,如下:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
" 按退格键时判断当前光标前一个字符,如果是左括号,则删除对应的右括号以及括号中间的内容
function! RemovePairs()
let s:line = getline(".")
let s:previous_char = s:line[col(".")-1] " 取得当前光标前一个字符
 
if index(["(", "[", "{"], s:previous_char) != -1
execute "normal! v%xi"
else
execute "normal! a\<BS>"
end
endfunction
" 用退格键删除一个左括号时同时删除对应的右括号
inoremap <BS> <ESC>:call RemovePairs()<CR>a

注:上面这段后来被 weakdancer 指出了一些问题,经过考虑及测试之后,我把它改写为这样了:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
" 按退格键时判断当前光标前一个字符,如果是左括号,则删除对应的右括号以及括号中间的内容
function! RemovePairs()
let l:line = getline(".")
let l:previous_char = l:line[col(".")-1] " 取得当前光标前一个字符
 
if index(["(", "[", "{"], l:previous_char) != -1
let l:original_pos = getpos(".")
execute "normal %"
let l:new_pos = getpos(".")
 
" 如果没有匹配的右括号
if l:original_pos == l:new_pos
execute "normal! a\<BS>"
return
end
 
let l:line2 = getline(".")
if len(l:line2) == col(".")
" 如果右括号是当前行最后一个字符
execute "normal! v%xa"
else
" 如果右括号不是当前行最后一个字符
execute "normal! v%xi"
end
 
else
execute "normal! a\<BS>"
end
endfunction
" 用退格键删除一个左括号时同时删除对应的右括号
inoremap <BS> <ESC>:call RemovePairs()<CR>a

这样就比较完美了。不过在非括号时其实还有个小问题(比如“<行首>a<光标>bcde”这样的情况下,按了退格键后,“a”虽然被删除了,但光标不是移到行首,而是移到 b 的后面),但应该不会对使用造成太大影响。

另外,在自动补全了右括号之后,如果用户再输入右括号会怎么样呢?一般来说,比较合理的做法似乎是忽略掉这个后输入的多余的右括号,直接将光标向右移到一格。代码如下:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
" 输入一个字符时,如果下一个字符也是括号,则删除它,避免出现重复字符
function! RemoveNextDoubleChar(char)
let l:line = getline(".")
let l:next_char = l:line[col(".")] " 取得当前光标后一个字符
 
if a:char == l:next_char
execute "normal! l"
else
execute "normal! i" . a:char . ""
end
endfunction
inoremap ) <ESC>:call RemoveNextDoubleChar(')')<CR>a
inoremap ] <ESC>:call RemoveNextDoubleChar(']')<CR>a
inoremap } <ESC>:call RemoveNextDoubleChar('}')<CR>a

这样,在 VIM 中输入或删除括号就方便多了!

VIM中括号的自动补全与删除的更多相关文章

  1. linux-python在vim下的自动补全功能

    linux-python在vim下的自动补全功能 安装配置: wget https://github.com/rkulla/pydiction/archive/master.zipunzip -q m ...

  2. vim 添加php自动补全 并格式化代码

    自动补全,修改/etc/vimrc的配置 vim /etc/vimrc 添加: filetype plugin on autocmd FileType php set omnifunc=phpcomp ...

  3. linux下vim python代码自动补全

    一.vim python自动补全插件:pydiction 可以实现下面python代码的自动补全: 1.简单python关键词补全 2.python 函数补全带括号 3.python 模块补全 4.p ...

  4. [转] vim配置python自动补全

    vim python自动补全插件:pydiction 可以实现下面python代码的自动补全: 1.简单python关键词补全 2.python 函数补全带括号 3.python 模块补全 4.pyt ...

  5. VIM中使用tab键自动完成(vim tab键自动补全 )插件supertab

    supertab.vmb 这个插件好好用, Tab自动补全 http://www.vim.org/scripts/script.php?script_id=1643 安装步骤: 1.下载 supert ...

  6. Vim设置括号自动补全和快速跳出

    一.设置括号自动补全 inoremap ' ''<ESC>i inoremap " ""<ESC>i inoremap ( ()<ESC&g ...

  7. ubuntu 14.04 vim YoucompleteMe 代码自动补全工具安装

    安装步骤如下: sudo apt-get install vim ; sudo apt-get install vim-youcompleteme ; sudo apt-get install vim ...

  8. 学会了vim中的自动补全功能

    好开心,再也不用再多个工具之间切换了,哈哈 擦,功能太弱

  9. vim出现自动补全的问题

    当使用vim编辑文件自动补全文件名称的时候,可能会出现_arguments:451: _vim_files: function definition file not found的错误,这个时候一般都 ...

随机推荐

  1. JDK介绍

    Java的版本最开始是1995年的JDK Alpha and Beta版本,第二年发布JDK1.0版本之后就是JDK1.1,JDK1.2.到1998年,不再叫JDK了,而是叫J2SE,但是版本号还是继 ...

  2. JavaScript 原型和引用趣点

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  3. SQL SERVER 2000 如何提高大数据筛选GROUP BY 的效率

    数据库有83W条记录,本想计算20180101之后的每天赔付情况,故写了以下SQL语句: SELECT 起保时间,sum(赔付金额) as 日赔付 FROM maindata WHERE 起保时间&g ...

  4. Go中的main函数和init函数

    Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main).这两个函数在定义时不能有任何的参数和返回值.虽然一个package里面可以 ...

  5. c# md5加密封装

    /// <summary> /// md5加密字符串 /// </summary> /// <param name="str">需要加密的字符串 ...

  6. Windows上架设自己的ssh代理 — copSSH

    最近网上对ssh代理讨论的比较多, 主要是为了穿墙. 其实在自己的电脑上也可以架设ssh代理, 当然国内自己架的不具有FQ功能, 如果你有国外朋友或是远程win服务器…则可以用此方法架设私有代理. 其 ...

  7. Django的Error汇总

    title: Django学习笔记 catalog: true subtitle: 11. Django_Error汇总 date: 2018-12-14 10:17:28 --- Django的Er ...

  8. PAT_A1108#Finding Average

    Source: PAT A 1108 Finding Average (20 分) Description: The basic task is simple: given N real number ...

  9. apicloud iphoneX底部虚拟键盘遮挡

    1.首先,底部的高不能写死. 2. var footer = $api.byId('footer'); $api.fixTabBar(footer);这句应该写在 footerHeight = $ap ...

  10. C#那20道题

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...