Vim技能修煉教程(3) - 語(yǔ)法高亮進(jìn)階

語(yǔ)法高亮進(jìn)階

首先我們復(fù)習(xí)一下上節(jié)學(xué)到的三個(gè)命令:

  • syntax match用于定義正則表達(dá)式和規(guī)則的對(duì)應(yīng)
  • highlight default定義配色方案
  • highlight link將正則規(guī)則和配色方案對(duì)應(yīng)起來(lái)

但是,定義好了規(guī)則晶伦,如何讓它自動(dòng)生效呢螟够?我們需要識(shí)別文件類(lèi)型晰绎。

識(shí)別文件類(lèi)型

我們創(chuàng)建一個(gè)新插件俏让,建立一個(gè)ftdetect目錄,然后為這個(gè)類(lèi)型創(chuàng)建一個(gè)vim文件闸溃,比如之前l(fā)ogcat的例子潘拱,我們就建立一個(gè)logcat.vim。
例子我們還是找github上的:https://github.com/serpent7776/vim-logcat/blob/master/ftdetect/logcat.vim

au BufNewFile,BufRead logcat set filetype=logcat

au是autocmd的縮寫(xiě)赋朦,BufNewFile和BufRead是觸發(fā)自動(dòng)命令的事件篓冲。
BufNewFile是創(chuàng)建一個(gè)新文件,BufRead是將文件讀入一個(gè)新緩沖區(qū)時(shí)觸發(fā)宠哄。
具體事件可以參看:help autocmd
logcat是文件名匹配的模式壹将。當(dāng)符合這種模式之后,將filetype設(shè)成logcat毛嫉,就激活了logcat.vim中配置的高亮诽俯。

光比較文件名還是有點(diǎn)low的,還可以通過(guò)文件內(nèi)容來(lái)識(shí)別.我們來(lái)看個(gè)復(fù)雜一點(diǎn)的例子:https://github.com/thinca/vim-logcat/blob/master/ftdetect/logcat.vim
例:

autocmd BufReadPost,BufNewFile *.logcat setlocal filetype=logcat
autocmd BufReadPost,BufNewFile * if getline(1) =~# '^-\{9} beginning of.*$'
\                              |   setfiletype logcat
\                              | endif

更高級(jí)的寫(xiě)法狱庇,可以將文件內(nèi)容識(shí)別封裝成函數(shù):
例子來(lái)源于:https://github.com/gburca/vim-logcat/blob/master/ftdetect/logcat.vim

fun! s:DetectLogcat()
    " Detect from the 2nd line. The 1st line could be:
    " -------- beginning of system
    if line('$') > 1 && getline(2) =~# '.*[F|E|W|I|D|V]/\S*\s*(.*\d'
        set filetype=logcat
    endif
endfun

au BufNewFile,BufRead *.lc set filetype=logcat
au BufNewFile,BufRead *.logcat set filetype=logcat
au BufNewFile,BufRead Boot-*_Set-*_Stream-*.txt set filetype=logcat
au BufNewFile,BufRead * call s:DetectLogcat()

如果自動(dòng)命令沒(méi)生效惊畏,我們也可以通過(guò)手動(dòng)的方式來(lái)設(shè)置:set filetype=文件類(lèi)型。filetype太常用了密任,也可以簡(jiǎn)寫(xiě)成ft.

vim插件的目錄結(jié)構(gòu)

第一講我們是通過(guò)vundle插件來(lái)管理插件路徑的颜启。在古老的年代里,插件要么寫(xiě)在.vimrc里浪讳,要么放在~/.vim/下面缰盏。后來(lái),可以通過(guò)指定runtimepath淹遵,簡(jiǎn)寫(xiě)為rtp來(lái)指定口猜。

每個(gè)runtimepath指定的目錄都可以包含下面的文件和子目錄:

  • filetype.vim 根據(jù)文件名來(lái)判斷文件類(lèi)型
  • scripts.vim 根據(jù)內(nèi)容還判斷文件類(lèi)型
  • autoload/ 每次啟動(dòng)vim時(shí)都自動(dòng)加載的腳本。相當(dāng)于是對(duì).vimrc中的autocmd命令的擴(kuò)展透揣,需要做autocmd的济炎,都可以寫(xiě)進(jìn)這個(gè)目錄。詳情請(qǐng)參見(jiàn):help autoload-functions
  • colors/ 配色方案辐真,詳情請(qǐng)參見(jiàn):help :colorscheme
  • compiler/ 跟各種語(yǔ)言編譯器打交道的腳本须尚,后面會(huì)講,詳情可參見(jiàn):help :comp侍咱∧痛玻可以運(yùn)行下:comp命令試試,會(huì)列出一系列的編譯器相關(guān)的vim文件楔脯,可以打開(kāi)幾個(gè)看看撩轰。
  • doc/ 文檔。這個(gè)需要強(qiáng)調(diào)一下,vim是以文檔完備而著稱(chēng)的堪嫂。詳情參見(jiàn):help write-local-help
  • ftplugin/ 只處理本緩沖區(qū)的file type處理的plugin
  • indent/ 處理格式縮進(jìn)的腳本偎箫。詳情請(qǐng)看:help :indent-expression
  • keymap/ 有點(diǎn)類(lèi)似于輸入法的意思,將一串英文字符轉(zhuǎn)化成多語(yǔ)言的字符溉苛,比如中文
  • lang/ 菜單文字的翻譯
  • menu.vim 圖形模式下的菜單
  • pack/ 插件包镜廉。詳情可參見(jiàn):help :packadd
  • plugin/ 通用的plugin
  • print/ 用于postscript打印的插件
  • spell/ 用于拼寫(xiě)檢查的插件
  • syntax/ 語(yǔ)法高亮,詳情請(qǐng)參見(jiàn):help mysyntaxfile
  • tutor/ 教程

對(duì)于我們的語(yǔ)法高亮的插件來(lái)說(shuō)愚战,我們可以建立doc, ftdetect和syntax三個(gè)目錄娇唯,分別放文檔,類(lèi)型判斷腳本和語(yǔ)法高亮腳本寂玲。

關(guān)鍵字高亮

我們上次講的syn match其實(shí)才是高亮的核心武器塔插。不過(guò),針對(duì)于一些比較簡(jiǎn)單的情況拓哟,比如語(yǔ)言中的關(guān)鍵字想许,就可以更簡(jiǎn)單一些,只要全字匹配就好断序。

這時(shí)候可以用到syntax keyword命令流纹。

我們來(lái)看個(gè)llvm的例子:

syn keyword llvmType void half float double x86_fp80 fp128 ppc_fp128
syn keyword llvmType label metadata x86_mmx
syn keyword llvmType type label opaque
syn match   llvmType /\<i\d\+\>/

關(guān)鍵字定義了之后,還是要通過(guò)hi def link命令跟預(yù)定義的配色方案對(duì)應(yīng)起來(lái)违诗。

例:

hi def link llvmType Type
hi def link llvmStatement Statement

常用的預(yù)定義的配色方案有:

  • Comment: 注釋
  • Identifier:標(biāo)識(shí)符
  • Statement:語(yǔ)句
  • PreProc:預(yù)處理語(yǔ)句
  • Type: 數(shù)據(jù)類(lèi)型漱凝,如int, long, double
  • Special: 特殊符號(hào)
  • Underlined: 帶下劃線(xiàn)的符號(hào),如超文本鏈接
  • Ignore: 留空
  • Error:錯(cuò)誤信息
  • Todo: TODO, FIXME之類(lèi)的信息

實(shí)際操作練習(xí)

下面我們通過(guò)一個(gè)最簡(jiǎn)單的例子來(lái)檢驗(yàn)一下前面的學(xué)習(xí)成果诸迟。

首先茸炒,我們?cè)趡/.vim/下建立一個(gè)ftdetect目錄,隨便起個(gè)文件名字阵苇,比如就叫test.vim吧壁公,先做類(lèi)型匹配:

 autocmd BufNewFile,BufRead *.test set filetype=test

第二步,我們定義幾個(gè)類(lèi)型關(guān)鍵字绅项。在~/.vim/下建立syntax目錄紊册,還叫test.vim:

if exists("b:current_syntax")
    finish
endif 
syntax keyword TestType int long short byte
 
highlight default link TestType Type

let b:current_syntax = "test"

最后一步,檢驗(yàn)一下我們的成果快耿,隨便寫(xiě)幾句用類(lèi)型的語(yǔ)名吧囊陡,叫xxx.test之類(lèi)的

int x = 10;
long y = 20;

可以看到,int和long已經(jīng)被作為關(guān)鍵字被識(shí)別出來(lái)了润努。

小作業(yè):在github上建立一個(gè)插件,用vunble來(lái)下載您的這個(gè)插件示括,實(shí)現(xiàn)語(yǔ)法高亮的功能

擴(kuò)展閱讀:

  • :help group-name铺浇,除了上面介紹的常用預(yù)定義組之外,這里有更詳細(xì)的說(shuō)明

不過(guò)垛膝,關(guān)鍵字對(duì)于很多情況是不夠用的鳍侣,我們還是要回到上一講的三步曲上寫(xiě)正則表達(dá)式丁稀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市倚聚,隨后出現(xiàn)的幾起案子线衫,更是在濱河造成了極大的恐慌,老刑警劉巖惑折,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件授账,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡惨驶,警方通過(guò)查閱死者的電腦和手機(jī)白热,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粗卜,“玉大人屋确,你說(shuō)我怎么就攤上這事⌒樱” “怎么了攻臀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)纱昧。 經(jīng)常有香客問(wèn)我刨啸,道長(zhǎng),這世上最難降的妖魔是什么砌些? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任呜投,我火速辦了婚禮,結(jié)果婚禮上存璃,老公的妹妹穿的比我還像新娘仑荐。我一直安慰自己,他們只是感情好纵东,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布粘招。 她就那樣靜靜地躺著,像睡著了一般偎球。 火紅的嫁衣襯著肌膚如雪洒扎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天衰絮,我揣著相機(jī)與錄音袍冷,去河邊找鬼。 笑死猫牡,一個(gè)胖子當(dāng)著我的面吹牛胡诗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼煌恢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骇陈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瑰抵,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤你雌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后二汛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體婿崭,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年习贫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逛球。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苫昌,死狀恐怖颤绕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祟身,我是刑警寧澤奥务,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站袜硫,受9級(jí)特大地震影響氯葬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婉陷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一帚称、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秽澳,春花似錦闯睹、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至妄讯,卻和暖如春孩锡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亥贸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工躬窜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炕置。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓荣挨,卻偏偏與公主長(zhǎng)得像溜族,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垦沉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 語(yǔ)法高亮速成 我們繼續(xù)在人間修行Vim技能之旅。上一次我們學(xué)習(xí)了如何通過(guò)vundle安裝插件仍劈,這次我們迅速向?qū)懖寮?..
    Jtag特工閱讀 637評(píng)論 0 0
  • 這篇文章是手冊(cè)的中文譯版整理而來(lái)(英文看著太慢了厕倍,感謝前人鋪路Orz...),vim的markdown插件和實(shí)時(shí)預(yù)...
    Himryang閱讀 6,942評(píng)論 0 20
  • Ubuntu的發(fā)音 Ubuntu组民,源于非洲祖魯人和科薩人的語(yǔ)言,發(fā)作 oo-boon-too 的音悲靴。了解發(fā)音是有意...
    螢火蟲(chóng)de夢(mèng)閱讀 99,200評(píng)論 9 467
  • 安裝依賴(lài)庫(kù)(支持Python 3臭胜、Lua、Ruby) sudo apt-get install libncurse...
    Cyfeng閱讀 2,099評(píng)論 0 2
  • “五十六個(gè)民族癞尚、五十六枝花耸三、五十六個(gè)兄弟姐妹是一家……” 一方有難,八方支援浇揩。大旱無(wú)情仪壮,人間有愛(ài)。 當(dāng)我在電視上看...
    遙望彼岸閱讀 173評(píng)論 0 0