Vim的插件配置方式,在你僅僅添加一個文件來自定義自己的Vim體驗時很合理, 但當你想要使用別人寫的插件時,這種方式會導致一團糟。
在過去,要想使用別人寫好的插件,你得下載所有文件并逐一正確地放置它們。 你也可能使用`zip`或`tar`來替你做放置的工作。
在這個過程中有些明顯的問題:
* 當你想更新插件的時候怎么辦?你可以覆蓋舊的文件, 但如果作者刪除了某個文件,你怎么知道你要手工刪除對應文件?
* 假如有兩個插件正好使用了同樣的文件名(比如`utils.vim`或別的更大眾的名字)呢? 有時你可以簡單地重命名掉它,但如果它位于`autoload/`或別的名字相關的文件夾中呢? 你改掉文件名,就等于改掉插件。這一點也不好玩。
人們總結出一系列hacks來讓事情變得簡單些,比如Vimball。 幸運的是,我們不再需要忍受這些骯臟的hacks。?[Tim Pope](http://tpo.pe/)創造了著名的[Pathogen](http://www.vim.org/scripts/script.php?script_id=2332)插件讓管理大量插件變得輕松愉快, 只要插件作者神志清醒地安排好插件結構。(譯注:現在推薦[vundle](https://github.com/gmarik/vundle)來代替Pathogen,前者支持使用git下載插件)
讓我們了解一下Pathogen的工作方式,以及為了讓我們的插件更加兼容,我們需要做的事。
## 運行時路徑
當Vim在特殊的文件夾,比如`syntax/`,中查找文件時,它不僅僅只到單一的地方上查找。 就像Linux/Unix/BSD系統上的`PATH`,Vim設置`runtimepath`以便查找要加載的文件。
在你的桌面創建`colors`文件夾。在這個文件夾中創建一個叫`mycolor.vim`的文件(在本示例中你可以讓它空著)。 打開Vim并執行這個命令:
~~~
:color mycolor
~~~
Vim將顯示一個錯誤,因為它不懂得去你的桌面查找。現在執行這個命令:
~~~
:set runtimepath=/Users/sjl/Desktop
~~~
當然,你得根據你的情況修改路徑名。現在再嘗試color命令:
~~~
:color mycolor
~~~
這次Vim找到了`mycolor.vim`,所以它將不再報錯。由于文件是空的,它事實上什么都沒_做_, 但由于它不再報錯,我們確信它找到了。
## Pathogen
Pathogen插件在你加載Vim的時候自動地把路徑加到你的`runtimepath`中。 所有在`~/.vim/bundle/`下的文件夾將逐個加入到`runtimepath`。(譯注:vundle也是這么做的)
這意味著每個`bundle/`下的文件夾應該包括部分或全部的標準的Vim插件文件夾,比如`colors/`和`syntax/`。 現在Vim可以從每個文件夾中加載文件,而且每個插件文件都獨立于自己的文件夾中。
這么一來更新插件就輕松多了。你只需要整個移除舊的插件文件夾,并迎來新的版本。 如果你通過版本控制來管理`~/.vim`文件夾(你應該這么做), 你可以使用Mercurial的subrepo或Git的submodule功能來直接簽出(checkout)每個插件的代碼庫, 然后用一個簡單的`hg pull; hg update`或`git pull origin master`來更新。
## 成為Pathogen兼容的
我們計劃讓我們的用戶通過Pathogen安裝我們寫的Potion插件。 我們需要做的:在插件的代碼庫里,放置我們的文件到正確的文件夾中。就是這么簡單!
我們插件的代碼庫展開后看起來就像這樣:
~~~
potion/
README
LICENSE
doc/
potion.txt
ftdetect/
potion.vim
ftplugin/
potion.vim
syntax/
potion.vim
... etc ...
~~~
我們把它放置在GitHub或Bitbucket上,這樣用戶就能簡單地clone它到`bundle/`,一切順利!
## 練習
如果你還沒有安裝[vnudle][],安裝它。(譯注:原文是安裝[Pathogen](http://www.vim.org/scripts/script.php?script_id=2332),但是沒有必要啦)
給你的插件創建Mercurial或Git代碼庫,起名叫`potion`。 你可以把它放到你喜歡的地方,并鏈接到`~/.vim/bundle/potion/`或就把它直接放到`~/.vim/bindle/potion/`。
在代碼庫中創建`README`和`LICENSE`文件,然后commit。
Push到Bitbucket或GitHub。
閱讀`:help runtimepath`。
- 前言
- 鳴謝
- 預備知識
- 打印信息
- 設置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區的選項設置和映射
- 自動命令
- 本地緩沖區縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態條
- 負責任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數
- 函數參數
- 數字
- 字符串
- 字符串函數
- Execute命令
- Normal命令
- 執行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環
- 字典
- 切換
- 函數式編程
- 路徑
- 創建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?