Migrate to Vim native package manager

Posted by 每特17劃 on 2023-02-13

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 釋出。