登入  |  English
感謝您對「自由軟體鑄造場」的支持與愛護,十多年來「自由軟體鑄造場」受中央研究院支持,並在資訊科學研究所以及資訊科技創新研究中心執行,現已完成階段性的任務。 原網站預計持續維運至 2021年底,網站內容基本上不會再更動。本網站由 Denny Huang 備份封存。
也紀念我們永遠的朋友 李士傑先生(Shih-Chieh Ilya Li)。
技術專欄 Vimana 簡介

Vimana 簡介

一般來說,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

Meta 檔案以 VIM::Packager 所規範的 Meta 格式來定義該 Script 的 Script ID 以及 該 Script 相依的 Script,或是檢查 Vim 相容版本,或者執行檔檢查。

  • Rakefile

Rakefile 為 Ruby 的 Makefile ,可透過 rake 命令來進行安裝。大多數於 Github 上的 Script 也都會附上 Rakefile。

  • Makefile

Makefile 可透過 make 命令來進行安裝。

  • Auto

自動安裝,偵測該包裝檔案的目錄結構,或是掃描是否有 Vimball 格式的檔案, 再一次安裝到 Vim Runtime 目錄裡。

而文字格式的 Script 則是透過 vim.org 網站上該 Script 提供的 Script 類型來做判斷,但是因為 vim.org 上的 Script 類型又太過空泛,只有 utility , plugin , colors , game 等等幾種類型,所以在文字檔案安裝的部份使用了正規表示示來偵測 Script 內容,以決定 indent , syntax , colorscheme , ftplugin , autoload 等等類別。

以上策略都會依序檢查,如果其中一個安裝失敗,則會執行下一個策略,如果沒有可行的安裝策略那麼使用者會被告知檔案存放的目錄,以進行手動安裝。

安裝 Vimana

從 CPAN 安裝

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_policyurllist 為 CPAN 所使用的鏡射位址,我們需要設置為 https://cpan.nctu.edu.twprerequisites_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 安裝

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 可被自動安裝

如果您有 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 Script

可參考 VIM::Uploader 模組:

讀取安裝紀錄

Vimana 所儲存的安裝紀錄,基本上是 JSON 格式,不過你同時也可以利用 VimL 來讀取:

let record = eval(join(readfile(expand('~/.vim/record/fuzzyfinder'),""))
echo record

Windows 支援

目前已經和日本的 @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




自由軟體鑄造場電子報 : 第 144 期 2010 年 2 月的近期瀏覽器 JS 測試比較

分類: 技術專欄