Vim技能修煉教程(3) - 語法高亮進階
語法高亮進階
首先我們複習一下上節學到的三個命令:
- syntax match用於定義正則表達式和規則的對應
- highlight default定義配色方案
- highlight link將正則規則和配色方案對應起來
但是,定義好了規則,如何讓它自動生效呢?我們需要識別文件類型。
識別文件類型
我們創建一個新插件,建立一個ftdetect目錄,然後為這個類型創建一個vim文件,比如之前logcat的例子,我們就建立一個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是觸發自動命令的事件。
BufNewFile是創建一個新文件,BufRead是將文件讀入一個新緩衝區時觸發。
具體事件可以參看:help autocmd
logcat是文件名匹配的模式。當符合這種模式之後,將filetype設成logcat,就激活了logcat.vim中配置的高亮。
光比較文件名還是有點low的,還可以通過文件內容來識別.我們來看個複雜一點的例子: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
更高級的寫法,可以將文件內容識別封裝成函數:
例子來源於: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()
如果自動命令沒生效,我們也可以通過手動的方式來設置:set filetype=文件類型。filetype太常用了,也可以簡寫成ft.
vim插件的目錄結構
第一講我們是通過vundle插件來管理插件路徑的。在古老的年代裏,插件要麼寫在.vimrc裏,要麼放在~/.vim/下麵。後來,可以通過指定runtimepath,簡寫為rtp來指定。
每個runtimepath指定的目錄都可以包含下麵的文件和子目錄:
- filetype.vim 根據文件名來判斷文件類型
- scripts.vim 根據內容還判斷文件類型
- autoload/ 每次啟動vim時都自動加載的腳本。相當於是對.vimrc中的autocmd命令的擴展,需要做autocmd的,都可以寫進這個目錄。詳情請參見:help autoload-functions
- colors/ 配色方案,詳情請參見:help :colorscheme
- compiler/ 跟各種語言編譯器打交道的腳本,後麵會講,詳情可參見:help :comp。可以運行下:comp命令試試,會列出一係列的編譯器相關的vim文件,可以打開幾個看看。
- doc/ 文檔。這個需要強調一下,vim是以文檔完備而著稱的。詳情參見:help write-local-help
- ftplugin/ 隻處理本緩衝區的file type處理的plugin
- indent/ 處理格式縮進的腳本。詳情請看:help :indent-expression
- keymap/ 有點類似於輸入法的意思,將一串英文字符轉化成多語言的字符,比如中文
- lang/ 菜單文字的翻譯
- menu.vim 圖形模式下的菜單
- pack/ 插件包。詳情可參見:help :packadd
- plugin/ 通用的plugin
- print/ 用於postscript打印的插件
- spell/ 用於拚寫檢查的插件
- syntax/ 語法高亮,詳情請參見:help mysyntaxfile
- tutor/ 教程
對於我們的語法高亮的插件來說,我們可以建立doc, ftdetect和syntax三個目錄,分別放文檔,類型判斷腳本和語法高亮腳本。
關鍵字高亮
我們上次講的syn match其實才是高亮的核心武器。不過,針對於一些比較簡單的情況,比如語言中的關鍵字,就可以更簡單一些,隻要全字匹配就好。
這時候可以用到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\+\>/
關鍵字定義了之後,還是要通過hi def link命令跟預定義的配色方案對應起來。
例:
hi def link llvmType Type
hi def link llvmStatement Statement
常用的預定義的配色方案有:
- Comment: 注釋
- Identifier:標識符
- Statement:語句
- PreProc:預處理語句
- Type: 數據類型,如int, long, double
- Special: 特殊符號
- Underlined: 帶下劃線的符號,如超文本鏈接
- Ignore: 留空
- Error:錯誤信息
- Todo: TODO, FIXME之類的信息
實際操作練習
下麵我們通過一個最簡單的例子來檢驗一下前麵的學習成果。
首先,我們在~/.vim/下建立一個ftdetect目錄,隨便起個文件名字,比如就叫test.vim吧,先做類型匹配:
autocmd BufNewFile,BufRead *.test set filetype=test
第二步,我們定義幾個類型關鍵字。在~/.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已經被作為關鍵字被識別出來了。
小作業:在github上建立一個插件,用vunble來下載您的這個插件,實現語法高亮的功能
擴展閱讀:
- :help group-name,除了上麵介紹的常用預定義組之外,這裏有更詳細的說明
不過,關鍵字對於很多情況是不夠用的,我們還是要回到上一講的三步曲上寫正則表達式。
最後更新:2017-06-29 16:32:00