目前我們已經為Potion文件實現了簡單的關鍵字和函數的語法高亮。
如果沒有做上一章的練習,你需要回去完成。我將假設你做了練習。
事實上,你應該回去完成你跳過的_任何_練習。即使你覺得你不需要,為了更好的學習效果, 你都得把它們完成了。請在這一點上相信我。
## 高亮注釋
接下來我們需要高亮Potion的一個重要組成部分——注釋。 問題是,Potion的注釋以`#`開頭,而`#`并不在`iskeyword`里。
如果不知道什么是`iskeyword`,你沒有認真聽講。回去并_完成那該死的練習_。 在寫每一章的內容時,我不會把無意義的粗重活丟給你。你_真的_需要完成它們來跟上本書的進度。
因為`#`不是一個keyword字符,我們需要使用正則表達式來匹配它(以及接下來的注釋)。 我們將用`syntax match`代替`syntax keyword`。在你的syntax文件中加入下面幾行:
~~~
syntax match potionComment "\v#.*$"
highlight link potionComment Comment
~~~
我不會再嘮叨要把它們放到文件的哪里。你已經是個程序猿了:由你自己判斷。
關閉并重新打開`factorial.pn`。在文件的某處添加一個注釋,你將看到它被當作注釋高亮了。
第二行是簡單的:它告訴Vim高亮`potionComment`語法類型組里的任何東西為`Comment`。
第一行有點新東西。我們使用`syntax match`來告訴Vim用_正則表達式_而不是關鍵詞來匹配。
注意正則表達式以`\v`開頭,表示使用"very magic"模式。 如果你不太清楚,重讀關于基本正則表達式的那一章。(譯注:第31章)
當前狀況下,"very magic"模式不是必須的。 但將來我們可能會改變這個正則表達式,然后苦思冥想為何它不工作了, 所以我建議總是使用"very magic"來保證一致性。
至于正則表達式的功能,非常簡單:匹配以`#`開頭的注釋,包括以此開始到行末的所有字符。
如果你需要重新喚起對正則表達式的記憶,你應該看一下 Zed Shaw的[Learn Regex the Hard Way](http://regex.learncodethehardway.org/)。
## 高亮運算符
另一個需要正則表達式來高亮的部分是運算符。在你的syntax文件中加入下列內容:
~~~
syntax match potionOperator "\v\*"
syntax match potionOperator "\v/"
syntax match potionOperator "\v\+"
syntax match potionOperator "\v-"
syntax match potionOperator "\v\?"
syntax match potionOperator "\v\*\="
syntax match potionOperator "\v/\="
syntax match potionOperator "\v\+\="
syntax match potionOperator "\v-\="
highlight link potionOperator Operator
~~~
關閉并重新打開`factorial.pn`。注意到階乘函數的`*=`現在被高亮了。
你可能首先注意到,我把每個正則表達式獨立成一行而不是像對關鍵字一樣分成組。 這是因為`syntax match`_不_支持在一行里放多個組。
你應該也注意到每個正則表達式都以`\v`開頭,即使并不是必須的。 在寫Vimscript時,我希望保持正則表達式的一致性,即使這樣做需要多打幾個符號。
你可能會奇怪,為什么我不用類似于`"\v-\=?"`的正則表達式來同時匹配`-`_以及_`-=`。 你想要的話也可以這么做。它會正常工作。 我只是堅持認為`-`和`-=`是不同的運算符,所以把它們放到不同行里。
把每個運算符放在單獨的匹配中,簡化了正則表達式,代價是輸入了額外的字符。 我喜歡這么做,但你可能不這么認為。你自己決定吧。
我也沒有把`=`定義成一個運算符。我們等會會這么做,但我希望暫時先不這樣做,這樣就能給你考上一題了。
因為分開了`-`和`-=`的正則表達式,我不得不在定義`-`_之后_定義`-=`!
如果以相反的順序定義,并在Potion文件里使用`-=`,Vim將匹配`-`(當然,同時也高亮它), 剩下`=`等待匹配。這意味著在構建`syntax match`組時,每個組"消耗"的文本片段在之后不能被匹配到。
這講得太籠統了,但我暫時并不打算糾結于細節。 總之,你應該在匹配較小的組之后匹配較大的組,因為在_之后_定義的組優先于在_之前_定義的組。
讓我們繼續并添加`=`作為運算符。現在請聽題:
~~~
syntax match potionOperator "\v\="
~~~
花一點時間想想你應該把它放在syntax文件的哪個位置。如果你需要提示,重讀前幾章。
## 練習
閱讀`:help syn-match`.
閱讀`:help syn-priority`.
在例子中,我們沒有把`:`當作運算符。閱讀Potion文檔并審慎地決定是否把`:`當作一個運算符。 如果你決定這么做,把它加到syntax文件中。
同樣考慮`.`和`/`。
增加一個高亮數字的語法類型分組`potionNumber`。鏈接它到高亮組`Number`。 不要忘了Potion支持`2`,`0xffaf`,`123.23`,`1e-2`和`1.9956e+2`這幾種形式。 記得在處理邊際狀態的花費的時間和這些邊際狀態出現的次數之間取得平衡。
- 前言
- 鳴謝
- 預備知識
- 打印信息
- 設置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區的選項設置和映射
- 自動命令
- 本地緩沖區縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態條
- 負責任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數
- 函數參數
- 數字
- 字符串
- 字符串函數
- Execute命令
- Normal命令
- 執行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環
- 字典
- 切換
- 函數式編程
- 路徑
- 創建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?