Vim 插件网站

Vim 之所以强大, 有个很大的原因就是他有丰富的插件. 插件可以极大地增强 Vim 的功能. 那么去哪里下载插件呢? 插件怎么安装和管理呢, 听我慢慢道来.

先说到哪里去找插件, 这里列出两个网站:

  • 官方插件网址 界面丑, 速度慢, 有时候还打不开, 不建议使用...
  • 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 依赖, 有这么几点需要确认:

  1. 确认 Vim 本身支持调用 Python. 通过 :version 命令, 可以看到 Vim 的版本信息以及支持的特性信息, 如果你能看到如下信息, 则说明 Vim 支持调用 Python:
+python/dyn
+python3/dyn
复制代码
  1. 确认 Vim 支持的 Python 版本, 同样使用 version 命令查看, 在此命令输出的最下面可以看到如下信息:
-DDYNAMIC_PYTHON_DLL=\"python27.dll\"
-DDYNAMIC_PYTHON3_DLL=\"python36.dll\"
复制代码

这说明 Vim 支持 Python 2.7 和 Python 3.6 3. 32位的 Vim 只能调用 32 位的 Python, 同理, 64位的 Vim 只能调用 64位的 Python, 要查看 Vim 的版本, 还是使用 version 命令. 4. 系统中需要安装了对应的 Python 版本. 5. 在命令模式下验证是否真的没问题. 例如 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
" <leader>h 切换显示
nnoremap <leader>h :NERDTreeToggle<cr>
复制代码

关于 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", 这也是官方文档中的称呼

使用方法

  1. 删除 surroundings 指令为 ds (Delete Surroudings), 可以将文本两边的 surroundings 删掉, 用法为 ds<surrounding>, 看下面几个例子(星号表示光标的位置):

Old Text

command

New Text

"Hello *world!"

ds"

Hello *world

(123+4*56)/2

ds)

123+4*56/2

<div>Yo!*</div>

dst

Yo!*

注意, dst 这个指令中, t 是个文本对象, a tag, surround 中的文本对象和 Vim 中的一致.

  1. 改变 surroundings 指令为 cs (Change Surroundings), 可以改变文本两边的 surroundings, 用法为: cs<old surrounding><new surrouding>, 下面给出几个例子:

Old text

Command

New text ~

"Hello *world!"

cs"'

'Hello world!'

"Hello *world!"

cs"<q>

<q>Hello world!</q>

(123+4*56)/2

cs)]

[123+456]/2

(123+4*56)/2

cs)[

[ 123+456 ]/2

<div>Yo!*</div>

cst<p>

<p>Yo!</p>

除了 cs 指令, 还有一个 cS 指令, 给当前文本替换 surroundings 的时候, 会给当前文本单独 分配一行, 并进行代码格式化.

  1. 添加 surroundings 指令为 ys (You Surroundings), 给文本添加 surroundings, 用法为 ys<text object><surrounding>, 下面给出一些例子:

Old text

Command

New text ~

Hello w*orld!

ysiw)

Hello (world)!

Ti*tle

ysiw<h1>

<h1>Title</h1>

很Geek的做法

ysiw<space><space>

很 Geek 的做法

有一个特殊指令: yss, 可以对当前行添加 surroundings, 添加时自动忽略两边的空格:

Old text

Command

New text ~

Hello w*orld!

yssB

{Hello world!}

类似 cS, yS 也可以在给文本添加 surroundings 的时候给文本单独分行并进行代码格式化, 而 ySS 则可以给当前行添加 surroundings, 并且格式化

  1. 可视模式指令 按 v 进入可视模式, 接下来按 S<surrounding> 可以给选中的文本添加 surroundings

我的一些配置

写文档时, 在中英文混输的情况下, 最好在英文单词两边加上空格, 看着比较舒服, 也比较规范, 但是有时候经常忘记, 所以我定义了如下快捷键:

" 给单词两边加上空格
nmap <leader><space><space> ysiw<space><space>
" 给单词左边加上空格
nmap <leader><space>h wbi<space><esc>w
" 给单词右边加上空格
nmap <leader><space>l ea<space><esc>b
复制代码

这些配置依赖 surround.vim, 所以要先装插件. 另外, 有了 repeat.vim 这个插件, 这些指令也是可以使用 . 进行重复的, 很方便.

SuperTab

上古神器, 在插入模式下使用 Tab 键进行补全. 帮助文档: help supertab

用法其实很简单, 这里给一个文档中的例子:

> Example ('|' denotes the cursor location):  
> bar  
> baz  
> b|`<Tab>`    Hitting `<Tab>` 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 这个单词上:

<cursor>Lorem ipsum dolor sit amet.

<cursor> 表示你现在光标的所在处, 你需要输入四次 w. 但是使用 EasyMotion 的话, 你可以使用这个指令: <leader><leader>w, 你会发现每个单词的首字母都被高亮成一个新的不重复的字母了, 你直接按被高亮的那个字母, 就可以跳过去了.

同样的, 如果你想跳到某一个出现字母 o 的地方, 你可以使用 <leader><leader>fo, 那么所有字母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 用起来更舒服.