一般來說,Vim Script 的安裝都是到 vim.org 上,搜尋 Script,然後參考該項目的安裝細節來手動安裝。但是每個 Script 的發行、打包的方式又不一樣,所以大部分 Script 的安裝都還是得手動進行。 有的是直接將檔案複製到 Vim 的 Runtime 目錄裡頭即可,有的是得先解壓縮,然後使用 cp 或是 rsync 命令依序照目錄結構複製到 Vim 的 Runtime 目錄裡。Vim 雖然也提供了 Vimball 格式的打包檔,但是也不夠普及。
然而 Perl 有 cpan 命令、Ruby 有 gem 命令、Debian 有 apt-get 命令,Vim 卻因為發行方式不統一而一直沒有一個可用、堪用的工具來做這樣的事情。為了解決這個問題,我的想法是,針對每一個發行的 Script (該 Script 有可能用是 tarball 包裝也可能只是純文字檔案) 來做安裝策略的偵測,於是 Vimana 就誕生了。
為了文字處理的方便性,Vimana 使用 Perl 來實做,相依 CPAN 上的 10 多個模組,來減少重複開發。(DRY) 由於大多相依的模組都可以跨平台,所以要將 Vimana 移植到其他平台如 Windows ,也可以相當容易。
目前針對打包起來的 Script 安裝策略有四種:
Meta 檔案以 VIM::Packager 所規範的 Meta 格式來定義該 Script 的 Script ID 以及 該 Script 相依的 Script,或是檢查 Vim 相容版本,或者執行檔檢查。
Rakefile 為 Ruby 的 Makefile ,可透過 rake 命令來進行安裝。大多數於 Github 上的 Script 也都會附上 Rakefile。
Makefile 可透過 make 命令來進行安裝。
自動安裝,偵測該包裝檔案的目錄結構,或是掃描是否有 Vimball 格式的檔案, 再一次安裝到 Vim Runtime 目錄裡。
而文字格式的 Script 則是透過 vim.org 網站上該 Script 提供的 Script 類型來做判斷,但是因為 vim.org 上的 Script 類型又太過空泛,只有 utility , plugin , colors , game 等等幾種類型,所以在文字檔案安裝的部份使用了正規表示示來偵測 Script 內容,以決定 indent , syntax , colorscheme , ftplugin , autoload 等等類別。
以上策略都會依序檢查,如果其中一個安裝失敗,
Vimana 可透過 cpan 命令直接安裝,但是不用擔心在你的系統上找不到該命令,因為 Perl 幾乎預設存在於各式各樣的平台上 (除了 Windows)。
使用 cpan 命令進入 CPAN Shell (你會需要 root 權限):
# cpan
即可進入 cpan 命令,初次執行 cpan 命令,會詢問您是否要讓 CPAN 自動做設置調整,按 Enter 確定。
Would you like me to configure as much as possible automatically? [yes]
接著會進入 CPAN shell
cpan>
初次使用 cpan 我們需要一些調整,調整 urllist
以及 prerequisites_policy
, urllist
為 CPAN 所使用的鏡射位址,我們需要設置為 https://cpan.nctu.edu.tw
, prerequisites_policy
則為安裝模組時的方法,設置為 follow
:
cpan> o conf prerequisites_policy follow
cpan> o conf urllist unshift https://cpan.nctu.edu.tw/
cpan> o conf commit
如果已經有設置過 cpan 那麼會進入以下的畫面:
# cpan
cpan shell -- CPAN exploration and modules installation (v1.9402)
Enter 'h' for help.
cpan[1]>
接下來便可以安裝 Vimana:
cpan> install Vimana
# ....
cpan> quit
從 Github 可以取得 Vimana 最新的開發版本,您需要已經安裝 Git 版本控制系統,使用 Git 將 Repository 取得,接著安裝:
$ git clone
這個 E-mail 地址已經被防止灌水惡意程式保護,您需要啟用 Java Script 才能觀看
:c9s/Vimana.git
$ cd Vimana
$ perl Makefile.PL
$ sudo make install
首先我們需要取得 vim.org 上得所有套件清單來建立索引檔,很不幸的 vim.org 並無提供任何 API 或是良好的頁面設計,所以這個動作基本上是透過正規表示示 (Regular Expression) 來整理所有的 Script 內容,幸好 vim.org 更動不大,且我們的索引建置相當快速:
$ vimana update
在 Vimana ,所有的 Script 名稱都經過了正規化,去除了所有特殊字元,而只允許 [a-zA-Z0-9-_]
等字元,以統一安裝的 Script 名稱。
接著我們可以做一點搜尋,譬如說 nerd tree:
$ vimana s nerd-tree
the-nerd-tree - A tree explorer plugin for navigating the filesystem
nerd-tree-project - It tries to find out root project directory, browse project file with NERD_tree.
$
第一個欄位便是 Script 名稱,安裝任何 Script 都必須透過正規化過的名稱:
$ vimana install the-nerd-tree
Plugin will be installed to vim runtime path: /Users/c9s/.vim
Canonical name: the-nerd-tree
Downloading from: https://www.vim.org/scripts/ download_script.php?src_id= 11834
Saving file to /var/folders/4o/ 4omYKsGdFEyBuGRUVlwuNU+++TM/- Tmp-/vimana-aovhjd/NERD_tree. zip
Extracting to /var/folders/4o/ 4omYKsGdFEyBuGRUVlwuNU+++TM/- Tmp-/vimana-qgdvmz.
Extracting to: /var/folders/4o/ 4omYKsGdFEyBuGRUVlwuNU+++TM/- Tmp-/vimana-qgdvmz
Changing directory to /var/folders/4o/ 4omYKsGdFEyBuGRUVlwuNU+++TM/- Tmp-/vimana-qgdvmz.
Meta : Check if 'META' or 'VIMMETA' file exists. support for VIM::Packager. ...not ok
Makefile : Check if makefile exists. ...not ok
Rakefile : Check if rakefile exists. ...not ok
Package doesn't contain META,VIMMETA,VIMMETA.yml or Makefile file
No availiable strategy, try to auto-install.
Archive content:
doc/NERD_tree.txt
nerdtree_plugin/exec_menuitem. vim
nerdtree_plugin/fs_menu.vim
plugin/NERD_tree.vim
Initializing vim runtime directories
Basepath found: /var/folders/4o/ 4omYKsGdFEyBuGRUVlwuNU+++TM/- Tmp-/vimana-qgdvmz/
Copying files...
/var/folders/4o/ 4omYKsGdFEyBuGRUVlwuNU+++TM/- Tmp-/vimana-qgdvmz/ => /Users/c9s/.vim
Updating helptags
vim -e -s -c ":helptags /Users/c9s/.vim/doc" -c ":q"
Making checksum...
Cleaning up temporary directory.
Succeed.
Installation Done.
如此便可以直接將 NERD Tree Plugin 安裝完成。
除此之外 search 命令,也可指定 Script 類型:
列出所有色彩主題:
$ vimana search -t color
列出 ftplugin 類型:
$ vimana search -t ftplugin
搜尋 ftplugin 類型,且包含 abc 關鍵字:
$ vimana search -t ftplugin abc
安裝時,也可以指定 Vim Runtime 目錄:
$ vimana install snipmate -r ~/.vim-other-rtp
那麼就可以 snipmate 安裝到 ~/.vim-other-rtp
路徑之下。要讓 Vim 在啟動時,也去載入這個資料夾內的 Script ,只需要在 .vimrc 內加入:
set runtimepath+=~/.vim-other-rtp
如果要移除可透過 remove 命令來移除:
$ vimana remove the-nerd-tree
Removing package the-nerd-tree
Removing /Users/c9s/.vim/doc/NERD_tree. txt
Removing /Users/c9s/.vim/nerdtree_ plugin/exec_menuitem.vim
Removing /Users/c9s/.vim/nerdtree_ plugin/fs_menu.vim
Removing /Users/c9s/.vim/plugin/NERD_ tree.vim
Removing record
Done
如果您有 Script 要發行到 vim.org 上,並且也希望能夠被 Vimana 安裝,可參考以下作法:
Script 只是文字格式檔案,可以直接在 Script 內加上:
" Script type: plugin
來告知 Vimana ,該檔案是 plugin 類型的 Script。
如果 Script 包含了多個檔案,那麼請遵循 Vim Runtime 目錄的結構來放置,例如:
autoload/your_plugin.vim
plugin/your_plugin.vim
doc/your_plugin.vim
README
other_file
如此符合 Vim Runtime 目錄名稱的資料夾便會自動安裝。
或是
foo/autoload/your_plugin.vim
foo/plugin/your_plugin.vim
foo/doc/your_plugin.vim
utils/...
README
other_file
那麼 foo 路徑底下的 Vim Runtime 目錄都會被安裝。
可參考 VIM::Uploader 模組:
Vimana 所儲存的安裝紀錄,基本上是 JSON 格式,不過你同時也可以利用 VimL 來讀取:
let record = eval(join(readfile(expand('~/. vim/record/fuzzyfinder'),""))
echo record
目前已經和日本的 @mattn, Yasuhiro Matsumoto 在進行 Windows 的支援,這些修改進行在 Vimana 的 windows branch 上。基本上已經能在 Windows 上頭順利運作,如果有興趣的朋友也歡迎幫我們測試。
林佑安 (Cornelius),目前在 AIINK(愛印網),以 Perl 語言開發的 Jifty web framework 從事網站開發相關工作。於 CPAN - Perl 模組典藏網維護多個 Perl 模組,參與 Jifty, SD 等 Perl 相關開放原始碼專案 。主要以 Vim 做為開發工具,著有 cpan.vim , perl-completion.vim , perldoc.vim 等多個 vim 相關 Plugin。
Github
Twitter
Plurk
Blog
Google group