1. 程式人生 > >如何在Vim+Ctags+Taglist應用中新增自定義語言: systemverilog

如何在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側邊欄,其餘都可以按照網上教程操作。