### 用户的 Vim 配置目录
Vim 的安装目录你是不应该去修改的。首先,你可能没有权限去修改这个目录;其次,即使你有修改权限,这个目录会在 Vim 升级时被覆盖,你做的修改也会丢失。用户自己的配置应当放在自己的目录下,这也就是用户自己的主目录下的 Vim 配置目录(Unix 下的 .vim,Windows 下的 vimfiles)。这个目录应和 Vim 安装目录下的运行支持文件目录有相同的结构,但下面的子目录你在需要修改 Vim 的相关行为时才有必要创建。如果一个同名文件出现用户自己的 Vim 配置目录里和 Vim 的安装目录里,用户的文件优先。
换句话说,修改 Vim 行为最简单的一种方式,就是把一个系统的运行支持文件复制到自己的 Vim 配置目录下的相同位置,然后修改其内容。我自己常常用这种方式来精调 Vim 的语法加亮。
显然,这种方式的缺点(在适当的时候也是优点)是,如果 Vim 的运行支持文件后来被修改/更新了,你也会继续使用你自己目录下的老版本修改版。如果你的修改不只是你自己的临时方案、同时也适合他人的话,最佳做法还是给 Vim 项目提交补丁,让其他所有人都能用上你的修改,这样才是开源的最佳使用方式。
关于 Vim 的公用脚本,这儿再多说几句。Vim 的网站过去是用来集中获取各种脚本——如插件和配色方案——的地方,而 getscriptPlugin 可以帮助简化这个过程。今天你仍然可以使用这个方法,但 Git 和 GitHub 的广泛使用已经改变了人们获取和更新脚本的方式。现在,最主流的分发 Vim 脚本的方式是利用 GitHub,而用户则使用包管理器来调用 Git 从 GitHub(或类似的 Git 库)获取和更新脚本,下面我们很快就会讲到。
理解了 Vim 的目录结构,我们接着来看 Vim 8 的新功能。
## Vim 8 新功能
Vim 是一个持续改进中的应用程序。从 Vim 8.1(2018 年 5 月 17 日)到 Vim 8.2(2019 年 12 月 12日),Vim 有 2424 个补丁,也就是说,平均每天超过 4 个补丁。很多 Vim 8 里的大功能,并不是一次性引入,而是在补丁中慢慢引入的。比如,Vim 里现在有终端支持,这个功能从 Vim 8.0.0693 开始引入,到了 Vim 8.1,成为一个正式的大功能。
站在我个人的角度看,从 Vim 7.4 到 Vim 8.2,最大的新功能是:
- Vim 软件包的支持(“[`:help packages`](https://yianwillis.github.io/vimcdoc/doc/repeat.html#packages)”)
- 异步任务支持(“[`:help channel`](https://yianwillis.github.io/vimcdoc/doc/channel.html)”、“[`:help job`](https://yianwillis.github.io/vimcdoc/doc/channel.html#job)”和“[`:help timers`](https://yianwillis.github.io/vimcdoc/doc/eval.html#timers)”)
- 终端支持(“[`:help terminal`](https://yianwillis.github.io/vimcdoc/doc/terminal.html)”)
今天我们就重点讲一下 Vim 软件包。这是 Vim 8 里带来的一个重要功能,也让我们在扩展 Vim 的时候变得更方便了。
### Vim 软件包
Vim 的目录结构有点传统 Unix 式:一个功能用到的文件可能会分散在多个目录下。就像传统 Unix 上 Vim 的文件可能分散在 /usr/bin、/usr/share/man、/usr/share/vim 等目录下一样,一个 Vim 的插件(严格来讲,应该叫包)通常也会分散在多个目录下:
- 插件的主体通常在 plugin 目录下
- 插件的帮助文件在 doc 目录下
- 有些插件只对某些文件类型有效,会有文件放在 ftplugin 目录下
- 有些插件有自己的文件类型检测规则,会有文件放在 ftdetect 目录下
- 有些插件有特殊的语法加亮,会有文件放在 syntax 目录下
- ……
以前我们安装插件,一般是一次性安装后就不管了。安装过程基本上就是到 .vim 目录(Windows 上是 vimfiles 目录)下,解出压缩包的内容,然后执行 `vim -c 'helptags doc|q'` 生成帮助文件的索引。到了“互联网式更新”的年代,这种方式就显得落伍了。尤其糟糕的地方在于,它是按文件类型来组织目录的,而不是按相关性,这就没法用 Git 来管理了。
Vim 上后来就出现了一些包管理器,它们的基本模式都是相通的:每个包有自己的目录,然后这些目录会被加到 Vim 的运行时路径(`runtimepath`)选项里。最早的 `runtimepath` 较为简单,在 Unix 上缺省为:
>
`$HOME/.vim,`
`$VIM/vimfiles,`
`$VIMRUNTIME,`
`$VIM/vimfiles/after,`
`$HOME/.vim/after`
这就说明安装成功了。我们可以按 `q` 来退出这个状态窗口。
我们也可以使用 `:PackStatus` 来重新打开这个状态窗口。要删除一个插件,在 vimrc 中删除对应的那行,保存,然后使用 `:PackClean` 命令就可以了。愿意的话,你现在就可以试一下。
### 最近使用的文件
安装好 Vim 软件包之后,我们进一步来实现一个小功能。
Vim 的缺省安装缺了一个很多编辑器都有的功能:最近使用的文件。
我们就把这个功能补上吧。你只需要按照上一节的步骤安装 yegappan/mru 包就可以了(MRU 代表 most recently used)。安装完之后,重新打开 vimrc 文件,你就可以在图形界面里看到下面的菜单了:
估计你很可能会问:如果是远程连接,没有图形界面怎么办?
我们仍可以在文本界面上唤起菜单,虽然美观程度会差点。你需要在 vimrc 配置文件中加入以下内容(同样,我们暂时先不用去理解其意义):
```
if !has('gui_running')
" 设置文本菜单
if has('wildmenu')
set wildmenu
set cpoptions-=<
set wildcharm=<C-Z>
nnoremap <F10> :emenu <C-Z>
inoremap <F10> <C-O>:emenu <C-Z>
endif
endif
```
在增加上面的配置之后,你就可以使用键 `<F10>`(当然你也可以换用其他键)加 `<Tab>` 来唤起 Vim 的文本菜单了。如下图所示:
## 内容小结
本讲我们讨论了 Vim 8 下的基本目录结构和 Vim 8 的软件包。
你需要知道,Vim 的运行支持目录和用户配置目录有相似的结构,用户配置目录下的文件优先于 Vim 安装目录下的文件。因此,在用户配置目录里进行修改,可以在 Vim 版本有变化时保留自己的定制行为。
而 Vim 8 的软件包使得维护 Vim 的扩展变得更为容易,每一个 Vim 软件包都是独立的目录,可以单独安装、修改和升级。包管理器,如 minpac,则可以帮助我们更方便地安装和管理 Vim 软件包。
对于配置文件,适用于本讲的内容标签是 `l4-unix` 和 `l4-windows`。
## 课后练习
请仔细查看一下你的 Vim 安装目录下面的目录结构,对 Vim 的目录结构有一个直观的理解。你也可以打开一些 .vim 文件来看看,初步感受一下 Vim 脚本:如 filetype.vim 里有着 Vim 如何识别文件类型的逻辑,值得大致了解一下——Vim 并不仅仅是用后缀来判断文件类型的!
另外,一定要根据文中的说明,实践一下安装 minpac,及使用 minpac 来安装其他 Vim 软件包(除非你已经在使用另外一个包管理器了)。我们后面会经常性地安装新的软件包,这一部分操作一定需要牢牢掌握。
如有任何问题,请留言和我交流、讨论。我们下一讲见!