vim自定义指导(一)——自动补齐括号+tap跳出括号

问题描述

使vim写代码时,发现vim没有自动补齐括号和tap键跳出括号的功能,这种基础的功能各个IDE已经部署了,我不允许自己在使用vim时没有这个功能,幸vim有着高度自定义的特性。这里就来简单描述一下实现方案,方案来自博主 Ciruy B.Heimerdinger 以及 lazybios

解决方案

1. 自动补齐括号

  1. 找到vim的配置文件 vimrc 或者 .vimrc 。一般来说,系统配置文件在 /etc/vim/vimrc 。用户配置文件在 ~/.vimrc 。每个人的配置文件位置可能不一样,请自行查看。
# 打开配置文件
vim /etc/vim/vimrc

将下列代码输入到文件的尾部

" 设置括号自动补齐
inoremap ( ()<LEFT>
inoremap [ []<LEFT>
inoremap { {}<LEFT>
inoremap " ""<LEFT>
inoremap ' ''<LEFT>
inoremap < <><LEFT>

2. 删除左括号时同时删除右括号

同样的在配置文件的尾端加入如下代码


" 自动删除括号
function! RemovePairs()
    let s:line = getline(".")
    let s:previous_char = s:line[col(".")-1]

    if index(["(","[","{"],s:previous_char) != -1
        let l:original_pos = getpos(".")
        execute "normal %"
        let l:new_pos = getpos(".")
        " only right (
        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

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 <BS> <ESC>:call RemovePairs()<CR>a
inoremap ) <ESC>:call RemoveNextDoubleChar(')')<CR>a
inoremap ] <ESC>:call RemoveNextDoubleChar(']')<CR>a
inoremap } <ESC>:call RemoveNextDoubleChar('}')<CR>a
inoremap > <ESC>:call RemoveNextDoubleChar('>')<CR>a

3. 剪切板共通

在使用vim时,可能会出现系统剪切板和vim剪切板不互通的问题,这个时候请检查vim的clipboard模块是否安装, 输入
vim --version | grep clipboard

  1. 若已经安装会显示 +clipboard 。此时只需要更改vim的配置文件就可以实现文件互通。在配置文件中输入
    set clipboard=unnamed
    即可实现系统剪贴板和vim剪贴板互通

  2. 若未安装会显示 -clipboard。 此时需要重装vim。使用下面的命令进行vim重装
    sudo apt install vim-gtk
    重装后回到检查 clipboard 的步骤,查看是否有 +clipboard 出现。

参考连接

[1] 自动补齐括号
[2] 成对删除括号
[3] 共通剪贴板