编辑器界有个有名的段子:
如何产生一段真随机数?只需要让一个新手尝试退出vim…
vim是公认的上手困难,学习曲线陡峭的编辑器。
克服这些困难最终带来的回报是非常丰厚的,
我在此分享一些高效使用vim的方式,
希望大家能有所收获。
vim高效的核心
vim高效有以下原因:
- 精准
- 定制化
- 自动化
精准
vim完全依赖键盘完成所有操作, 任何操作都能使用确定的一系列键盘操作完成, 因此vim中操作的精准性由键盘击键的准确性保证。 与此对比的是或多或少需要鼠标介入的编辑器, 鼠标作为屏幕定位设备,为保证准确性, 需要在鼠标指针接近目标点时降低移动速度。 键盘击键的频率和准确性远远超过鼠标, 在鼠标和键盘两种输入设备之间切换也会极大降低编辑效率, 这也是依赖鼠标介入编辑操作的编辑器也尽力依靠快捷键减少鼠标操作的原因。
定制化
vim非常容易根据个人需要进行定制化,
所有的定制化可以通过编辑vimrc文件实现。
vim的插件发布基于远程git仓库,
git仓库可以是github这类的公开仓库,
也可以是自己搭建的私有仓库,不需要一个集中式的仓库中心,
这使得编写、发布、同步、更换插件非常方便,
当使用的github公开插件不能满足需求时,fork并修改即可。
其他一些编辑器出于易用性的考虑往往只提供集中式插件管理中心,
其好处是开箱即用,但是个人用户对插件做定制化修改代价很高,
需要按照集中式插件中心的要求执行很多和插件本身完全无关的操作,
间接降低了插件的定制化能力。
自动化
自动化的前提是精准和定制化。
精准使得任何vim中的编辑操作都可以自动化,而对于需要鼠标介入操作的编辑器,
鼠标操作本身的自动化是不可能完成的任务,这极大的限制了这类编辑器自动化的能力。
‘write once use everywhere’是vim的设计哲学,
最突出的一个体现就是插件是不区分窗口的。在绝大多数其他编辑器中,
插件几乎仅针对文本编辑窗口,
其他的窗口(如目录树窗口)几乎没有可用的插件。
vim提供了多种方式来实现高效的重复操作:
单次编辑操作,使用重复快捷键.
;简单的短序列操作,
使用vim的脚本录制功能录制操作序列,并在随后重放;
常用的高频操作,可以在vimrc中添加函数,方便后续调用;
方便的定制化使得自动化工作的成果能够逐渐的累积,
进一步增强vim的自动化能力。
在使用vim的过程中要养成自动化的思想,每当开始执行重复的操作时,
都要想办法自动化,消除重复。
这类似于写代码,
每当ctrl-c
ctrl-v
时,都需要考虑是否封装城单独函数。
配置vim
vim上手难有两个主要的原因:
- 不同于习惯中编辑器的操作方式。
- 没有开箱即用的默认配置。
本文主要针对第二点给出建议,列举出一些最出色的vim插件,展示这些插件的作用,
并给出推荐的插件配置及快捷键设置。
完整推荐配置参见vimrc
效果图:
配置文件
vim默认的配置文件路径是~/.vimrc,vim在启动时首先加载vimrc文件中的所有配置,
配置文件的内容是vim script脚本,这是一种比bash脚本功能更加强大的脚本。
配置文件中不仅可以配置vim及插件的选项,
也可以自定义函数,这些函数除了执行vim的命令,
还能执行所有的操作系统命令。
例如在推荐配置中利用curl
命令自动安装需要的字体和插件管理器。
内置配置
vim内置了一些配置选项,这些配置通过在vimrc文件中通过set命令配置。 一些重要的配置如下:
1 |
|
更多的内置配置可以参见推荐配置
快捷键设置
<leader>
vim作为纯键盘操作的编辑器,自身占用了大量的键位作为快捷键,
为了避免快捷键的冲突问题,vim引入了前缀键的概念<leader>。
<leader>
键允许使用字符序列作为快捷键组合,
例如<leader>a
、<leader>gf
、<leader><leader>f
等。
因此<leader>
是vim中使用最高频的按键之一,vim中的默认<leader>
键是\
,
是键盘上最难按到的按键之一,每个vim用户都不会使用这个默认的设置,
根据自身的习惯设置成更好按的键位,
我推荐设置为空格
键,vim中空格
键的功能和向右的移动键l
是重复的,
按压空格
键的是左右手拇指之一,是手上最强壮的手指,并且在键盘上,
拇指除了空格
以外不需要按压其他任何按键,
是最适合承担繁重的<leader>
按键的键位。
推荐配置:
1 |
|
模式和快捷键
vim有六种快捷键模式:
- Normal: 正常模式,用于输入命令,不能直接编辑文本,是进入vim的默认模式。
- Visual: 可视模式,选中的区域会高亮,按
v
或V
进入。 - Select: 选择模式,通过
set selectmode
配置, 该模式和记事本类似,需要鼠标介入操作,没人用,可忽略。 - Operator-pending: 操作符未决模式,当键入一个未决操作符(
d
,y
,c
, 等等)进入该状态。 - Insert: 插入模式,包含了Replace模式,可直接编辑或替换文本,按i或R等键进入
- Command-line: 命令行模式,按
:
或/
命令进入。 每种快捷键模式有各自不同的快捷键设置,设置对应模式的快捷键命令如下:
递归映射 | 非递归映射 | 取消映射 | 模式 |
---|---|---|---|
map | noremap | unmap | Normal, Visual, Select, Operator-pending |
nmap | nnoremap | nunmap | Normal |
vmap | vnoremap | vunmap | Visual and Select |
smap | snoremap | sunmap | Select |
xmap | xnoremap | xunmap | Visual |
omap | onoremap | ounmap | Operator-pending |
map! | noremap! | unmap! | Insert and Command-line |
imap | inoremap | iunmap | Insert |
lmap | lnoremap | lunmap | Insert, Command-line, Lang-Arg |
cmap | cnoremap | cunmap | Command-line |
tmap | tnoremap | tunmap | Terminal-Job |
推荐配置:
1 |
|
其他映射参见各个插件的推荐配置
插件管理
vim有众多的插件,主要发布于github, 为了方便插件的安装、更新、管理,插件管理器应运而生。 vim-plug是出色的vim插件管理器, 安装简单,易于使用,快速,支持指定分支、tag、commit,支持更新后函数钩子等。
安装插件管理器
1 |
|
以下配置在首次打开vim时自动安装插件管理器并安装插件:
1 |
|
配置插件
1 |
|
安装/更新插件
在vim中执行命令:PlugUpdate
界面美化
配色主题
vim有众多的配色主题,推荐以下几个最为流行的主题:
- monokai
- solarized
- seoul256
- vim-code-dark 模仿vscode配色
- space-vim-dark 程序媛最爱
代码高亮
各类型语言文件语法高亮
c/cpp: bfrg/vim-cpp-modern
shell: Shougo/vimshell.vim
protobuf: vim-protobuf
thrift: solarnz/thrift.vim
html: othree/html5.vim
javascript: pangloss/vim-javascript
json: elzr/vim-json
scala: derekwyatt/vim-scala
括号高亮
界面增强
状态栏美化
vim-airline/vim-airline
状态栏主题插件
vim-airline/vim-airline-themes
提供了大量可选的状态栏配色主题。
推荐设置:
1 |
|
目录树
scrooloose/nerdtree以目录树的方式显示 目录、文件的层级结构。 Xuyuanp/nerdtree-git-plugin 在目录树中显示文件的git状态。 推荐设置:
1 |
|
图标增强
ryanoasis/vim-devicons
提供图标支持
tiagofumo/vim-nerdtree-syntax-highlight
在目录树显示文件图标。
图标增强需要额外的字体支持,需要安装相应的字体并设置终端字体
推荐配置:
1 |
|
符号栏
符号栏majutsushi/tagbar
能够在侧边栏按照组织层级显示当前编辑文件中的类、函数等符号。
推荐配置:
1 |
|
minimap
severin-lemaignan/vim-minimap
推荐配置:
1 |
|
剪贴板
junegunn/vim-peekaboo
是剪贴板可视化插件
svermeulen/vim-yoink
可以在剪贴板的多个历史值间快速切换。
推荐配置:
1 |
|
函数签名
Shougo/echodoc.vim在命令栏显示函数签名,
当编辑参数时,能够同时提示当前正在编辑的参数的签名
推荐配置:
1 |
|
可打印字符显示
bitc/vim-bad-whitespace
高亮显示行尾多余的空格
推荐配置:
1 |
|
markdown预览
plasticboy/vim-markdown 提供markdown文件高亮显示,并支持在浏览器实时预览markdown效果。 推荐配置:
1 |
|
缩进线
Yggdroot/indentLine
在tab或空格缩进处显示缩进线
推荐配置:
1 |
|
其他界面显示配置
1 |
|
编辑
文件编辑
光标移动
光标移动是文本编辑中最高频的动作,vim中提供了大量的快捷键用于光标移动,
包括同方向多次移动、行内字符跳转、搜索跳转等等,下面的插件几乎将光标移动优化到了
极致,通常只需要3-4次击键即可跳转到当前文件可见部分的任意位置。
easymotion/vim-easymotion
是跳转插件,通常只需3-4次击键即可跳转到任意指定字符位置。
推荐配置:
1 |
|
justinmk/vim-sneak是短跳转插件,
当跳转的指定字符在可见区域内重复次数较低时,通常只需2-3次击键即可跳转到任意指定
字符位置,比
easymotion/vim-easymotion
少一次击键。
推荐配置:
1 |
|
标记(mark)
标记是vim中用于在文件间或文件内跳转的工具。当需要在多个特定位置之间跳转时,
首先在这些位置设置标记,接着就可以在不同的标记之间快速跳转。
vim使用26个英文字母作为标记的可选名称。
当标记名称为小写时,标记仅在当前文件有效,
仅能在当前文件的不同行之间跳转,不同文件间同名的小写标记不冲突;
当标记名称为大写时,全局有效,能够在不同的文件之间跳转。
当标记较多时,vim内置的标记命令不易使用,
kshenoy/vim-signature
简化了设置标记的操作,并且会在对应位置可视化显示标记。
标记间跳转可以使用vim内置的跳转指令'
,
推荐使用Leaderf插件的标记查找功能。
推荐配置:
1 |
|
搜索
haya14busa/incsearch.vim
实时高亮正则表达式搜索匹配项。
haya14busa/incsearch-fuzzy.vim
实现模糊搜索,并高亮匹配项。
推荐配置:
1 |
|
rking/ag.vim
在目录中递归搜索字符串,是更加高效的grep替代者。
替换
tpope/vim-abolish
提供增强的字符串替换功能。
svermeulen/vim-subversive
以可视化的方式提供字符串替换功能,
替换的同时支持vim-yoink插件提供的剪贴板切换功能。
推荐配置:
1 |
|
多光标
terryma/vim-multiple-cursors
增强了vim的多光标编辑能力。
推荐配置:
1 |
|
成对符号
tpope/vim-surround
能够方便的编辑成对符号。
jiangmiao/auto-pairs
自动补全成对符号。
智能区域选择
terryma/vim-expand-region
能够智能的扩大/缩小选中区域。
推荐配置:
1 |
|
代码开发
代码补全引擎
neoclide/coc.nvim 是基于LSP(language server protocol)的智能引擎,在vim中体验到和IDE完全一致的补全和诊断体验
推荐配置:
1 |
|
C++工程中,如果没有配置编译参数、include路径等设置,自动补全效果很差,但是配置这些参数是 比较麻烦的,可以使用rizsotto/Bear自动生成 配置文件compile_commands.json,将配置文件放在工程目录下,智能引擎即可自动加载
Valloric/YouCompleteMe
是上一代vim代码补全引擎,可完全被coc.nvim替换,已不再推荐使用。
支持C、C++、Go、Python、C#、JavaScript、TypeScript、Rust、Java、Ruby、PHP
等多种语言的自动补全、语法检查、代码跳转等。
推荐配置:
1 |
|
标签系统
标签系统能够根据源码文件抽取类、函数、变量的等符号作为标签,用于代码结构展示、
代码跳转、查找、自动补全等。
最广泛使用的标签系统有ctags和gnu global,其中gnu global速度更快且支持增量更新,
支持25种语言的标签抽取。
ludovicchabant/vim-gutentags
能够自动生成并更新标签文件。
skywind3000/gutentags_plus
提供根据标签文件进行代码跳转、查找的能力,
并设置相应的配置,
使YouCompleteMe、tagbar等依赖标签系统的插件,
能根据标签进行代码补全、标签展示等。
推荐配置:
1 |
|
代码片段
SirVer/ultisnips是代码片段框架,
honza/vim-snippets
定义了大量各种语言的代码片段,代码片段会由YouCompleteMe等补全插件自动调用,
进行代码片段补全。
推荐配置:
1 |
|
静态检查
YouCompleteMe插件对于支持的语言提供了静态检查能力,
但是还有大量格式的文件需要静态检查能力,比如protobuf、thrift、json等,
w0rp/ale对几乎所有的代码文本提供静态检查能力,
是YouCompleteMe的良好补充。
推荐配置:
1 |
|
格式化
chiel92/vim-autoformat
自动格式化代码。
推荐配置:
1 |
|
注释
scrooloose/nerdcommenter
对大量的语言提供注释/取消注释选中文本的能力。
推荐配置:
1 |
|
帮助手册
vim内置命令的帮助直接使用:help命令即可,
如:help autopairs
查看auto-pairs插件的帮助说明,
:help incsearch
查看vim内置配置incsearch的帮助说明。
linux中最广泛使用的帮助手册是man手册,
vim-utils/vim-man
能够在vim中查看man手册。
文件头
大多数项目会在文件开头部分添加一段格式化的说明性文字,如版权、作者、
授权、创建时间、修改时间等,
alpertuna/vim-header
能够添加并自动更新文件头。
文件头示例:
1 |
|
推荐配置:
1 |
|
其他编程语言特定插件
rustushki/JavaImp.vim
能自动添加Java import,能查看JavaDoc,查看JDK源码等。
推荐配置:
1 |
|
python-mode/python-mode
提供大量python相关的功能,如符号高亮、virtualenv支持、添加/移除断点、
运行python文件、查看pydoc等。
推荐配置:
1 |
|
ensime/ensime-vim
提供scala语言的自动补全、错误检查、重构等支持
推荐配置:
1 |
|
derekwyatt/vim-fswitch
在C/cpp的头文件和源文件之间快速切换。
推荐配置:
1 |
|
GDB调试
vim内置了GDB调试的支持插件,通过命令:packadd termdebug
加载插件。:Termdebug
命令启动调试器,例如Termdebug /usr/bin/vim /var/logs/core_dump
。
推荐配置:
1 |
|
编辑历史
mbbill/undotree记录并显示文件的编辑历史,
方便撤销/回滚。
推荐配置:
1 |
|
其他
大文本粘贴
在vim中粘贴大量文本时,由于自动缩进机制的存在,
可能导致粘贴文本的格式异常,当粘贴大量文本时,通常需要设置vim为粘贴模式,
即执行命令:set paste
。
roxma/vim-paste-easy插件能在粘贴大量文本
时自动切换模式。
推荐配置:
1 |
|
自动创建目录
vim中执行:w
或:u
等保存文件命令时,若文件父目录不存在
pbrisbin/vim-mkdir
能够自动创建目录。
sudo权限获取
chrisbra/SudoEdit.vim 能够以sudo权限读写文件。
工程管理
文件浏览
目录树是浏览文件结构的高效工具,在编写代码的任务中,
大多数时间我们都对项目文件结构非常了解,
更加需要能够根据路径或文件名快速打开相应文件。
Yggdroot/LeaderF
是强大的模糊/正则搜索工具,
能够模糊/正则搜索文件名、完整路径、函数、文件内容、代码标签(tags)、标记(mark)等。
按照名称模糊查找文件:
按照完整路径模糊查找文件:
按名称模糊查找已经打开的文件:
模糊查找当前文件中函数:
模糊查找当前文件中标签(tags):
模糊查找当前文件中的标记(mark):
模糊查找当前文件内容:
模糊查找命令历史:
模糊查找搜索历史:
推荐配置:
1 |
|
git
tpope/vim-fugitive
提供了在vim中执行git命令的能力,
如:Git blame %
查看当前文件修改者,:Git commit %
提交当前文件等。
airblade/vim-gitgutter
能够显示当前文件各行的git状态。
gregsexton/gitv是类似于gitk的工具,
以更加清晰的可视化方式支持几乎所有的git操作,包括分支切换、rebase、
merge、commit等。
尾声
经过以上配置的vim已经是高效的开发环境,但是开发工作不只是代码编辑,
后续的拔掉鼠标系列将陆续介绍一系列提高纯键盘开发调试效率的工具:zsh、
autojump、tmux、chrome cVim plugin…
未完待续…