Vim+Ctags+Taglist的应用是一个非常方便的解决方案,网络上关于这样的简单介绍数不胜数,只要愿意不妨搜索一下即可。但是有一个问题是大多数文章没有阐明的,那就是如何添加原本不被Ctags和taglist所支持的语言呢?花了点时间,找到了解决,姑且备忘于下,希望利人利己。本文均以SystemVerilog为例说明:
###Ctags中添加新的语言###
ctags的配置文件其实在 ~/.ctags中,打开该文件,添加如下代码
- 从某论坛上看到,做了一定修改,用以支持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/ --systemverilog-kinds=+ctfmpie
这里从代码可以读出无非是依次定义了新的语言种类,指明了文件后缀,然后使用正则匹配来抓出你希望的关键字,熟悉正则表达式的人自然一读就懂,可以自己扩展,不熟悉的人,那就照copy吧。
###Taglist中添加语言种类###
打开taglist的文件,例如 ~/.vim/plugin/taglist.vim, 添加下面的内容:
systemverilog languagelet s:tlist_def_systemverilog_settings= ‘systemverilog;m:module;c:class;’ .
t:task;p:program;f:function;i:interface;e:typedef
语句也很简单,就是添加了一类可以被Taglist识别的语法种类,同时规定了那些部分是需要显示在tag list当中的;
###Vim当中添加File type###
似乎有点本末倒置了,呵呵,其实最开始的一点就是要让vim也能够识别出systemverilog的文件,那么请打开~/.vim/filetype.vim,加入下面这一行:
au BufNewFile,BufRead .sv,.svh setf systemverilog
同时不要忘记’set filetype on’来保证vim会去识别语法种类(当然,这个其实也是使用语法高亮的基本要求)。
###步骤###
使用的时候,无非就是按照:
-
ctags -R * 来生成tag文件;
-
vim打开文件,并且可以适当设置’ set tags=xxxxxx’ 来load文件;
-
用:Tlist打开tag侧边栏,其余都可以按照网上教程操作。