首先声明一下,我是个伪 vimer。vim 设计初衷是整个文本编辑工作都用键盘而非鼠标完成。而我这篇文章更多是教你怎么调教 vim 使之能够更加符合你在 VS Code 等现代编辑器的操作习惯,教你如何使用鼠标+键盘的方式在 vim 中编辑文本、如何实现 Ctrl+S 保存、Ctrl+Z 撤销、Ctrl+Y 反撤销等快捷键映射以及教你如何安装插件让你的 vim 变得更加强大。
预备知识
尽管通过配置 .vimrc 配置文件我们可以获得接近在 VS Code 等编辑器中的操作体验,但在此之前我们仍需要对 vim 的原生操作有一点基础的了解,下面我将介绍下 vim 一个很重要的概念——模式。
在普通模式中按下 : 会切换到命令模式,在命令模式下我们可以执行一些 vim 内置的或插件提供的命令,在此模式下我常用的命令是:
: wq Enter 保存文件
: q Enter 直接退出
: q! Enter 强制退出
: %y+ Enter 全选并复制到剪贴板(需要配置和 vim 支持)
: so ~/.vimrc Enter 重载 vim 配置文件
: verbose nmap 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 文件中。
" [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个空格
"
缩进
set smartindent " 开启智能缩进
set autoindent " 开启自动缩进
set cindent " 开启C缩进(对C、C++语言文件有效)
" [other] 其它配置
set backupcopy=yes " 开启备份时行为为覆盖
set cmdheight=1 " 设置命令行的高度为1
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 插件的安装,我只能说需要耐心。特别是需要你具有搜索 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 特性为例给出大致的编译步骤:
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 #进入源代码目录并清理文件
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 其实是有意义的。
在我个人的很多使用场景下是只有终端没有图形界面的。
如在我的阿里云的centos开X服务很卡,连mosh和ssh都卡,这时候用一个调教好的 vim 来编辑文件可能是个不错的选择;还有我的OpenWrt 路由器和个人 NAS 都是 ARM 架构的linux,配置较低无法使用图形界面,vim是必备工具; 包括我们实验室的服务器集群,我作为管理员用终端中的vim、htop等工具去维护显然比开个图形界面再打开个VSCode效率要高。因此,vim在无图形化界面、机器配置较低或网络环境不好的远程操作等情形下仍然是有用武之地的。
如果你只是在自己的电脑上本地开发,使用先进的 IDE 或代码编辑器肯定是必须的呀。
【插播广告】VS Code 最新版已经支持自定义标题栏啦,现在的UI超级好看!如果你主力的编程语言* 和 Python ,强烈推荐下载下来试试 (逃
" [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个空格
"
colorscheme molokai " 设置主题为 molokai
按键映射篇
" Ctrl+S to save file in Normal Mode and Insert Mode
" Be notice that you should add `stty -ixon` to .bashrc
nnoremap :w " 在普通模式下按下 Ctrl+S 保存文本
inoremap :w " 在插入模式下按下 Ctrl+S 保存文本
nnoremap :u " 在普通模式下按下 Ctrl+Z 撤销上一步操作
inoremap :u " 在插入模式下按下 Ctrl+Z 撤销上一步操作
nnoremap :redo " 在普通模式下按下 Ctrl+Y 恢复上一步操作
inoremap :redo " Ctrl+W exit vim and Ctrl+Q force to exit vim
nnoremap :q " 在普通模式下按下 Ctrl+W 退出 vim
inoremap :q nnoremap :q! " 在普通模式下按下 Ctrl+Q 强制退出 vim (不保存任何修改)
inoremap :q! " Ctrl+A switch to normal mode and Ctrl+X switch to insert mode
inoremap " 在插入模式下按下 Ctrl+A 切换到普通模式
nnoremap :u " F5 to compile and run c/cpp file (optional)
inoremap :!clear && gcc -o temp % && ./temp " F5 编译执行 C++ 文件
nnoremap :!clear && gcc -o somename % && ./somename " F5 编译执行 C++ 文件
:verbose imap " 查看 Ctrl+Y 快捷键在插入模式的映射情况
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 初始化
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
...
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 #编译安装