Migrate to Vim native package manager
我原本是用 Pathogen 來管理 Vim 的外掛。 但發現 Vim 自 8.0 (2016-09-12) 之後,官方已推出的內建套件管理機制。
近來趁重灌電腦之際,便順手將 Vim 相關的外掛從 Pathogen 轉移至新的機制。
新的機制是什麼?
-
從原本的一層 plugin ,改爲 package 和 plugin 兩層。一個 package 下可包含多個 plugin。
-
預設以
~/.vim/pack/
作爲放 package 的目錄。 -
提供自動載入及延遲載入(Lazy loading) plugin 的機制:
- 自動載入的目錄位置:
~/.vim/pack/《PACKAGE_NAME》/start/《PLUGIN_NAME》/
- 延遲載入的目錄位置:
~/.vim/pack/《PACKAGE_NAME》/opt/《PLUGIN_NAME》/
- 自動載入的目錄位置:
-
《PACKAGE_NAME》
和《PLUGIN_NAME》
就直接是目錄名稱,可以任意自訂。 -
要新增自動載入的 plugin ,只要將 plugin 直接複製到
~/.vim/pack/《PACKAGE_NAME》/start/
目錄下即可。 -
延遲載入的 plugin 則是複製到
~/.vim/pack/《PACKAGE_NAME》/opt/
目錄下,而之後手動載入的指令爲::packadd 《PLUGIN_NAME》
官方文件
於 Vim 編輯器內透過下列指令,即可取得官方說明內容:
:help packages
或可查閱線上網頁: Vim: repeat.txt – 5. Using Vim packages
這裏不再重複文件已有的內容,而以紀錄過程中遇到的問題及找到的答案爲主。
Q: packpath
的設定值是什麼? 如何顯示?
-
packpath
預設值取自runtimepath
, 即包括有~/.vim/
目錄。 -
查詢
packpath
,rumtimepath
的設定值,指令如下::set packpath :set runtimepath
-
若要顯示 Vim 內的所有設定值,則是用:
:set all :set! all
- 註: 其中
:set!
的部份加了!
的差異是用於一行顯示一個,而非預設的一行顯示多欄。
- 註: 其中
Q: ~/.vim/pack/*/start/
的目錄是只掃描一層,還是深入多層子目錄?
要注意 ~/.vim/pack/
, ~/.vim/pack/*/start/
, 跟 ~/.vim/pack/*/opt/
都只掃描一層子目錄,並無支援下層所有子目錄 (Recursive subdirectories) 的設定。
因此安置 plugin 跟 package 時,要留意目錄的位置。
多一層、少一層就不會如預期般載入。
Q: ftdetect 是什麼?
“ftdetect” 的 “ft” 是指 file type,ftdetect 是用於偵測檔案型別的 script 。
Q: packadd!
加了 !
的差異
有時候會需要 Vim 在完全不載入 plugin 下執行 (ex: debug 或 shell script) ,而使用 vim --noplugin
的選項。
然而,若原先 optional plugin 是在 ~/.vimrc
設定檔或是某處 script 裏以 :packadd 《PLUGIN_NAME》
執行的話,還是會被逕行載入,而與 vim --noplugin
的目的衝突。
若是希望 optional plugin 在 vim --noplugin
的狀況下不被意外載入,可改用 :packadd! 《PLUGIN_NAME》
。兩者的載入條件比較表如下:
vim |
vim --noplugin |
|
---|---|---|
:packadd |
load | load |
:packadd! |
load | not load |
簡單來說,要點有:
- 若在
vim
一般模式,則:packadd
和:packadd!
無差異 - 若要在
vim --noplugin
時不被意外載入, 則使用:packadd!
從 Pathogen 轉移到 Vim native
Step 1: 將外掛從 Pathogen 的目錄搬到新目錄
mkdir -p ~/.vim/pack/default/start/
mv -v -i ~/.vim/bundle/* ~/.vim/pack/default/start/
rmdir ~/.vim/bundle/
註: 這裏的 default
是自訂名稱,可依個人需要更改。
Step 2: 刪除 Pathogen 的檔案
[ -f ~/.vim/autoload/pathogen.vim ] && rm -v ~/.vim/autoload/pathogen.vim
Step 3: 拿掉 Pathogen 的設定
於 ~/.vimrc
中,刪除下列設定
execute pathogen#infect()
完成後,再重新啓動 Vim 程式即可。
軼聞
2010-08-12 聚會時 pct 提到了 pathogen 和 c9s 寫的 Vimana。
關於 Vimana , Tsung 曾寫過一篇 blog 介紹: Vim 的 套件(外掛)管理系統 – Vimana – Tsung’s Blog
2013-03-28 時,yan 也提到 pathogen
2015-01-08 時, peter 提到 vundle
2015-04-09 時, dlin 提到 Shougo/neobundle.vim
2016-11-10 , BestSteve 提到 Vim 8.0 釋出。