参考文章
Vim插件管理程序的发展
作者:LiTuX
链接:https://www.zhihu.com/question/24294358/answer/27362814
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
早些年,vim 插件只能自己扔到 ~/.vim 或者 vimfiles 里面,由于插件的结构很 unix,于是同一个插件,plugin, ftplugin, doc, syntax 等等文件夹下面灰常混乱的存在着各种东西,而且要用户自己管理安装、升级、卸载、配置。好特么烦!
然后,*nix 平台上有人受不了了,弄过几个独立的第三方插件管理器,比如这里面有个东东叫 vim addon manager(请记住这个名字 XD)(当然,请原谅我,还有好几个类似的东东我都忘了叫啥了,有谁知道欢迎补充)。vam 是 ruby 写的一个包,看名字就知道丫是干嘛用的,不过……我没用过它所以没法评价(曾经“用过”的一个第三方管理器叫 vimana,什么表现嘛我就不记得了)。
但这种第三方的一般都是某种脚本语言写的,在 *nix 上还好,让我们 windows 用户肿么办……然后,有个灰常霸气的东东出现了,——vimball。这货可以看做是 vim 界的 docstrip(其实更简洁),简直是个神器。从此装插件易如反掌,麻麻再也不用担心我不会装插件啦!三个咒:
vim XXX.vba
:so %
:q
直接搞定了有木有!卸载也就一行命令的事(嗯?好像没用过哎)。唯一需要对付的是,——你要的插件需要提供那个 vba 才行(而且这个插件应该是纯 vim script)。
于是这就有了限制。那其他的呢尤其是提供 zip/tarball 的咋办。基于 vimball 修改 runtimepath 的理念,一个更加没有限制的插件“管理器”诞生了,这货叫 pathogen(by tpope 大神)。只需把你的 tarball 整个解到 pathogen 的管理目录(bundle)下,vimrc 稍作处理,这个插件就可以用啦!曾经那个混乱的目录结构 sayonara~~ 插件管理变成文件管理,很方便有木有!
可是,懒惰的人们嫌这个还不够。刚好,github 流行起来,很多 vim 插件的作者都将插件放到 github 上托管。于是有人通过 git module 来管理自己的 vim 插件,以达到“一份 vimrc 走遍天下”的目的,不需要自备 vimfiles 目录。在这个背景下,划时代的插件管理器终于诞生了,这货叫 vundle(by gmarik。顺便提一句,vundle 刚不久前经历了一次大版本升级,主要命令发生了变化,请用户注意)。
vundle 诞生之后,很长时间内这成为了众多 vimmer 的标配(至今仍是),这货一定程度上真正达到了一个 vimrc 搞定一切的“终极”目标,——对大部分插件尤其全部是 vim script 至多依赖 +python/+lua 等的插件而言,vundle 足够方便足够简洁,并且有着足够实用的管理方式:安装、升级、停用、卸载都仅需一条命令,必须是 life changing 的评分。唯一需要的是,你用的插件在 github 上有对应的 repo,或者 http://vim.org 上注册存在,并且你要有个能用的 git。
然后,某些高级别的插件,使得 vundle 又“不够用”了。我们知道,大部分 vim 插件都是脚本,但是仍然存在一些插件会自带个 lib(打个广告,鄙人的 vimcaps 也属于这类),那么,如果插件作者释出的是 lib 的源码,或者 lib 依赖于平台需要本地编译,vundle 模式的“东西取下来,加路径”等一坨设定就不够用了,——我们的 lib 要编译过,插件才能用;又或者,很多牛人做了不少插件之后,将其中的某些部分抽取出来,于是插件之间有依赖关系(WTF!),单独 :Plugin 一个插件可能不够,又或者,有人不喜欢 github 而是把东西扔到 bitbucket or somewhere else(目前 vundle 已经支持非 github 的 repo)或者我用的是 svn 呢啊 hg 呢啊……在这些越来越复杂的需求下,人们不满足于 vundle 提供的便利性,(好吧你或许猜到了我要说的是 Shougo 大神升级版 vundle)neobundle 被造了出来。这货既然号称下一代的 vundle,自然比 vundle 要牛 X 一些,比如针对 post install action,neobundle 可直接在 vimrc 中配置动作,更加方便懒人们拿一个 vimrc 扔到机器上稍微初始化下就得到熟悉的工作环境这个需求。然而,这货我没用过,细节之处无法评价。不过鉴于 Shougo 大神的作品质量一直很高,相信这个管理器也不例外。BTW,如果用了 Shougo 大神自己的 vimproc,这货可以异步安装/更新插件。当然,Shougo 大神很谦逊的表示,这个“下一代”可能还不够稳定,追求稳定的同志还请继续使用 vundle。
接下来,鄙人一直在用的插件管理器要登场啦!还记得最开始要你记住的那个名字么?Bingo,vim addon manager,相信你在试着搜索这个名字的时候,Google 给出的应该是我现在提到的这个(by MarcWeber 大神),而不是前面那个 Ruby 的应用 XD。(And 接下来让我们简称它 VAM 吧)
VAM 完全不同于 vundle 及类似物(是的,除了 neobundle 之外,还有其他相似的管理器哦),而且 VAM 灰常庞大,提供了各种至少很炫酷很碉堡的功能例如:按插件名字搜索,插件名称补全,自动解决依赖关系、(一定程度上)自动保存本地修改等等。所以在我看来,一直到 VAM 诞生,vim 才算是有了真正意义上的“插件管理器”,你不再需要在意你要的插件到底是 http://vim.org 上的,github 上的,bitbucket 上的还是 google code 上,不需要关心到底是 git,hg,svn,甚至 http://vim.org 上的 zip,tgz,bz2 甚至 vimball……所有 dirty 的东西统统不用你管,你只需要知道你想要的插件在 VAM 的数据库中叫什么(而且好消息是,MarcWeber、Shougo 等人已经联手弄了个 vim-pi 的数据库方便各种插件管理器共享插件信息),虽然在初期,插件的名字曾经发生过变化(不知道现在稳定下来没有)、插件名称可能不太好记、插件名称区分大小写所以容易弄混……
可是!尽管我是 VAM 用户,不得不说这货灰常庞大复杂,很多高级功能至今我也没弄明白,只是按照我目前的配置,it works 而且 work 的还不错这样。
总结,目前主流比较流行的 vim 插件管理(仅依赖 vim)主要是这四家:Pathogen、Vundle、NeoBundle 和 VAM,最主要需要考虑的几点有:Vundle 的用户相对最多而且使用比较简洁方便;NeoBundle 功能更加强大,可以指定特定版本;VAM 只需要大体上记住插件名字就可以使用,模糊匹配和补全功能,自动解决依赖关系。
与 Ruby/perl 版本的管理器相比,这四家都会改 rtp,从而使得 autoload 延迟加载时 vim 的搜索路径增多(尤其安装的插件多了之后),可能会影响到 vim 的速度。
And 我快写完的时候,找到了这个:topic/vim plugin managment (MarcWeber 大神总结的?应该很全面了)
Vundle
1.安装vundle
$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
2.配置.vimrc
将Vundle的配置说明复制到.vimrc(~
下没有就创建一个.vimrc)的顶部,配置说明中的插件如果你不需要,可以删掉(Vundle以前插件的关键字是"Bundle",现在是Plugin
).
附我当时安装时的配置说明:
set nocompatible " be iMproved, required
filetype off " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')
" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim'
" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'tpope/vim-fugitive'
" plugin from http://vim-scripts.org/vim/scripts.html
Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent.com/command-t.git'
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" Avoid a name conflict with L9
Plugin 'user/L9', {'name': 'newL9'}
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - list configured plugins
" :PluginInstall(!) - install (update) plugins
" :PluginSearch(!) foo - search (or refresh cache first) for foo
" :PluginClean(!) - confirm (or auto-approve) removal of unused plugins
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
对上面的配置说明做一些解释(中文部分):
set nocompatible " be iMproved, required
filetype off " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')
" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim'
" 一下是几种不同形式的支持样例
" The following are examples of different formats supported.
" 以后你想安装什么插件可以写在下面,放在vundle#begin 和vundle#end之间
" Keep Plugin commands between vundle#begin/end.
" a)如果你的插件来自github,写在下方,只要作者名/项目名就行了,如样例中的tpope/vim-fugitive
" plugin on GitHub repo
Plugin 'tpope/vim-fugitive'
" b)如果插件来自 vim-scripts,你直接写插件名就行了,如样例中的L9
" plugin from http://vim-scripts.org/vim/scripts.html
Plugin 'L9'
" c)如果插件来自非GitHuB的Git库,则直接写Git地址,如下面的样例
" Git plugin not hosted on GitHub
" Command-T是一个基于Ruby和C扩展实现的快速文件浏览的插件,类似TextMate的Go to
" File(Command+T呼出)功能,或Eclipse的Open Resource(Command+Shift+r)功
" 能,可以通过模糊匹配快速定位并打开文件。
Plugin 'git://git.wincent.com/command-t.git'
" d)如果有本机插件,可以按下面的样例撰写
" git repos on your local machine (i.e. when working on your own plugin)
" Plugin 'file:///home/gmarik/path/to/plugin'(我将其注掉了,因为我没有本机插件,否则会引起安装vundle的失败)
" e)如果来自子目录,给出runtimepath(rtp),用键值rtp,如下面的样例
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" f)避免命名冲突,可以用键值name
" Avoid a name conflict with L9
Plugin 'user/L9', {'name': 'newL9'}
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
" vundle常用命令
" Brief help
" :PluginList - list configured plugins
" :PluginInstall(!) - install (update) plugins
" :PluginSearch(!) foo - search (or refresh cache first) for foo
" :PluginClean(!) - confirm (or auto-approve) removal of unused plugins
" :h获取更多帮助
" see :h vundle for more details or wiki for FAQ
" 下面就是你自己的一些配置(因为vundle的配置说明是置顶的)
" Put your non-Plugin stuff after this line
3.启动Vim,输入:PluginInstall
4.安装你想要的插件
按照步骤2中的介绍,编辑好.vimrc,保存退出当前的vim,重新打开vim,在命令模式下输入PluginInstall
5.移除不想要的插件
编辑.vimrc文件移除的你要移除的插件行,保存退出当前的vim,重打开vim,在命令模式下输入命名PluginClean
总结下vundle常用命令:
:PluginList -列举列表(也就是.vimrc)中配置的所有插件
:PluginInstall -安装列表中的全部插件
:PluginInstall! -更新列表中的全部插件
:PluginSearch foo -查找foo插件
:PluginSearch! foo -刷新foo插件缓存
:PluginClean -清除列表中没有的插件
:PluginClean! -清除列表中没有的插件
spf13
还没怎么具体用vundle,我就采用了spf13的打包配置,一键安装...
NERDTree
NERDTree是一个用于浏览文件系统的树形资源管理外挂,它可以让你像使用Windows档案总管一样在VIM中浏览文件系统并且打开文件或目录。
vimrc配置信息:
Bundle 'scrooloose/nerdtree'
'' 配置F2快捷键开启
map <F2> :NERDTreeToggle<CR>
" 在 vim 启动的时候默认开启 NERDTree(autocmd 可以缩写为 au) autocmd VimEnter * NERDTree
" 将 NERDTree 的窗口设置在 vim 窗口的右侧(默认为左侧) let NERDTreeWinPos="right"
" 当打开 NERDTree 窗口时,自动显示 Bookmarks let NERDTreeShowBookmarks=1
切换工作台和目录:
ctrl + w + h 光标 focus 左侧树形目录
ctrl + w + l 光标 focus 右侧文件显示窗口
ctrl + w + w 光标自动在左右侧窗口切换
ctrl + w + r 移动当前窗口的布局位置
o 在已有窗口中打开文件、目录或书签,并跳到该窗口
go 在已有窗口 中打开文件、目录或书签,但不跳到该窗口
t 在新 Tab 中打开选中文件/书签,并跳到新 Tab
T 在新 Tab 中打开选中文件/书签,但不跳到新 Tab
i split 一个新窗口打开选中文件,并跳到该窗口
gi split 一个新窗口打开选中文件,但不跳到该窗口
s vsplit 一个新窗口打开选中文件,并跳到该窗口
gs vsplit 一个新 窗口打开选中文件,但不跳到该窗口
! 执行当前文件
O 递归打开选中 结点下的所有目录
x 合拢选中结点的父目录
X 递归 合拢选中结点下的所有目录
e Edit the current dif
双击 相当于 NERDTree-o
中键 对文件相当于 NERDTree-i,对目录相当于 NERDTree-e
D 删除当前书签
P 跳到根结点
p 跳到父结点
K 跳到当前目录下同级的第一个结点
J 跳到当前目录下同级的最后一个结点
k 跳到当前目录下同级的前一个结点
j 跳到当前目录下同级的后一个结点
C 将选中目录或选中文件的父目录设为根结点
u 将当前根结点的父目录设为根目录,并变成合拢原根结点
U 将当前根结点的父目录设为根目录,但保持展开原根结点
r 递归刷新选中目录
R 递归刷新根结点
m 显示文件系统菜单
cd 将 CWD 设为选中目录
I 切换是否显示隐藏文件
f 切换是否使用文件过滤器
F 切换是否显示文件
B 切换是否显示书签
q 关闭 NerdTree 窗口
? 切换是否显示 Quick Help
切换标签页:
:tabnew [++opt选项] [+cmd] 文件 建立对指定文件新的tab
:tabc 关闭当前的 tab
:tabo 关闭所有其他的 tab
:tabs 查看所有打开的 tab
:tabp 前一个 tab
:tabn 后一个 tab
标准模式下:
gT 前一个 tab
gt 后一个 tab