使用 Git 管理 Vim 插件

2018-03-20 创作不易,请勿屏蔽广告🙏 g

vim 有很多管理插件的插件,例如 vundle、vim-plug、dein 等等。我最早使用的是 vundle,后来迁移到了 vim-plug 上,中间也试用过 dein,但没有发现亮点。这些插件的核心功能就是从 GitHub 下载或者更新插件。而实现这些核心功能并不复杂,git 就是很好的工具。而我自己的配置最终也迁移到了 git 上。

插件的目录结构

所谓的 vim 插件不过一个特殊的文件夹,其主要的结构如下:

一般的插件都有 autoload 和 plugin 两个目录,简单的插件可能只有一个 plugin 目录,支持多种语言的插件会有一个 ftplugin 目录。vim 还支持很多其他功能的目录,大家可以通过 :h runtimepath 查看详细的说明文档。

vim 如何加载插件

在 vim 上执行 :set runtimepath,会有类似输出:

runtimepath=~/.vim,/usr/share/vi...files/after,~/.vim/after

这是一个逗号分割的路径列表,每个路径都是一个插件。vim 会依次执行相应的 viml 文件,载入各种定义文件。在没有插件管理器的年代,安装插件就是将插件对应的目录复制到 ~/.vim。但是,直接使用 ~/.vim 会将不同插件的目录混合到一起,所以很难去更新特定插件(是不是跟 linux 下的软件管理很相似?)。

这时候,各种插件管理器就粉墨登场了,而它们的实质就是在修改这个 runtimepath 变量。

最简单的插件『管理器』

首先,创建一个 ~/.vim 目录,将创建 ~/.vim/vimrc 文件。然后,切换到 ~/.vim 执行 git init 完成准备工作。

vim 从 8.0 开始支持原生插件。 如果插件需要在 vim 启动的时候加载,就放到 ~/.vim/pack/*/start/ 目录。这里的 * 可以是任意目录名,我用的是 vendor,大家随意。如果想在需要的时候加载插件,那就放到 ~/.vim/pack/*/opt/ 目录,在需要的时候运行 packadd name 就可以加载了。

例如,我想在打开 TomL 文件的时候加载 toml 插件,则可以在 vimrc 加一行:

autocmd BufReadPre *.toml packadd toml

并且把 toml 插件放到 ~/.vim/pack/*/opt/toml 就行了。是不是更加简单。

不过要注意,一定得在 BufReadPre 的时候调用 packadd。

复杂版本,不再推荐使用

编辑 `~/.vim/vimrc` 文件,添加如下内容:

for name in systemlist('ls ~/.vim/vendor')
	let path = '~/.vim/vendor/'.name
	execute 'set runtimepath+='.path
endfor

这个 systemlist 的功能跟 system 很像,都是执行 shell 命令,并获取命令的输出结果。但是 systemclist 会将返回结果逐行拆分,生成一个 list 列表。这个 ls ~/.vim/vendor 就是列出 ~/.vim/vendor 目录下的所有目录名称。接着,脚本遍历这个列表,构造出插件的实际目录。最后,通过 execute 执行 set runtimepath+=$path 将插件的目录追加到 runtimepath 变量中。之后,vim 就会自动加载 ~/.vim/vendor 下的插件了。

这是一个只有 4 行的插件管理器。其实它不是一个合格的管理器,因为它只有加载功能,没有管理功能。我们用 git 实现这个管理功能。

git 操作

# 添加插件
git submodule add https://github.com/lvht/mru pack/vendor/mru

# 更新指定插件
git submodule update --init --remote pack/vendor/start/mru
# 更新所有插件
git submodule update --init --remote

# 删除插件
git rm pack/vendor/mru

# 恢复刚才删除的插件,此法可以用于临时禁用插件
git reset HEAD
git checkout .gitmodules
git submodule update --init pack/vendor/start/mru

最后,大家可以使用 git commit 提交自己的改动,并使用 git push 将自己的配置推送到 GitHub 等在线仓库保存。

结语

使用 git 管理 vim 插件具有简单、清晰、不依赖第三方插件的特点。但是,用户需要了解 git 的 submodule 概念、需要了解 vim 的 runtimepath 概念、需要手动执行插件下载后的后续操作(如 composer update、:UpdateRemotePlugins 等),门槛比较高,只适合有一定基础的 vim 用户。