这篇文章实在没什么技术含量,不过也凑合着给博客添点内容吧……下面的内容介绍了如何用 Vundle 插件管理器进行 Vim 插件管理,以及配合 Git 的 submodule 功能进行不同平台的 Vim 配置同步。
在介绍 Vundle 之前,先简单讲一下 Vim 的插件管理机制。Vim 启动时会从配置文件里面加载 runtime path ,然后从各个运行时路径的某些特定目录里加载插件,如 plugin, indent, ftplugin 等。可在 Vim 里通过下面命令察看 runtime path :
1 | :set rtp? |
Vim 安装目录下提供了 Vim 内置的插件,包括各种语言的缩进、语法说明等。而由用户定制的插件一般放在个人文件夹目录下,*nix 下一般为 ~/.vim
,Windows 下为 ~\vimfiles
。而每当安装一个新插件时,一般是向诸如 plugin, indent, ftplugin 这些文件夹中放置该插件的文件。而 Vim 本身并没有提供包管理机制,导致了安装和卸载插件都只能通过繁琐的文件操作来完成。
插件如此之多的 Vim 怎么可以没有一个插件管理器?在 Vim 强大的插件机制下,众多程序猿们便发挥了自己的聪明才智,于是我们便有了 Vundle, pathogen, vim-addon-manager 等等方便好用的插件管理器。由于我只使用过 Vundle ,本文只着重介绍 Vundle 。
Vundle 的安装相当容易,可以参阅 官方文档 。不过我主要在 Windows 平台下工作,需要注意一些小问题:
Windows 版的 Vim 默认使用 ~/vimfiles
作为用户个人文件夹(估计是因为无法在 Explorer 中创建以点号开头的文件或文件夹),但是 Vundle 默认安装在 ~/.vim
文件夹中,而且其工作方式也是以 ~/.vim
文件夹为基础。因此建议 Windows 用户也将 Vundle 及其他插件放在 ~/.vim
文件夹中。此时若 ~/.vim
中存在非 Vundle 管理的插件,则需要在 .vimrc
中添加:
1 | set rtp+=~\.vim\ |
另外,由于 Windows 路径采用反斜杆, Vundle 配置文件中的 set rtp
需要使用 Windows 的目录分隔符:
1 | set rtp+=~\.vim\bundle\vundle\ call vundle#rc() |
Vundle 可以在 .vimrc
中配置要添加的插件,可以是 Github 或者其他 Git 仓库,也可以是 [vim-scripts.org][vim-scripts] 上的插件:
1 | " github repo Bundle 'gmarik/vundle' Bundle 'tpope/vim0fugitive' " non github repo Bundle 'git://git.wincent.com/command-t.git' " vim-script repo Bundle 'L9' |
然后在 Vim 中调用 :BundleInstall
即可安装 .vimrc
中配置的插件,也可以通过 :BundleInstall!
来更新插件。同时可以使用 :BundleInstall <TAB>
方式使 Vundle 列出所有可用的插件,不过这个功能要求 curl
,Windows 用户需要设置 curl
路径,msysgit
有提供 curl
,简单将其添加进环境变量 PATH
即可。
可以看到 Vundle 安装下来的插件,会分别以文件夹的形式存放在 ~/.vim/bundle
中,而且如果是 Git 方式的插件的话,对应的本地文件夹也都是 Git 仓库。而 Vundle 正是利用这点进行插件的安装和升级。
由于我需要同时在 Windows 和 Linux 上工作,因此我想到使用 Github 来进行 .vimrc
及插件的同步。由于很多插件都是 Git 仓库的形式存在,而 Vundle 进其进行更新也是基于 Git 的形式,因此在这里可以使用 Git 的 submodule 功能。可参阅我的 vim-config
仓库 以理解下文内容。
submodule ,顾名思义,就是在一个 Git 仓库中又包含有另外的 Git 仓库。Git 提供了这样一个机制,使大仓库可以通过纪录小仓库的当前 commit 编号来维护小仓库。而小仓库的开发可以独立于大仓库,一旦小仓库有了提交之后,大仓库可以更新其纪录的 commit 编号,表示该子模块所处状态。关于 submodule 的更多内容,可以参阅手册页,或者 这里 。
在我们这个情境里并不需要了解太多 submodule 的知识(不过了解多一点总是好的),只需要简单地在根目录下添加 .gitmodules
文件,并写入我们定义的子仓库信息即可:
1 | [submodule "vundle"] path = .vim/bundle/vundle url = https://github.com/gmarik/vundle.git [submodule "vimwiki"] path = .vim/bundle/vimwiki url = https://github.com/vim-scripts/vimwiki.git [submodule "vim-colors-solarized"] path = .vim/bundle/vim-colors-solarized url = https://github.com/altercation/vim-colors-solarized.git |
这样我的 vim-config
仓库就知道了其中的三个插件的 Git 仓库是什么。
此时,如果我在其他机器上 clone 该仓库,并不会马上将那 3 个 submodule 的内容 pull 下来。此时需要:
1 | git submodule init # 初始化 3 个子模块的远程主机信息 git submodule update # 将其内容 pull 下来 |
这样,我们就基本完成了配置文件和插件的同步。
此外,*nix 系统可以直接通过符号链接,将 ~/.vimrc
文件和 ~/.vim
目录链接至仓库内的对应文件及目录。
1 | $ cd ~ |
Windows 没有符号链接,快捷方式也不是文件系统层面的符号链接,所以可能只能 Copy & Paste 了。有更好的解决办法的童鞋可以留言告诉我 :-)
同步后可能需要处理在不同系统下的不同配置问题,如 .vimrc
中定义 Vundle 的 runtime path:
1 | if has("win32") set rtp+=~\.vim\bundle else set rtp+=~/.vim/bundle endif |