既然已經移除前進路上的絆腳石,是時候開始為我們的Potion插件寫下一些有用的代碼。 我們將從一些簡單的語法高亮開始。
在你的插件的repo中創建`syntax/potion.vim`。把下面的代碼放到你的文件里:
~~~
if exists("b:current_syntax")
finish
endif
echom "Our syntax highlighting code will go here."
let b:current_syntax = "potion"
~~~
關閉Vim,然后打開你的`factorial.pn`文件。 你也許或也許不能看到消息,取決于你是否有其他插件在該插件之后輸出消息。 如果你執行`:message`,你將會看到這個文件的確已經加載了。
**注意:**?每次我告訴你打開Potion文件,我是想要你在一個新的Vim窗口或進程里打開,而不是在一個分割或tab。 打開一個新的Vim窗口導致Vim為此重新加載你所有的插件,而打開一個分割則不會。
代碼文件開頭和結尾的那幾行是一個慣用法,如果這個緩沖區的語法高亮已經啟動了,那就無需重新加載。
## 高亮關鍵字
在本章的剩下部分,我們將忽略文件開頭和結尾的`if`和`let`防御墻。不要移除那幾行,只是眼不見為凈而已。
用下面的代碼替換掉文件中的占位符`echom`:
~~~
syntax keyword potionKeyword to times
highlight link potionKeyword Keyword
~~~
關閉`factorial.pn`并重新打開它。`to`和`times`被高亮成你的配色方案中的關鍵字類型了!
這兩行展示了Vim中的基本的語法高亮。為了高亮某個語法:
* 你首先要用`syntax keyword`或相關命令(我們待會會提到),定義一組語法類型。
* 然后你要把這組類型鏈接到高亮組(highlighting groups)。 一個高亮組是你在配色方案里定義的東西,比如"函數名應該是藍色的"。
這可以讓插件作者決定有意義的語法類型分組,然后鏈接到通用的高亮組。 這同時也讓配色方案創作者決定通用的程序結構,而不需要考慮單獨的語言。
除了在我們的玩具程序中用到的,Potion還有其他的關鍵字,所以讓我們修改syntax文件來一并高亮它們。
~~~
syntax keyword potionKeyword loop times to while
syntax keyword potionKeyword if elsif else
syntax keyword potionKeyword class return
highlight link potionKeyword Keyword
~~~
首先要說的是:最后一行沒有改掉。我們依然告訴Vim所有在`potionKeyword`中的內容應該作為`Keyword`高亮。
我們現在新增三行,每行都以`syntax keyword potionKeyword`開頭。 這意味著多次執行這個命令不會_重置_語法類型分組 —— 而是擴增它!這使得你可以化整為零地定義分組。
怎樣定義分組取決于你:
* 你可以僅僅一行密密麻麻地寫滿所有的內容。
* 你可以劃分成幾行,來滿足每行80列的規則以便于閱讀。
* 你可以每一項都獨占一行,來使得diff的結果更加清晰。
* 你可以跟我在這里做的一樣,把相關的項放在同一行。
## 高亮函數
Vim的另一個高亮組是`Function`。這就來加入一些Potion的內置函數到我們的高亮文件。 把你的syntax文件修改成這樣:
~~~
syntax keyword potionKeyword loop times to while
syntax keyword potionKeyword if elsif else
syntax keyword potionKeyword class return
syntax keyword potionFunction print join string
highlight link potionKeyword Keyword
highlight link potionFunction Function
~~~
關閉并重新打開`factorial.pn`,你將看到內置的Potion函數現在已經高亮了。
它的工作原理就跟關鍵字高亮一樣。我們定義了新的語法類型分組并鏈接到不同的高亮組。
## 練習
想一想為什么文件開頭的`if exists`和結尾的`let`是有用的。如果你搞不懂,不要擔心。 我也曾就這個問題問過Tim Pope。
瀏覽`:help syn-keyword`。注意提到`iskeyword`的部分。
閱讀`:help iskeyword`.
閱讀`:help group-name`來了解一些配色方案作者常用的通用高亮組。
- 前言
- 鳴謝
- 預備知識
- 打印信息
- 設置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區的選項設置和映射
- 自動命令
- 本地緩沖區縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態條
- 負責任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數
- 函數參數
- 數字
- 字符串
- 字符串函數
- Execute命令
- Normal命令
- 執行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環
- 字典
- 切換
- 函數式編程
- 路徑
- 創建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?