教你打造个性化vim编辑器

教你打造个性化vim编辑器

首先声明一下,我是个伪 vimer。vim 设计初衷是整个文本编辑工作都用键盘而非鼠标完成。而我这篇文章更多是教你怎么调教 vim 使之能够更加符合你在 VS Code 等现代编辑器的操作习惯,教你如何使用鼠标+键盘的方式在 vim 中编辑文本、如何实现 Ctrl+S 保存、Ctrl+Z 撤销、Ctrl+Y 反撤销等快捷键映射以及教你如何安装插件让你的 vim 变得更加强大。

预备知识

尽管通过配置 .vimrc 配置文件我们可以获得接近在 VS Code 等编辑器中的操作体验,但在此之前我们仍需要对 vim 的原生操作有一点基础的了解,下面我将介绍下 vim 一个很重要的概念——模式。 ## 模式 与大多数编辑器不同,vim 是一种多模式编辑器,共有普通模式(Normal Mode)、插入模式(Insert Mode)、命令模式(Command-line Mode)、可视模式(Visual Mode)、选择模式(Select Mode)和执行模式(Ex Mode)等 6 种模式。我们使用 vim 打开文本文件时默认进入的是普通模式,这时我们不能直接编辑文本但可以按一些快捷键。在普通模式下我常用的操作是:

  1. g g 将光标移动至第一行
  2. G 将光标移动至最后一行
  3. d 3 3 3 3 Enter 清空文件(光标必须在第一行)
  4. 2 2 up 将光标向上移动 22 行
  5. 2 2 down 光标向下移动 22 行
  6. 5 0 g g 将光标移动到第 50 行
  7. / word 向下搜索 word
  8. u 撤销上一步操作
  9. Ctrl r 恢复上一步操作

在普通模式中按下 : 会切换到命令模式,在命令模式下我们可以执行一些 vim 内置的或插件提供的命令,在此模式下我常用的命令是:

  1. : wq Enter 保存文件
  2. : q Enter 直接退出
  3. : q! Enter 强制退出
  4. : %y+ Enter 全选并复制到剪贴板(需要配置和 vim 支持)
  5. : so ~/.vimrc Enter 重载 vim 配置文件
  6. : verbose nmap <BS> Enter 查看 Backspace 在普通模式按键映射

在命令模式中加上 ! 前缀会进入执行模式即在 vim 中执行 shell 命令。如我们可以直接在 vim 中直接执行 echo 命令。

: ! echo "Hello World" Enter 在 vim 中执行 shell 命令

在命令模式中删除所有字符或回车执行完一个命令后会自动回到普通模式,在普通模式中我们按下 i 会进入插入模式。插入模式就是我们熟悉的文本编辑模式。在插入模式下我们可以按下 Esc 回到普通模式。在普通模式下按下 v 会进入可视模式,使用鼠标选中文本会进入选择模式,这两个模式我主要用来复制选中文本。

在介绍完这些基础知识后,我们就要接触 vim 的配置文件了,vim 的灵活性在于它的可配置选项丰富(其实也是缺点)。下面我们主要通过修改 vim 的用户配置文件和安装插件等方式实现 vim 的个性化。vim 的数据文件夹是 ~/.vim,这个文件夹是用于存放 vim 的主题配置文件、插件和其它配置。vim 的用户配置文件是 ~/.vimrc,下面的所有配置都需要写入这个文件。

基础配置篇

vim 的默认配置很简洁,但是缺少了很多重要的功能。如 vim 默认不支持使用退格键(Backspace)删除字符、不支持系统剪贴板、不支持鼠标等。但我们可以通过一定的配置去开启 vim 的这些内置功能。你可以参照配置后面的注释选择是否添加该项配置到你的 .vimrc 文件中。

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
" [Common Configration] 公共配置
" [ui beautification] 界面美化
syntax on " 开启代码高亮
set nu " 开启行号
set ruler " 开启标尺
set cursorline " 开启高亮光标所在行
set hlsearch " 开启搜索结果高亮显示
set incsearch " 开启搜索逐字符高亮
" [improve performance] 提示性能
set viminfo= " 关闭 viminfo (用于加快 vim 启动速度)
" [polyfill] 功能填补
set clipboard=unnamedplus " 开启系统剪贴板支持(需要手动编译最新版 vim 使其 +clipboard)
set backspace=indent,eol,start " 开启 Backspace 键支持(否则 Backspace 无法删除字符)
" [mouse support] 鼠标支持
set mouse=a " 开启鼠标支持
set selection=inclusive " 指定在选择文本时光标所在位置也属于被选中的范围
set selectmode=mouse,key " 使鼠标和键盘都可以控制光标选择文本
" [tab] tab键
set ts=4 " 指定制表符(tab)等于的空格数
set softtabstop=4 " 开启软制表(如果这4个空格是用tab键打出来的删除会一起删除)
set shiftwidth=4 " 指定自动缩进时缩进4个空格
" [indent] 缩进
set smartindent " 开启智能缩进
set autoindent " 开启自动缩进
set cindent " 开启C缩进(对C、C++语言文件有效)
" [other] 其它配置
set backupcopy=yes " 开启备份时行为为覆盖
set cmdheight=1 " 设置命令行的高度为1

主题配置篇

vim 的主题是一个 .vim 文件,里面定义了各种颜色信息。我们只要把喜欢的主题文件下载下来放在 ~/.vim/colors (没有自己新建一个)。然后在 .vimrc 文件中指定下主题下次启动 vim 时就会生效。我个人比较喜欢的主题是 molokai,我们可以在 github 上 获取该主题 。把 molokai.vim 文件复制到 ~/.vim/colors 文件夹后我们在还需要在 .vimrc 文件中指定配置:

1
2
" [theme] 主题
colorscheme molokai " 设置主题为 molokai

按键映射篇

vim 默认的很多操作对于 WPS 和 VS Code 使用过多的人我来说还是很不习惯的。比如如果在插入模式下编辑文本时,突然发现需要撤销,这时我们必须要按下 Esc 切换到普通模式下然后按下 u 才能撤销上一步操作、按下 Ctrl+r 才能恢复上一步操作;保存文件必须要按下 Esc 切换到普通模式下后按下 : wq Enter 才能保存文件...这些操作对于只用键盘敲代码的极客来说可能是没有问题的,但是对于我这种习惯用鼠标加键盘的操作的菜鸡来说还是不是很友好的。我更倾向于直接按下 Ctrl+s 保存文件、Ctrl+Z 撤销上一步操作以及 Ctrl+Y 恢复上一步操作。下面是我的按键映射配置,供各位参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
" [Key Mappings]
" Ctrl+S to save file in Normal Mode and Insert Mode
" Be notice that you should add `stty -ixon` to .bashrc
nnoremap <C-S> :w<CR> " 在普通模式下按下 Ctrl+S 保存文本
inoremap <C-S> <C-O>:w<CR> " 在插入模式下按下 Ctrl+S 保存文本
nnoremap <c-z> :u<CR> " 在普通模式下按下 Ctrl+Z 撤销上一步操作
inoremap <c-z> <c-o>:u<CR> " 在插入模式下按下 Ctrl+Z 撤销上一步操作
nnoremap <c-y> :redo<CR> " 在普通模式下按下 Ctrl+Y 恢复上一步操作
inoremap <C-Y> <c-o>:redo<CR 在插入模式下按下 Ctrl+Y 恢复上一步操作
" Ctrl+W exit vim and Ctrl+Q force to exit vim
nnoremap <C-W> :q<CR> " 在普通模式下按下 Ctrl+W 退出 vim
inoremap <C-W> <C-O>:q<CR " 在插入模式下按下 Ctrl+W 退出 vim
nnoremap <C-Q> :q!<CR> " 在普通模式下按下 Ctrl+Q 强制退出 vim (不保存任何修改)
inoremap <C-Q> <C-O>:q!<CR " 在插入模式下按下 Ctrl+Q 强制退出 vim (不保存任何修改)
" Ctrl+A switch to normal mode and Ctrl+X switch to insert mode
inoremap <C-A> <ESC> " 在插入模式下按下 Ctrl+A 切换到普通模式
nnoremap <c-z> :u<CR " 在普通模式下按下 Ctrl+X 切换到插入模式
" F5 to compile and run c/cpp file (optional)
inoremap <F5> <C-O>:!clear && gcc -o temp % && ./temp<CR> " F5 编译执行 C++ 文件
nnoremap <F5> :!clear && gcc -o somename % && ./somename<CR> " F5 编译执行 C++ 文件

注意,在 Linux 终端中 Ctrl+s 默认是锁定屏幕的快捷键。重映射 Ctrl+s 不仅需要在 ~/.vimrc 文件中设置按键映射,还需要在 ~/.bashrc 文件末尾添加一行 stty -ixon 以禁止 Ctrl+s 的默认行为。

还有一个必须需要注意的问题就是我们后面即将介绍的 vim 插件可能会覆盖我们之前定义的按键映射导致按键映射失效。当我们发现按键映射失效的时候可以利用下面命令查看对应的快捷键的映射情况:

1
2
:verbose nmap <C-Z> " 查看 Ctrl+Z 快捷键在普通模式的映射情况
:verbose imap <C-Y> " 查看 Ctrl+Y 快捷键在插入模式的映射情况

插件篇

关于 vim 的插件管理,我个人推荐 vundle。可以通过下面的步骤安装 vundle:

1
2
3
4
5
6
7
8
9
10
11
12
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

tee -a ~/.vimrc <<'EOT'
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
call vundle#end()
filetype plugin indent on
EOT #将 vundle 的配置添加到 .vimrc 文件中

vim +BundleInstall +qall # vundle 初始化

完成上面的步骤后,我们安装或卸载 vim 插件的一般步骤是: 1. 修改 .vimrc 文件,添加或移除相应的 vim 插件 2. 执行 :PluginInstall:PluginClean 调用 vundle 安装或移除插件

下面我以 vim-airline 的安装和卸载为例,vundle 安装的插件的格式一般是 github用户名/仓库名,而 vim-airline 仓库对应的用户名也是 vim-airline,因此我们需要把以下配置添加到 .vimrc 文件中:

1
2
3
4
5
6
7
8
9
...
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'vim-airline/vim-airline' " 安装插件 air-line
call vundle#end()
filetype plugin indent on
...

接下来我们需要退出 vim 再打开 vim(或者直接在命令模式输入 :so ~/.vimrc 重载配置文件)进入命令模式输入 :PluginIntsall 就会自动进入 vundle 并安装 vim-airline。

卸载 vim-airline 的步骤相似,先移除 .vimrc 文件中的 Plugin 'vim-airline/vim-airline' 退出 vim 后重新进入 vim 进入命令模式输入 :PluginClean 清理不再使用的 vim-airline 插件。

最后分享一下我个人自用的插件: - vim-airline/vim-airline 一款好看的 vim 状态栏插件(需要安装相应字体) - vim-airline/vim-airline-themes vim-airline 的主题包(用于配合 vim-airline 使用) - Shougo/neocomplete 一款轻量级的自动补全插件(需要 vim +lua 支持) - luochen1990/rainbow 彩虹括号 - jiangmiao/auto-pairs 自动补全 - tpope/vim-fugitive vim 最好用的 git 插件 - vim-syntastic/syntastic 语法检查 - plasticboy/vim-markdown Markdown 高亮支持 - kien/ctrlp.vim 文件名搜索 - scrooloose/nerdtree 目录树插件 - gabesoft/vim-ags 搜索加速(可配合 ctrlp 使用) - majutsushi/tagbar 标签栏(需要安装 ctags)

关于 vim 插件的安装,我只能说需要耐心。特别是需要你具有搜索 github issues、使用 google 的搜索问题的能力。很多插件的安装需要仔细阅读官方文档(一般是 github 的 README.md 文件),还有一些插件本身就有坑需要自己去 stack overflow、github issues 查看相关讨论才能找到答案。

编译篇

大多数情况下,系统自带的 vim 是不支持一些高级功能的。我们可以通过 vim --version 查看当前的 vim 是否支持某个特性。deepin 15.7 自带的 vim 默认是 -clipboard、-pythoon、-python3、-lua 的。如果我们需要额外的特性,则需要自己下载官方最新的源码手动编译安装了。这里以使 vim 支持 +python/+python3 特性为例给出大致的编译步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo apt install python-dev python3-dev #安装 python 开发工具
sudo apt purge vim -y #卸载系统自带 vim
rm ~/.vimrc ~/.viminfo ~/.vim -rf #清理相关配置文件
cd ~/Downloads #进入临时文件夹
wget https://github.com/vim/vim/archive/v8.1.0451.tar.gz #下载最新发布版本
tar -zxvf v8.1.0451.tar.gz #解压
cd vim-8.1.0451 && make distclean #进入源代码目录并清理文件

# 指定编译配置
./configure --prefix=/usr --with-features=huge \
--enable-rubyinterp --enable-pythoninterp --enable-python3interp \
--with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu \
--with-python3-config-dir=/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu

cd src
sudo make VIMRUNTIMEDIR=/usr/share/vim/vim81 -j8 #编译
sudo make install -j8 #编译安装

总结

其实,对于像我这样一个 VS Code 已经使用习惯的人,对vim 再怎么进行个性化配置最终也只是让它尽可能地接近 VS Code 的操作体验,最后主力的代码编辑器仍然是 VS Code;而对于一个纯 vimer、一个键盘极客来说,仅仅只是默认的 vim 配置他也可能够高效地处理文本和编写代码。对于我个人来说,我的 vim 使用场景主要是 ssh 连接远程服务器,这时我只能在终端上用 vim 编辑文本。因此,仅对我个人而言,配置一个更好用、更加符合个人操作习惯的 vim 其实是有意义的。

毕竟,我还年轻,还有折腾的资本。 (逃