標籤:

vim有哪些插件管理程序?都有些什麼特點?


非折騰用戶來拋個磚:

早些年,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 大神總結的?應該很全面了)


我來說一個新的:使用 packadd 等命令。特點:Vim 8 以上無需額外安裝,原生支持的。


  • pathogen 讓每個插件佔有一個單獨的目錄,解決插件文件分散的問題。 安裝了 pathogen 以後只要在 ~/.vim (註:MS Windows 下貌似是 ~vimfiles,下同)里建立一個 bundle 目錄,然後把所有插件一一放在 ~/.vim/bundle/插件名 下面,就可以使用。 插件的安裝過程與沒有 pathogen 時類似,但從安裝結束開始,一切的插件管理過程都能得到簡化。試用過某個插件以後需要刪除?安裝在 bundle 目錄里最後把插件的目錄一刪了之就行了。想保持使用某個插件的最新版本?直接從插件的倉庫 checkout 一份代碼到 bundle 目錄,或者別的地方再 symlink 一下就行了。
  • vundle, 更是把git操作整合進去,用戶需要做的只是去Github上找到自己想要的插件的名字,安裝,更新和卸載都可有vundle來完成了。雖然去發現一個好的插件仍然是一個上下求索的過程,但是用戶已經可以從安裝配置的繁瑣過程解脫了。

    Vundle的具體介紹查看vim.org,或者github repo
  • neoBundle 是一個基於 Vundle 的項目,如同 Vundle,它們都可以安裝和升級插件。然而 NeoBundle 的說明文件上明確指出:「NeoBundle 不是一個穩定的插件管理器,如果你想要一個穩定的,請選擇 Vundle」。最新的 release-note 上也有警告「可能會造成兼容性問題」——這是一個開發者寫的註解,說明這個管理器還不能讓人放心使用。所以,我們為什麼要使用 NeoBundle?它都不能保證穩定運行!好吧,它還是有可取之處的。Vundle 只支持 Git 這種版本控制系統,而 NeoBundle 可以支持 Subversion 和 Mercurial。另一個原因是如果你不想插件升級時破壞你的 Vim 生態環境,你可以鎖住 NeoBundle,讓它只使用某個插件的固定版本。


推薦閱讀:

如何使 Vim 下開發 Python 調試更方便?
各位的編輯器一般用什麼主題?
用 Vim 寫 Python 的最佳實踐是什麼?
替換兩個 Tags 之間字元串的 VIM 命令怎麼寫?(或者, g 的輸出如何作為 s 的輸入?)
你有哪些絕妙高效處理文本操作的經歷?

TAG:Vim | Vim插件 |