Vim技能修煉教程(3) - 語法高亮進階

語法高亮進階

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

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

但是,定義好了規(guī)則,如何讓它自動生效呢?我們需要識別文件類型。

識別文件類型

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

au BufNewFile,BufRead logcat set filetype=logcat

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

光比較文件名還是有點low的,還可以通過文件內(nèi)容來識別.我們來看個復(fù)雜一點的例子: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

更高級的寫法,可以將文件內(nèi)容識別封裝成函數(shù):
例子來源于: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()

如果自動命令沒生效,我們也可以通過手動的方式來設(shè)置:set filetype=文件類型。filetype太常用了,也可以簡寫成ft.

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

第一講我們是通過vundle插件來管理插件路徑的。在古老的年代里,插件要么寫在.vimrc里,要么放在~/.vim/下面。后來,可以通過指定runtimepath,簡寫為rtp來指定。

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

  • filetype.vim 根據(jù)文件名來判斷文件類型
  • scripts.vim 根據(jù)內(nèi)容還判斷文件類型
  • autoload/ 每次啟動vim時都自動加載的腳本。相當(dāng)于是對.vimrc中的autocmd命令的擴展,需要做autocmd的,都可以寫進這個目錄。詳情請參見:help autoload-functions
  • colors/ 配色方案,詳情請參見:help :colorscheme
  • compiler/ 跟各種語言編譯器打交道的腳本,后面會講,詳情可參見:help :comp??梢赃\行下:comp命令試試,會列出一系列的編譯器相關(guān)的vim文件,可以打開幾個看看。
  • doc/ 文檔。這個需要強調(diào)一下,vim是以文檔完備而著稱的。詳情參見:help write-local-help
  • ftplugin/ 只處理本緩沖區(qū)的file type處理的plugin
  • indent/ 處理格式縮進的腳本。詳情請看:help :indent-expression
  • keymap/ 有點類似于輸入法的意思,將一串英文字符轉(zhuǎn)化成多語言的字符,比如中文
  • lang/ 菜單文字的翻譯
  • menu.vim 圖形模式下的菜單
  • pack/ 插件包。詳情可參見:help :packadd
  • plugin/ 通用的plugin
  • print/ 用于postscript打印的插件
  • spell/ 用于拼寫檢查的插件
  • syntax/ 語法高亮,詳情請參見:help mysyntaxfile
  • tutor/ 教程

對于我們的語法高亮的插件來說,我們可以建立doc, ftdetect和syntax三個目錄,分別放文檔,類型判斷腳本和語法高亮腳本。

關(guān)鍵字高亮

我們上次講的syn match其實才是高亮的核心武器。不過,針對于一些比較簡單的情況,比如語言中的關(guān)鍵字,就可以更簡單一些,只要全字匹配就好。

這時候可以用到syntax keyword命令。

我們來看個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)鍵字定義了之后,還是要通過hi def link命令跟預(yù)定義的配色方案對應(yīng)起來。

例:

hi def link llvmType Type
hi def link llvmStatement Statement

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

  • Comment: 注釋
  • Identifier:標識符
  • Statement:語句
  • PreProc:預(yù)處理語句
  • Type: 數(shù)據(jù)類型,如int, long, double
  • Special: 特殊符號
  • Underlined: 帶下劃線的符號,如超文本鏈接
  • Ignore: 留空
  • Error:錯誤信息
  • Todo: TODO, FIXME之類的信息

實際操作練習(xí)

下面我們通過一個最簡單的例子來檢驗一下前面的學(xué)習(xí)成果。

首先,我們在~/.vim/下建立一個ftdetect目錄,隨便起個文件名字,比如就叫test.vim吧,先做類型匹配:

 autocmd BufNewFile,BufRead *.test set filetype=test

第二步,我們定義幾個類型關(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"

最后一步,檢驗一下我們的成果,隨便寫幾句用類型的語名吧,叫xxx.test之類的

int x = 10;
long y = 20;

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

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

擴展閱讀:

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

不過,關(guān)鍵字對于很多情況是不夠用的,我們還是要回到上一講的三步曲上寫正則表達式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 語法高亮速成 我們繼續(xù)在人間修行Vim技能之旅。上一次我們學(xué)習(xí)了如何通過vundle安裝插件,這次我們迅速向?qū)懖寮?..
    Jtag特工閱讀 761評論 0 0
  • 這篇文章是手冊的中文譯版整理而來(英文看著太慢了,感謝前人鋪路Orz...),vim的markdown插件和實時預(yù)...
    Himryang閱讀 7,378評論 0 20
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 100,603評論 9 468
  • 安裝依賴庫(支持Python 3、Lua、Ruby) sudo apt-get install libncurse...
    Cyfeng閱讀 2,289評論 0 2
  • “五十六個民族、五十六枝花、五十六個兄弟姐妹是一家……” 一方有難,八方支援。大旱無情,人間有愛。 當(dāng)我在電視上看...
    遙望彼岸閱讀 198評論 0 0

友情鏈接更多精彩內(nèi)容