參考文章
- vim有哪些插件管理程序饰剥?都有些什么特點(diǎn)汰蓉?
- 使用vundle進(jìn)行插件管理(vim筆記二)
- 【Vim】使用Vundle管理配置Vim基本插件
- NERDTree 快捷鍵輯錄
- 如何系統(tǒng)學(xué)習(xí)Vim配置
Vim插件管理程序的發(fā)展
作者:LiTuX
鏈接:https://www.zhihu.com/question/24294358/answer/27362814
來源:知乎
著作權(quán)歸作者所有古沥,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)。
早些年太颤,vim 插件只能自己扔到 ~/.vim 或者 vimfiles 里面盹沈,由于插件的結(jié)構(gòu)很 unix,于是同一個(gè)插件岗憋,plugin, ftplugin, doc, syntax 等等文件夾下面灰趁混亂的存在著各種東西拧廊,而且要用戶自己管理安裝、升級(jí)凰盔、卸載倦春、配置睁本。好特么煩!
然后屁倔,*nix 平臺(tái)上有人受不了了暮胧,弄過幾個(gè)獨(dú)立的第三方插件管理器往衷,比如這里面有個(gè)東東叫 vim addon manager(請(qǐng)記住這個(gè)名字 XD)(當(dāng)然严卖,請(qǐng)?jiān)徫蚁剩€有好幾個(gè)類似的東東我都忘了叫啥了,有誰知道歡迎補(bǔ)充)福铅。vam 是 ruby 寫的一個(gè)包滑黔,看名字就知道丫是干嘛用的,不過……我沒用過它所以沒法評(píng)價(jià)(曾經(jīng)“用過”的一個(gè)第三方管理器叫 vimana庵佣,什么表現(xiàn)嘛我就不記得了)汛兜。
但這種第三方的一般都是某種腳本語(yǔ)言寫的粥谬,在 *nix 上還好帝嗡,讓我們 windows 用戶腫么辦……然后,有個(gè)灰常霸氣的東東出現(xiàn)了狮辽,——vimball巢寡。這貨可以看做是 vim 界的 docstrip(其實(shí)更簡(jiǎn)潔)抑月,簡(jiǎn)直是個(gè)神器。從此裝插件易如反掌题诵,麻麻再也不用擔(dān)心我不會(huì)裝插件啦性锭!三個(gè)咒:
vim XXX.vba
:so %
:q
直接搞定了有木有叫胖!卸載也就一行命令的事(嗯瓮增?好像沒用過哎)。唯一需要對(duì)付的是拳恋,——你要的插件需要提供那個(gè) vba 才行(而且這個(gè)插件應(yīng)該是純 vim script)诅岩。
于是這就有了限制。那其他的呢尤其是提供 zip/tarball 的咋辦鸳谜∈酵ⅲ基于 vimball 修改 runtimepath 的理念滑废,一個(gè)更加沒有限制的插件“管理器”誕生了,這貨叫 pathogen(by tpope 大神)薛闪。只需把你的 tarball 整個(gè)解到 pathogen 的管理目錄(bundle)下豁延,vimrc 稍作處理腊状,這個(gè)插件就可以用啦缴挖!曾經(jīng)那個(gè)混亂的目錄結(jié)構(gòu) sayonara~~ 插件管理變成文件管理映屋,很方便有木有!
可是倔毙,懶惰的人們嫌這個(gè)還不夠。剛好卵蛉,github 流行起來傻丝,很多 vim 插件的作者都將插件放到 github 上托管葡缰。于是有人通過 git module 來管理自己的 vim 插件忱反,以達(dá)到“一份 vimrc 走遍天下”的目的温算,不需要自備 vimfiles 目錄间影。在這個(gè)背景下魂贬,劃時(shí)代的插件管理器終于誕生了,這貨叫 vundle(by gmarik宣谈。順便提一句闻丑,vundle 剛不久前經(jīng)歷了一次大版本升級(jí)萝嘁,主要命令發(fā)生了變化酸钦,請(qǐng)用戶注意)卑硫。
vundle 誕生之后蚕断,很長(zhǎng)時(shí)間內(nèi)這成為了眾多 vimmer 的標(biāo)配(至今仍是)亿乳,這貨一定程度上真正達(dá)到了一個(gè) vimrc 搞定一切的“終極”目標(biāo)葛假,——對(duì)大部分插件尤其全部是 vim script 至多依賴 +python/+lua 等的插件而言,vundle 足夠方便足夠簡(jiǎn)潔抱究,并且有著足夠?qū)嵱玫墓芾矸绞剑喊惭b鼓寺、升級(jí)妈候、停用、卸載都僅需一條命令醋安,必須是 life changing 的評(píng)分吓揪。唯一需要的是所计,你用的插件在 github 上有對(duì)應(yīng)的 repo主胧,或者 http://vim.org 上注冊(cè)存在踪栋,并且你要有個(gè)能用的 git。
然后眷唉,某些高級(jí)別的插件冬阳,使得 vundle 又“不夠用”了党饮。我們知道刑顺,大部分 vim 插件都是腳本蹲堂,但是仍然存在一些插件會(huì)自帶個(gè) lib(打個(gè)廣告,鄙人的 vimcaps 也屬于這類),那么能犯,如果插件作者釋出的是 lib 的源碼踩晶,或者 lib 依賴于平臺(tái)需要本地編譯渡蜻,vundle 模式的“東西取下來,加路徑”等一坨設(shè)定就不夠用了排苍,——我們的 lib 要編譯過淘衙,插件才能用彤守;又或者哭靖,很多牛人做了不少插件之后试幽,將其中的某些部分抽取出來抡草,于是插件之間有依賴關(guān)系(WTF?嫡稹),單獨(dú) :Plugin 一個(gè)插件可能不夠屏箍,又或者赴魁,有人不喜歡 github 而是把東西扔到 bitbucket or somewhere else(目前 vundle 已經(jīng)支持非 github 的 repo)或者我用的是 svn 呢啊 hg 呢啊……在這些越來越復(fù)雜的需求下颖御,人們不滿足于 vundle 提供的便利性凝颇,(好吧你或許猜到了我要說的是 Shougo 大神升級(jí)版 vundle)neobundle 被造了出來。這貨既然號(hào)稱下一代的 vundle瘪弓,自然比 vundle 要牛 X 一些腺怯,比如針對(duì) post install action川无,neobundle 可直接在 vimrc 中配置動(dòng)作舀透,更加方便懶人們拿一個(gè) vimrc 扔到機(jī)器上稍微初始化下就得到熟悉的工作環(huán)境這個(gè)需求愕够。然而,這貨我沒用過惑芭,細(xì)節(jié)之處無法評(píng)價(jià)坠狡。不過鑒于 Shougo 大神的作品質(zhì)量一直很高,相信這個(gè)管理器也不例外遂跟。BTW逃沿,如果用了 Shougo 大神自己的 vimproc,這貨可以異步安裝/更新插件幻锁。當(dāng)然凯亮,Shougo 大神很謙遜的表示,這個(gè)“下一代”可能還不夠穩(wěn)定哄尔,追求穩(wěn)定的同志還請(qǐng)繼續(xù)使用 vundle。
接下來岭接,鄙人一直在用的插件管理器要登場(chǎng)啦富拗!還記得最開始要你記住的那個(gè)名字么?Bingo鸣戴,vim addon manager啃沪,相信你在試著搜索這個(gè)名字的時(shí)候,Google 給出的應(yīng)該是我現(xiàn)在提到的這個(gè)(by MarcWeber 大神)窄锅,而不是前面那個(gè) Ruby 的應(yīng)用 XD创千。(And 接下來讓我們簡(jiǎn)稱它 VAM 吧)
VAM 完全不同于 vundle 及類似物(是的,除了 neobundle 之外,還有其他相似的管理器哦)签餐,而且 VAM 灰常龐大寓涨,提供了各種至少很炫酷很碉堡的功能例如:按插件名字搜索,插件名稱補(bǔ)全氯檐,自動(dòng)解決依賴關(guān)系、(一定程度上)自動(dòng)保存本地修改等等体捏。所以在我看來冠摄,一直到 VAM 誕生,vim 才算是有了真正意義上的“插件管理器”几缭,你不再需要在意你要的插件到底是 http://vim.org 上的河泳,github 上的,bitbucket 上的還是 google code 上年栓,不需要關(guān)心到底是 git拆挥,hg,svn某抓,甚至 http://vim.org 上的 zip纸兔,tgz,bz2 甚至 vimball……所有 dirty 的東西統(tǒng)統(tǒng)不用你管否副,你只需要知道你想要的插件在 VAM 的數(shù)據(jù)庫(kù)中叫什么(而且好消息是汉矿,MarcWeber、Shougo 等人已經(jīng)聯(lián)手弄了個(gè) vim-pi 的數(shù)據(jù)庫(kù)方便各種插件管理器共享插件信息)备禀,雖然在初期洲拇,插件的名字曾經(jīng)發(fā)生過變化(不知道現(xiàn)在穩(wěn)定下來沒有)、插件名稱可能不太好記曲尸、插件名稱區(qū)分大小寫所以容易弄混……
可是赋续!盡管我是 VAM 用戶,不得不說這貨灰常龐大復(fù)雜另患,很多高級(jí)功能至今我也沒弄明白纽乱,只是按照我目前的配置,it works 而且 work 的還不錯(cuò)這樣柴淘。
總結(jié)迫淹,目前主流比較流行的 vim 插件管理(僅依賴 vim)主要是這四家:Pathogen、Vundle为严、NeoBundle 和 VAM敛熬,最主要需要考慮的幾點(diǎn)有:Vundle 的用戶相對(duì)最多而且使用比較簡(jiǎn)潔方便;NeoBundle 功能更加強(qiáng)大第股,可以指定特定版本应民;VAM 只需要大體上記住插件名字就可以使用,模糊匹配和補(bǔ)全功能,自動(dòng)解決依賴關(guān)系诲锹。
與 Ruby/perl 版本的管理器相比繁仁,這四家都會(huì)改 rtp,從而使得 autoload 延遲加載時(shí) vim 的搜索路徑增多(尤其安裝的插件多了之后)归园,可能會(huì)影響到 vim 的速度黄虱。
And 我快寫完的時(shí)候,找到了這個(gè):topic/vim plugin managment (MarcWeber 大神總結(jié)的庸诱?應(yīng)該很全面了)
Vundle
1.安裝vundle
$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
2.配置.vimrc
將Vundle的配置說明復(fù)制到.vimrc(~
下沒有就創(chuàng)建一個(gè).vimrc)的頂部,配置說明中的插件如果你不需要,可以刪掉(Vundle以前插件的關(guān)鍵字是"Bundle",現(xiàn)在是Plugin
).
附我當(dāng)時(shí)安裝時(shí)的配置說明:
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
對(duì)上面的配置說明做一些解釋(中文部分):
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捻浦,寫在下方,只要作者名/項(xiàng)目名就行了,如樣例中的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庫(kù),則直接寫Git地址,如下面的樣例
" Git plugin not hosted on GitHub
" Command-T是一個(gè)基于Ruby和C擴(kuò)展實(shí)現(xiàn)的快速文件瀏覽的插件朱灿,類似TextMate的Go to
" File(Command+T呼出)功能,或Eclipse的Open Resource(Command+Shift+r)功
" 能钠四,可以通過模糊匹配快速定位并打開文件盗扒。
Plugin 'git://git.wincent.com/command-t.git'
" d)如果有本機(jī)插件,可以按下面的樣例撰寫
" git repos on your local machine (i.e. when working on your own plugin)
" Plugin 'file:///home/gmarik/path/to/plugin'(我將其注掉了,因?yàn)槲覜]有本機(jī)插件,否則會(huì)引起安裝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
" 下面就是你自己的一些配置(因?yàn)関undle的配置說明是置頂?shù)?
" Put your non-Plugin stuff after this line
3.啟動(dòng)Vim,輸入:PluginInstall
4.安裝你想要的插件
按照步驟2中的介紹,編輯好.vimrc,保存退出當(dāng)前的vim,重新打開vim,在命令模式下輸入PluginInstall
5.移除不想要的插件
編輯.vimrc文件移除的你要移除的插件行,保存退出當(dāng)前的vim,重打開vim,在命令模式下輸入命名PluginClean
總結(jié)下vundle常用命令:
:PluginList -列舉列表(也就是.vimrc)中配置的所有插件
:PluginInstall -安裝列表中的全部插件
:PluginInstall! -更新列表中的全部插件
:PluginSearch foo -查找foo插件
:PluginSearch! foo -刷新foo插件緩存
:PluginClean -清除列表中沒有的插件
:PluginClean! -清除列表中沒有的插件
spf13
還沒怎么具體用vundle,我就采用了spf13的打包配置,一鍵安裝...
NERDTree
NERDTree是一個(gè)用于瀏覽文件系統(tǒng)的樹形資源管理外掛,它可以讓你像使用Windows檔案總管一樣在VIM中瀏覽文件系統(tǒng)并且打開文件或目錄。
vimrc配置信息:
Bundle 'scrooloose/nerdtree'
'' 配置F2快捷鍵開啟
map <F2> :NERDTreeToggle<CR>
" 在 vim 啟動(dòng)的時(shí)候默認(rèn)開啟 NERDTree(autocmd 可以縮寫為 au) autocmd VimEnter * NERDTree
" 將 NERDTree 的窗口設(shè)置在 vim 窗口的右側(cè)(默認(rèn)為左側(cè)) let NERDTreeWinPos="right"
" 當(dāng)打開 NERDTree 窗口時(shí)缀去,自動(dòng)顯示 Bookmarks let NERDTreeShowBookmarks=1
切換工作臺(tái)和目錄:
ctrl + w + h 光標(biāo) focus 左側(cè)樹形目錄
ctrl + w + l 光標(biāo) focus 右側(cè)文件顯示窗口
ctrl + w + w 光標(biāo)自動(dòng)在左右側(cè)窗口切換
ctrl + w + r 移動(dòng)當(dāng)前窗口的布局位置
o 在已有窗口中打開文件侣灶、目錄或書簽,并跳到該窗口
go 在已有窗口 中打開文件朵耕、目錄或書簽炫隶,但不跳到該窗口
t 在新 Tab 中打開選中文件/書簽,并跳到新 Tab
T 在新 Tab 中打開選中文件/書簽阎曹,但不跳到新 Tab
i split 一個(gè)新窗口打開選中文件伪阶,并跳到該窗口
gi split 一個(gè)新窗口打開選中文件,但不跳到該窗口
s vsplit 一個(gè)新窗口打開選中文件处嫌,并跳到該窗口
gs vsplit 一個(gè)新 窗口打開選中文件栅贴,但不跳到該窗口
! 執(zhí)行當(dāng)前文件
O 遞歸打開選中 結(jié)點(diǎn)下的所有目錄
x 合攏選中結(jié)點(diǎn)的父目錄
X 遞歸 合攏選中結(jié)點(diǎn)下的所有目錄
e Edit the current dif
雙擊 相當(dāng)于 NERDTree-o
中鍵 對(duì)文件相當(dāng)于 NERDTree-i,對(duì)目錄相當(dāng)于 NERDTree-e
D 刪除當(dāng)前書簽
P 跳到根結(jié)點(diǎn)
p 跳到父結(jié)點(diǎn)
K 跳到當(dāng)前目錄下同級(jí)的第一個(gè)結(jié)點(diǎn)
J 跳到當(dāng)前目錄下同級(jí)的最后一個(gè)結(jié)點(diǎn)
k 跳到當(dāng)前目錄下同級(jí)的前一個(gè)結(jié)點(diǎn)
j 跳到當(dāng)前目錄下同級(jí)的后一個(gè)結(jié)點(diǎn)
C 將選中目錄或選中文件的父目錄設(shè)為根結(jié)點(diǎn)
u 將當(dāng)前根結(jié)點(diǎn)的父目錄設(shè)為根目錄熏迹,并變成合攏原根結(jié)點(diǎn)
U 將當(dāng)前根結(jié)點(diǎn)的父目錄設(shè)為根目錄檐薯,但保持展開原根結(jié)點(diǎn)
r 遞歸刷新選中目錄
R 遞歸刷新根結(jié)點(diǎn)
m 顯示文件系統(tǒng)菜單
cd 將 CWD 設(shè)為選中目錄
I 切換是否顯示隱藏文件
f 切換是否使用文件過濾器
F 切換是否顯示文件
B 切換是否顯示書簽
q 關(guān)閉 NerdTree 窗口
? 切換是否顯示 Quick Help
切換標(biāo)簽頁(yè):
:tabnew [++opt選項(xiàng)] [+cmd] 文件 建立對(duì)指定文件新的tab
:tabc 關(guān)閉當(dāng)前的 tab
:tabo 關(guān)閉所有其他的 tab
:tabs 查看所有打開的 tab
:tabp 前一個(gè) tab
:tabn 后一個(gè) tab
標(biāo)準(zhǔn)模式下:
gT 前一個(gè) tab
gt 后一個(gè) tab