如何在Vim+Ctags+Taglist應用中新增自定義語言: systemverilog
確切的應該是轉載別人的,然後修改的:
如何在Vim+Ctags+Taglist應用中新增自定義語言
Vim+Ctags+Taglist的應用是一個非常方便的解決方案,網路上關於這樣的簡單介紹數不勝數,只要願意不妨搜尋一下即可。
但是有一個問題是大多數文章沒有闡明的,那就是如何新增原本不被Ctags和taglist所支援的語言呢?花了點時間,找到了解決,姑且備忘於下,希望利人利己。
本文均以SystemVerilog為例說明:
【1】Ctags中新增新的語言
ctags的配置檔案其實在 ~/.ctags中,開啟該檔案,新增如下程式碼[1. 從某論壇上看到,做了一定修改,用以支援extern,static等字首]:
--langdef=systemverilog
--langmap=systemverilog:.sv.svh.svi
--regex-systemverilog=/^[ ]*(virtual)?[ ]*class[ ]*([a-zA-Z_0-9]+)/\2/c,class/
--regex-systemverilog=/^[ ]*(extern)?[ ]*(static)?[ ]*(virtual)?[ ]*task[ ]*.*[ ]+([a-zA-Z_0-9]*::)?([a-zA-Z_0-9]+)[ ]*[(;]/\5/t,task/
--regex-systemverilog=/^[ ]*(extern)?[ ]*(static)?[ ]*(virtual)?[ ]*function[ ]*.*[ ]+([a-zA-Z_0-9]*::)?([a-zA-Z_0-9]+)[ ]*[(;]/\5/f,function/
--regex-systemverilog=/^[ ]*module[ ]*([a-zA-Z_0-9]+)/\1/m,module/
--regex-systemverilog=/^[ ]*program[ ]*([a-zA-Z_0-9]+)/\1/p,program/
--regex-systemverilog=/^[ ]*interface[ ]*([a-zA-Z_0-9]+)/\1/i,interface/
--regex-systemverilog=/^[ ]*package[ ]*([a-zA-Z_0-9]+)/\1/k,package/
--regex-systemverilog=/^[ ]*typedef[ ]+.*[ ]+([a-zA-Z_0-9]+)[ ]*;/\1/e,typedef/
--regex-systemverilog=/^[
]*·define[ ]+([a-zA-Z_0-9]+)/\1/d,define/
--systemverilog-kinds=+ctfmpike
這裡從程式碼可以讀出無非是依次定義了新的語言種類,指明瞭檔案字尾,然後使用正則匹配來抓出你希望的關鍵字,熟悉正則表示式的人自然一讀就懂,可以自己擴充套件,不熟悉的人,那就照copy吧。
【2】Taglist中新增語言種類
------------------需要讀一下它的readme 的, 在taglist.vim 中有下面這段
" Variable name format:
"
" s:tlist_def_{vim_ftype}_settings
"
" vim_ftype - Filetype detected by Vim
"
" Value format:
"
" <ctags_ftype>;<flag>:<name>;<flag>:<name>;...
"
" ctags_ftype - File type supported by exuberant ctags
" flag - Flag supported by exuberant ctags to generate a tag type
" name - Name of the tag type used in the taglist window to display the
" tags of this type
所以要保證兩個方面: 1. vim 能識別file type, 2.ctags 能識別file type
1.vim 可以在.sv 或者.v 檔案中:set filetype 來檢視檔案屬性
可以通過:.vim/ftdetect/verilog_systemverilog.vim:13:au BufRead,BufNewFile *.v,*.vh,*.sv,*.sa,*svhset filetype=verilog_systemverilog 設定成你希望的檔案屬性
2. ctags: 在taglist 的doc中有:
$ ctags --list-maps=all
$ ctags --list-kinds=all
兩個命令可以檢視ctags支援的型別,不過沒有找到如何改,一般不需要改的,我的default就是支援verilog/systemverilog的
開啟taglist的檔案,例如 ~/.vim/plugin/taglist.vim, 新增下面的內容:
” systemverilog language
let s:tlist_def_verilog_systemverilog_settings= 'systemverilog;m:module;c:class;' . \'t:task;p:program;f:function;i:interface;e:typedef'
語句也很簡單,就是添加了一類可以被Taglist識別的語法種類,同時規定了那些部分是需要顯示在tag list當中的;
【3】Vim當中新增File type
似乎有點本末倒置了,呵呵,其實最開始的一點就是要讓vim也能夠識別出systemverilog的檔案,那麼請開啟~/.vimrc,加入下面這一行:
au BufNewFile,BufRead *.sv,*.svh setf systemverilog
同時不要忘記'filetype on'來保證vim會去識別語法種類(當然,這個其實也是使用語法高亮的基本要求)。
如果有systemverilog 高亮的話,在.vimrc中設定的可能不會起作用,所以如果systemverilog高亮的.vim 就不需要則會vimrc中設定了
【4】步驟
使用的時候,無非就是按照:1. ctags -R * 來生成tag檔案;2. vim開啟檔案,並且可以適當設定 set tags+=~/Methodology/uvm/uvm-1.1d/src/tags來load檔案;3. 用:Tlist開啟tag側邊欄,其餘都可以按照網上教程操作。