Vim 系列教程目录:
- Vim 1 基本使用
- Vim 2 高级用法
- Vim 3 vimrc
- Vim 4 常用插件
- Vim 5 其他编辑器的 Vim 插件
Vim 插件网站
Vim 之所以强大, 有个很大的原因就是他有丰富的插件. 插件可以极大地增强 Vim 的功能. 那么去哪里下载插件呢? 插件怎么安装和管理呢, 听我慢慢道来.
先说到哪里去找插件, 这里列出两个网站:
- 官方插件网址 界面丑, 速度慢, 有时候还打不开, 不建议使用...
- VimAwesome 比较推荐的一个插件网站, 好看好用, 每个插件都有介绍, 还有安装方式说明, 以及每个插件官网的链接.
在这些网站上找到合适的插件后, 就可以进行安装了. 我后面会介绍几个插件, 你可以到 VimAwesome 上自行查找.
插件管理: vim-plug
Vim 本身就提供了安装和管理插件的方式, 但是不太方便, 我就不多说了. 现在比较流行的方式有两种: vim-plug 和 Vundle, 这两款插件都是用于"安装和管理别的插件"的插件.
我最近在用的是 vim-plug, 下面介绍一下它的用法.
安装 vim-plug
安装方式很简单, 下载 plug.vim, 放在 $VIM/vim81/autoload/ 目录中, 就算是完成安装了. 注意: 这里说是下载安装, 其实就是把该插件的源代码保存到名为 plug.vim
的文件, 然后放在对应的目录里就可以了. 官方还提供了使用命令的方式下载安装, 但其实还不如手动下载来得方便.
在 vimrc 中配置
安装好 vim-plug 后, 需要在 vimrc 中进行启用配置和插件配置, 方式如下:
" 以 call plug#begin 开始, 这句命令后面的小括号里用于指定 其他插件的安装目录, 注意不要使用 'plugin' 这种默认名称, 像我这样的写法就行
call plug#begin('$VIM/vimfiles/vim-plug')
" 配置插件, 方式有三种:
" 1. 插件的短别名(即 Github 中的 用户名/仓库名), 2. 插件的 Github 仓库地址, 3. 本地路径
Plug 'altercation/vim-colors-solarized'
Plug 'nlknguyen/papercolor-theme'
Plug 'scrooloose/nerdtree'
" 以 call plug#end() 结束
call plug#end()
上面就是在 vimrc 中启用 vim-plug, 以及配置其他插件的方式. 简单来讲, 按照 VimAwesome 上给出的插件名写就行, 很简单.
插件的安装, 移除, 升级
在 vimrc 中配置好插件之后, 需要使用 vim-plug 的命令进行安装, vim-plug 提供了如下命令, 你可以在命令模式下使用这些命令:
-
:PlugInstall
安装所有插件. 注意: 要安装插件, 需要先在 vimrc 中配置插件名称, 然后执行这个安装命令 -
:PlugClean
移除无用插件. 要移除插件, 需要先在 vimrc 中把要移除的插件名称删掉, 然后执行这个移除命令 -
:PlugUpdate
升级所有插件 -
:PlugUpgrade
升级 vim-plug 本身 -
:PlugStatus
查看插件状态
OK, vim-plug 的使用就是这么简单. 具体更加细节的配置可以参考官方文档, 这里不再赘述.
关于插件依赖的 Python
有些插件需要依赖 Python (比如 UltiSnip), 如果你装了这样的插件, 但是你的 Vim 却不支持 Python, 启动时就会报错(你可以继续使用 Vim, 但是看到报错会很烦).
关于 Python 依赖, 有这么几点需要确认:
- 确认 Vim 本身支持调用 Python. 通过
:version
命令, 可以看到 Vim 的版本信息以及支持的特性信息, 如果你能看到如下信息, 则说明 Vim 支持调用 Python:
+python/dyn
+python3/dyn
- 确认 Vim 支持的 Python 版本, 同样使用
version
命令查看, 在此命令输出的最下面可以看到如下信息:
-DDYNAMIC_PYTHON_DLL=\"python27.dll\"
-DDYNAMIC_PYTHON3_DLL=\"python36.dll\"
这说明 Vim 支持 Python 2.7 和 Python 3.6
- 32位的 Vim 只能调用 32 位的 Python, 同理, 64位的 Vim 只能调用 64位的 Python, 要查看 Vim 的版本, 还是使用
version
命令. - 系统中需要安装了对应的 Python 版本.
- 在命令模式下验证是否真的没问题. 例如 Vim 支持 Python3, 则在命令模式通过
:py3 1
这个命令查看是否真的可以.py3
是 Vim 调用 Python 时使用的命令, 后面的 1 是此命令的参数(可以是任意参数), 如果不报错, 则说明系统中有对应的 Python 版本.
我所使用的 Vim8.1 是 32 位版本, 我之前电脑里装了64位的 3.7, 结果报错, 改为 32 位的 3.6 就没问题了.
主题
主题的话, 这里推荐两款我比较喜欢的主题:
- PaperColor
- Dracula
其中 PagerColor 是亮色主题, Dracula 是暗色主题.
PaperColor 有个很好的地方: 同时支持亮色和暗色模式. 可在 vimrc 中做如下配置:
Plug 'nlknguyen/papercolor-theme'
" 启用亮色主题
set background=light
colorscheme PaperColor
" 启用暗色主题
" set background=dark
" colorscheme PaperColor
Dracula 是我比较喜欢的一款深色主题, 在 vimrc 中配置的时候要注意:
" 后面的配置表示把 dracula 主题放在 dracula 目录下
Plug 'dracula/vim', { 'as': 'dracula' }
" 启用主题
colorscheme dracula
启用主题之后, 你会发现 Vim 变得漂亮多了, 果然人靠衣装.
下面我再介绍一些基本的, 通用的插件.
The NERD tree
目录树插件, 上古神器, 这么多年来一直还在更新, 不容易. 安装就不说了, 自己参照 Awesome 上的名字进行配置即可. 帮助文档: help NERDTree
常用命令
命令 | 含义 | 备注 |
---|---|---|
:NERDTree [dir/bookmark] | 打开 NERDTree | 后面可以跟目录/书签作为参数 |
:NERDTreeToggle | 打开/关闭 NERDTree | |
:NERDTreeMirror | 将当前的 NERDTree 共享到另一个 NERDTree, 二者是同一个 buffer, 互相同步 | 首先得有另一个 NERDTree |
:Bookmark [name] | 将当前节点保存为书签, 可以指定名称 | 必须在 NERDTree 中才可以使用 |
:ClearBookmark [name] | 删除书签, 如果不给名称, 则删除当前节点对应书签 | 同上 |
:EditBookmark | 编辑所有书签 | 同上 |
常用指令
以下指令都需要在 NERDTree 中才能生效
指令 | 含义 | 备注 |
---|---|---|
o | 打开文件/目录/书签 | 如果是在目录上, 则是打开或关闭 |
i/s | 在新窗口/垂直新窗口打开文件 | 针对文件的命令 |
t | 在新标签打开目录/书签 | 如果是目录, 则自动打开一个新的 NERDTree |
m | 显示 NERDTree 菜单 | 菜单中可以选择添加/删除/修改文件或目录 |
O | 递归打开当前节点 | |
x | 关闭当前节点的父目录 | |
X | 递归关闭当前节点直到最上层目录 | |
D | 删除当前 Bookmark | 针对 Bookmark 的命令 |
r | 刷新当前目录 | |
q | 关闭当前 NERDTree |
配置
在 vimrc 中添加如下配置:
" 显示隐藏文件
let NERDTreeShowHidden=1
" 显示书签
let NERDTreeShowBookmarks=1
" NERDTree 大小改为 45 字符宽度, 默认 31
let NERDTreeWinSize=45
" 显示简写的 NERDTree 菜单
let NERDTreeMinimalMenu=1
" 设置箭头样式
let g:NERDTreeDirArrowExpandable='▸'
let g:NERDTreeDirArrowCollapsible='▾'
" 删除文件时自动删除文件对应 buffer
let NERDTreeAutoDeleteBuffer=1
" h 切换显示
nnoremap h :NERDTreeToggle
关于 CWD
前面我们介绍过 CWD(Current Working Directory), 当前工作目录. NERDTree 是很依赖 CWD的, 当你打开 NERDTree 的时候, NERDTree 会自动以 CWD 作为根目录显示文件目录. 使用 :NERDTree
命令时, 你可以指定一个目录作为参数, 那么此时这个目录就是 CWD. 如果你不指定目录参数, 则 CWD 就是用户目录.
在 NERDTree 中, 可以在某个目录节点上使用 cd
指令, 将 CWD 更改为指定目录. 不过有时候使用 cd
指令更改 CWD 会导致一些奇怪的问题, 比如 NERDTree 失效了, 此时可以使用 :NERDTree
命令来重启 NERDTree.
repeat.vim
.
这个指令只能重复 Vim 原生的上次指令, 如果是自己映射的指令或是插件映射的指令, 是无法重复的. repeat.vim 就是用来解决这个问题的. 无需配置, 装上就能用了, 虽然用处不大, 但是聊胜于无.
surround.vim
上古神器, 可以快速地给文本两边添加成对的符号, 如 ([{" 等等. 帮助文档: help surround
下文我简单介绍下其用法, 我会将成对的符号称为 "surroundings", 这也是官方文档中的称呼
使用方法
- 删除 surroundings
指令为 ds (Delete Surroudings), 可以将文本两边的 surroundings 删掉, 用法为ds
,
看下面几个例子(星号表示光标的位置):
Old Text | command | New Text |
---|---|---|
"Hello *world!" | ds" | Hello *world |
(123+4*56)/2 | ds) | 123+4*56/2 |
|
dst | Yo!* |
注意, dst 这个指令中, t 是个文本对象, a tag, surround 中的文本对象和 Vim 中的一致.
- 改变 surroundings
指令为 cs (Change Surroundings), 可以改变文本两边的 surroundings, 用法为:cs
,
下面给出几个例子:
Old text | Command | New text ~ |
---|---|---|
"Hello *world!" | cs"' | 'Hello world!' |
"Hello *world!" | cs" |
|
(123+4*56)/2 | cs)] | [123+456]/2 |
(123+4*56)/2 | cs)[ | [ 123+456 ]/2 |
|
cst |
|
除了 cs
指令, 还有一个 cS
指令, 给当前文本替换 surroundings 的时候, 会给当前文本单独
分配一行, 并进行代码格式化.
- 添加 surroundings
指令为 ys (You Surroundings), 给文本添加 surroundings, 用法为ys
,
下面给出一些例子:
Old text | Command | New text ~ |
---|---|---|
Hello w*orld! | ysiw) | Hello (world)! |
Ti*tle | ysiw |
|
很Geek的做法 | ysiw |
很 Geek 的做法 |
有一个特殊指令: yss
, 可以对当前行添加 surroundings, 添加时自动忽略两边的空格:
Old text | Command | New text ~ |
---|---|---|
Hello w*orld! | yssB | {Hello world!} |
类似 cS
, yS
也可以在给文本添加 surroundings 的时候给文本单独分行并进行代码格式化,
而 ySS
则可以给当前行添加 surroundings, 并且格式化
- 可视模式指令
按 v 进入可视模式, 接下来按S
可以给选中的文本添加 surroundings
我的一些配置
写文档时, 在中英文混输的情况下, 最好在英文单词两边加上空格, 看着比较舒服, 也比较规范, 但是有时候经常忘记, 所以我定义了如下快捷键:
" 给单词两边加上空格
nmap ysiw
" 给单词左边加上空格
nmap h wbiw
" 给单词右边加上空格
nmap l eab
这些配置依赖 surround.vim, 所以要先装插件. 另外, 有了 repeat.vim 这个插件, 这些指令也是可以使用 .
进行重复的, 很方便.
SuperTab
上古神器, 在插入模式下使用 Tab 键进行补全. 帮助文档: help supertab
用法其实很简单, 这里给一个文档中的例子:
> Example ('|' denotes the cursor location):
> bar
> baz
> b|`` Hitting `` here will start the completion, allowing you to
> then cycle through the suggested words ('bar' and 'baz').
意思就是说, 你先输入过 bar, 又输入过 baz, 当你再次输入 b, 然后按 Tab 键, 会弹出一个候选列表帮你进行补全, 在补全列表出现后继续按 Tab/Shift-Tab, 可以在候选词中循环.
EasyMotion
上古神器, 是对 Vim 移动指令的增强. 帮助文档: help easymotion
这里简单介绍一下用法: 加入你想找到下面这句话中的 amet 这个单词上:
Lorem ipsum dolor sit amet.
表示你现在光标的所在处, 你需要输入四次 w. 但是使用 EasyMotion 的话, 你可以使用这个指令:
, 你会发现每个单词的首字母都被高亮成一个新的不重复的字母了, 你直接按被高亮的那个字母, 就可以跳过去了.
同样的, 如果你想跳到某一个出现字母 o 的地方, 你可以使用
, 那么所有字母o都被高亮成新的字母了, 你直接按下高亮的字母就可以跳过去了.
你试试就知道我的意思了.
CtrlP
上古神器, 用于查找 Buffer, 文件列表, 最近使用文件等, 现在还在缓慢更新, 这几年慢慢的被 fzf 代替了, 但是由于 fzf 配置比较麻烦, 现在我暂时还用 CtrlP. 帮助文档: help CtrlP
用法很简单, 按快捷键 Ctrl-p 可在 Vim 底部打开一个窗口, 然后你可以输入文件名中的字符, CtrlP 会进行模糊匹配查找.
常用快捷键
下面给出几个常用快捷键, 注意下面的快捷键都只能在 CtrlP 的窗口中使用:
快捷键 | 功能 | 备注 |
---|---|---|
Ctrl-j/k | 在文件列表中上下移动 | |
Ctrl-f/Ctrl-b | 切换到下一个/上一个搜索模式 | 搜索模式有三个: Buffer, 文件目录, MRU(最近最常使用) |
Ctrl-c | 关闭 CtrlP | |
F7 | 在 CtrlP 面板中删除光标所在条目(buffer, mru) | |
Ctrl-s/Ctrl-v | 在水平/垂直的分割窗口中打开文件 | |
Ctrl-t | 在新 tab 中打开文件 |
注意: CtrlP 也很依赖 CWD, 它列出文件目录中的文件时, 也是 CWD 下的文件.
配置
" 默认使用缓冲区搜索模式打开 CtrlP
let g:ctrlp_cmd='CtrlPBuffer'
" 将为多字节字符开启输入事件循环, 用于解决中文文件名的问题(实验特性)
let g:ctrlp_key_loop= 1
" CtrlP 窗口最大高度和最小高度都是 10, 即固定大小
let g:ctrlp_match_window='min:10,max:10'
小结
本节介绍了几个常用的插件, 都是很基本和通用的, 不涉及到具体编程语言, 有了它们, 会让你的 Vim 用起来更舒服.