每個(gè)程序員的文本編輯器缺少了語(yǔ)法高亮、特殊關(guān)鍵字和短語(yǔ)著色,都是不完整的。語(yǔ)法高亮突出了文檔的結(jié)構(gòu),幫助發(fā)現(xiàn)排字錯(cuò)誤,利于調(diào)試,整體上讓文本編輯更輕松更有效率。本篇我們將探討一下Vim的語(yǔ)法高亮范式以及如何建立和定制著色方案。
Vim著色方案:
首先說(shuō)明,本文談?wù)摰牟皇悄姆N顏色最好,而是Vim如何處理語(yǔ)法高亮的問(wèn)題。
在決定如何給一個(gè)文件著色時(shí),Vim首先將文件分解成若干結(jié)構(gòu)組。這些都是通過(guò)編寫(xiě)好的語(yǔ)法命令文件來(lái)實(shí)現(xiàn),這些文件在Vim加載一個(gè)文件的時(shí)候就自動(dòng)加載了,加載過(guò)程則是基于一系列復(fù)雜規(guī)則。如果Vim選擇了一個(gè)錯(cuò)誤的語(yǔ)法命令文件,你可以通過(guò)以下命令手工指定一個(gè)正確的文件:
:set syn=syntax-type
其中syntax-type是一個(gè)文件的類型。通常文件類型就是文件擴(kuò)展名,例如選擇PHP語(yǔ)法高亮,則將syntax-type設(shè)置為“php”。
Vim主要使用以下九種高亮分組:
復(fù)制代碼
Comment : 注釋
Constant : 常量,例如數(shù)字、引號(hào)內(nèi)字符串、布爾值。
Identifier : 變量標(biāo)識(shí)符名稱。
Statement : 編程語(yǔ)言的聲明,一般是像“if”或“while”這樣的關(guān)鍵字。
PreProc : 預(yù)處理,例如C語(yǔ)言中的“#include”。
Type : 變量類型,例如“int”。
Special : 特殊符號(hào),通常是類似字符串中的“\n”。
Underlined : 文本下劃線。
Error : 顯示編程語(yǔ)言錯(cuò)誤的文本。
另外還有一個(gè)分組叫做Normal,表示普通文本。
也許你已經(jīng)注意到,這些高亮分組主要針對(duì)編程語(yǔ)言,這是因?yàn)檎Z(yǔ)法高亮對(duì)它們最有用。但是,Vim的高亮命令覆蓋的文件類型遠(yuǎn)超過(guò)編程語(yǔ)言,包括從HTML到EMAIL的任何東西。
Vim還支持三種輸出設(shè)備:black-and-white terminal(黑白終端),color terminal(彩色終端)和GUI(圖形化的用戶接口)。因?yàn)樗鼈兠恳粋(gè)都有自己獨(dú)特的高亮能力,Vim為它們維護(hù)了三個(gè)獨(dú)立的高亮方案。
建立高亮:
實(shí)現(xiàn)高亮的最簡(jiǎn)便方式就是使用別人寫(xiě)好的.vimrc文件,就像這個(gè)。大多數(shù)時(shí)候這樣做都挺好使。但是,如果它不好使或者你想從頭開(kāi)始,以下就是告訴你如何從頭開(kāi)始。
你必須在你的.vimrc文件的第一行寫(xiě)入:
syntax on
這行命令告訴Vim開(kāi)始使用語(yǔ)法高亮。如果你暫時(shí)不想改動(dòng)文件,你也可以在Vim窗口輸入它作為一行命令。
如果你正在使用黑白終端或者GUI接口,一切都工作得剛剛好。如果你正在使用一個(gè)支持彩色的終端,你也許不得不將以下命令置于syntax on上一行:
set term=ansi
你也可以嘗試一下color_xterm來(lái)代替ansi。
選擇顏色:
Vim有一套默認(rèn)顏色方案,在我看來(lái),有點(diǎn)過(guò)度明亮和混亂(注釋和變量顏色是一樣的)。但是每個(gè)人都有一套自己的顏色偏好,因此你可能會(huì)很想了解如何改變它的色彩來(lái)符合自己的口味。
Vim著色使用:highlight和:hi命令。:hi命令實(shí)際上是多用途命令,它負(fù)責(zé)許多例行著色,我們僅用它的顏色選擇功用。它具有以下語(yǔ)法:
:hi Group key=value ...
Group就是前面所說(shuō)的9個(gè)高亮分組名。
key-value鍵值對(duì)規(guī)定了不同輸出終端的高亮值。這里有三個(gè)基本鍵名:term、cterm和gui,代表著黑白終端、彩色終端和圖形界面。除了term以外,另外兩個(gè)基本鍵還有兩個(gè)擴(kuò)展鍵名base-namefg和base-namebg,分別代表對(duì)應(yīng)終端的前景和背景顏色。基本鍵只能擁有非色彩的高亮值,例如加粗和下劃線。
以下是一些高亮鍵和它們可能的值:
term/cterm/gui: bold, underline, reverse, italic, none
ctermfg/ctermbg: red, yellow, green , blue, magenta, cyan, white, blcak, gray
guifg/guibg: 以上所有顏色,而且還可以使用#rrggbb格式色彩。
例如,我想高亮我的預(yù)處理聲明為bright magenta,可以使用如下命令:
:hi PreProc ctermfg=magenta cterm=bold guifg=#FF00FF
注意,我可以在一行中使用多個(gè)鍵值對(duì),他們都會(huì)應(yīng)用于同一個(gè)高亮分組。
通常來(lái)說(shuō),只要你喜歡一個(gè)著色方案,你可以將它設(shè)置在你的~/.vimrc文件中,Vim會(huì)自動(dòng)將其加載。
語(yǔ)法高亮除錯(cuò):
Vim的語(yǔ)法高亮偶爾也存在一些小問(wèn)題,我就經(jīng)常遭遇到其中的三個(gè)。
沒(méi)有彩色,只有黑白終端高亮。
導(dǎo)致這種情況的最常見(jiàn)的原因是Vim無(wú)法確定終端是否具備彩色能力。要修復(fù)它,首先確保在.vimrc文件第一行設(shè)置了term=ansi,一定要在syntax on所在行之前。另外還要在shell中將環(huán)境變量TERM設(shè)置為color_xterm和color-xterm。
顏色有了,但不是我想要的。
這常發(fā)生在你試圖修改別人的.vimrc文件以為己用的時(shí)候。有時(shí),你只需要將自己的色彩定義全部放到文件的底部去就可以修復(fù)。如果不奏效的話,檢查所有可疑的代碼,然后將它們注釋。(注釋方法為在行首添加雙引號(hào))
滾屏?xí)r顏色亂成一團(tuán)
Vim在確定高亮法則的時(shí)候使用多種探索方法來(lái)節(jié)約時(shí)間,有時(shí)這會(huì)造成一些故障。查看:h syn-sync可以得到更多細(xì)節(jié)。要修復(fù)這個(gè),你可使用以下命令:
syn sync minlines=1000
你也可以在.vimrc文件中設(shè)置更大的數(shù)值。在Vim 6.0及以上版本,你可以使用以下命令:
syn sync fromstart
該命令強(qiáng)制高亮引擎從文件第一行開(kāi)始解析文件,這對(duì)大文件而言會(huì)很慢,但它可以確保色彩準(zhǔn)確度。
此時(shí)此刻,如果你習(xí)慣了使用Vim,并且你已經(jīng)鼓搗了一陣它的配置,發(fā)現(xiàn)一些你喜歡的特性,恭喜你,你現(xiàn)在是一個(gè)Vim User了。當(dāng)然,在本教程中我還會(huì)教更多的關(guān)于Vim的東西,有人寫(xiě)了一整本關(guān)于編程的書(shū),但我希望你從本教程可以掌握一些基礎(chǔ)知識(shí)并且探索更多知識(shí)。享受學(xué)習(xí),這是一項(xiàng)你永遠(yuǎn)不會(huì)后悔擁有的技能。