【CLI】Vim插件管理调研

参考文章

  • vim有哪些插件管理程序?都有些什么特点?
  • 使用vundle进行插件管理(vim笔记二)
  • 【Vim】使用Vundle管理配置Vim基本插件
  • NERDTree 快捷键辑录
  • 如何系统学习Vim配置
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 :NERDTreeToggle " 在 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 isplit 一个新窗口打开选中文件,并跳到该窗口 gisplit 一个新窗口打开选中文件,但不跳到该窗口 svsplit 一个新窗口打开选中文件,并跳到该窗口 gsvsplit 一个新 窗口打开选中文件,但不跳到该窗口 !执行当前文件 O递归打开选中 结点下的所有目录 x合拢选中结点的父目录 X递归 合拢选中结点下的所有目录 eEdit the current dif双击相当于 NERDTree-o 中键对文件相当于 NERDTree-i,对目录相当于 NERDTree-eD删除当前书签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

【【CLI】Vim插件管理调研】标准模式下:
gT前一个 tab gt后一个 tab

    推荐阅读