W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
目前我們已經(jīng)為Potion文件實現(xiàn)了簡單的關(guān)鍵字和函數(shù)的語法高亮。
如果沒有做上一章的練習(xí),你需要回去完成。我將假設(shè)你做了練習(xí)。
事實上,你應(yīng)該回去完成你跳過的_任何_練習(xí)。即使你覺得你不需要,為了更好的學(xué)習(xí)效果, 你都得把它們完成了。請在這一點上相信我。
接下來我們需要高亮Potion的一個重要組成部分——注釋。 問題是,Potion的注釋以#
開頭,而#
并不在iskeyword
里。
如果不知道什么是iskeyword
,你沒有認(rèn)真聽講。回去并完成那該死的練習(xí)。 在寫每一章的內(nèi)容時,我不會把無意義的粗重活丟給你。你_真的_需要完成它們來跟上本書的進度。
因為#
不是一個keyword字符,我們需要使用正則表達式來匹配它(以及接下來的注釋)。 我們將用syntax match
代替syntax keyword
。在你的syntax文件中加入下面幾行:
syntax match potionComment "\v#.*$"
highlight link potionComment Comment
我不會再嘮叨要把它們放到文件的哪里。你已經(jīng)是個程序猿了:由你自己判斷。
關(guān)閉并重新打開factorial.pn
。在文件的某處添加一個注釋,你將看到它被當(dāng)作注釋高亮了。
第二行是簡單的:它告訴Vim高亮potionComment
語法類型組里的任何東西為Comment
。
第一行有點新東西。我們使用syntax match
來告訴Vim用_正則表達式_而不是關(guān)鍵詞來匹配。
注意正則表達式以\v
開頭,表示使用"very magic"模式。 如果你不太清楚,重讀關(guān)于基本正則表達式的那一章。(譯注:第31章)
當(dāng)前狀況下,"very magic"模式不是必須的。 但將來我們可能會改變這個正則表達式,然后苦思冥想為何它不工作了, 所以我建議總是使用"very magic"來保證一致性。
至于正則表達式的功能,非常簡單:匹配以#
開頭的注釋,包括以此開始到行末的所有字符。
如果你需要重新喚起對正則表達式的記憶,你應(yīng)該看一下 Zed Shaw的Learn Regex the Hard Way。
另一個需要正則表達式來高亮的部分是運算符。在你的syntax文件中加入下列內(nèi)容:
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
關(guān)閉并重新打開factorial.pn
。注意到階乘函數(shù)的*=
現(xiàn)在被高亮了。
你可能首先注意到,我把每個正則表達式獨立成一行而不是像對關(guān)鍵字一樣分成組。 這是因為syntax match
_不_支持在一行里放多個組。
你應(yīng)該也注意到每個正則表達式都以\v
開頭,即使并不是必須的。 在寫Vimscript時,我希望保持正則表達式的一致性,即使這樣做需要多打幾個符號。
你可能會奇怪,為什么我不用類似于"\v-\=?"
的正則表達式來同時匹配-
以及-=
。 你想要的話也可以這么做。它會正常工作。 我只是堅持認(rèn)為-
和-=
是不同的運算符,所以把它們放到不同行里。
把每個運算符放在單獨的匹配中,簡化了正則表達式,代價是輸入了額外的字符。 我喜歡這么做,但你可能不這么認(rèn)為。你自己決定吧。
我也沒有把=
定義成一個運算符。我們等會會這么做,但我希望暫時先不這樣做,這樣就能給你考上一題了。
因為分開了-
和-=
的正則表達式,我不得不在定義-
_之后_定義-=
!
如果以相反的順序定義,并在Potion文件里使用-=
,Vim將匹配-
(當(dāng)然,同時也高亮它), 剩下=
等待匹配。這意味著在構(gòu)建syntax match
組時,每個組"消耗"的文本片段在之后不能被匹配到。
這講得太籠統(tǒng)了,但我暫時并不打算糾結(jié)于細節(jié)。 總之,你應(yīng)該在匹配較小的組之后匹配較大的組,因為在_之后_定義的組優(yōu)先于在_之前_定義的組。
讓我們繼續(xù)并添加=
作為運算符?,F(xiàn)在請聽題:
syntax match potionOperator "\v\="
花一點時間想想你應(yīng)該把它放在syntax文件的哪個位置。如果你需要提示,重讀前幾章。
閱讀:help syn-match
.
閱讀:help syn-priority
.
在例子中,我們沒有把:
當(dāng)作運算符。閱讀Potion文檔并審慎地決定是否把:
當(dāng)作一個運算符。 如果你決定這么做,把它加到syntax文件中。
同樣考慮.
和/
。
增加一個高亮數(shù)字的語法類型分組potionNumber
。鏈接它到高亮組Number
。 不要忘了Potion支持2
,0xffaf
,123.23
,1e-2
和1.9956e+2
這幾種形式。 記得在處理邊際狀態(tài)的花費的時間和這些邊際狀態(tài)出現(xiàn)的次數(shù)之間取得平衡。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: