【CLI】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 <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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容