确切的应该是转载Vinson_Yin,然后修改的:https://blog.csdn.net/ocarvb/article/details/53354147
背景: 2021年4月16日: 之前用的是tagbar , 大文件时启动慢; vista.vim 功能比较多, 虽然是vim8 异步, 但是打开vim 比较慢.
结论: taglist 功能简洁; 满足常用快速浏览 task 和function.
需要准备: vim8.0 (自带的systemverilog 语法), 下载 taglist_46.zip (https://www.vim.org/scripts/script.php?script_id=273)
1. 需要新增 $HOME/.ctags
使用指令可以查看ctags 支持的语言
$ ctags --list-maps=all
$ ctags --list-kinds=all
--langdef=systemverilog
--langmap=systemverilog:.sv.svh.svi
--regex-systemverilog=/^[ \t]*`SVT_REPLACEABLE_DEFINE\([ \t]*([a-zA-Z_0-9]+),.*\)/`\1/d,define/
--regex-systemverilog=/^\s*(\b(static|local|virtual|protected)\b)*\s*\bclass\b\s*(\b\w+\b)/\3/c,class/
--regex-systemverilog=/^\s*(\b(static|local|virtual|protected)\b)*\s*\btask\b\s*(\b(static|automatic)\b)?\s*(\w+::)?\s*(\b\w+\b)/\6/t,task/
--regex-systemverilog=/^\s*(\b(static|local|virtual|protected)\b)*\s*\bfunction\b\s*(\b(\w+)\b)?(\s*\[.+\])??\s*(\w+::)?\s*(\b\w+\b)/\7/f,function/
--regex-systemverilog=/^\s*\bmodule\b\s*(\b\w+\b)/\1/m,module/
--regex-systemverilog=/^\s*\bprogram\b\s*(\b\w+\b)/\1/p,program/
--regex-systemverilog=/^\s*\binterface\b\s*(\b\w+\b)/\1/i,interface/
--regex-systemverilog=/^\s*\btypedef\b\s+.*\s+(\b\w+\b)\s*;/\1/e,typedef/
--regex-systemverilog=/^\s*define\b\s*(\w+)/\1/d,define/
--regex-systemverilog=/^\s*(\b(static|local|private|rand)\b)*\s*(\b(shortint|int|longint)\b)\s*(\bunsigned\b)?(\s*\[.+\])*\s*(\b\w+\b)/\7/v,variable/
--regex-systemverilog=/^\s*(\b(static|local|private|rand)\b)*\s*(\b(byte|bit|logic|reg|integer|time)\b)(\s*\[.+\])*\s*(\b\w+\b)/\6/v,variable/
--regex-systemverilog=/^\s*(\b(static|local|private)\b)*\s*(\b(real|shortreal|chandle|string|event)\b) (\s*\[.+\])*\s*(\b\w+\b)/\6/v,variable/
--regex-systemverilog=/^\s*(\b(input|ouput|inout)\b)?\s*(\[.+\])*\s*(\b(wire|reg|logic)\b)\s*(\[.+\])*\s*(#(\(.+\)|S+)\))?\s*(\b\w+\b)/\9/v,variable/
--regex-systemverilog=/^\s*(\b(parameter|localparam)\b).+(\b\w+\b)\s*=/\3/a,parameter/
--systemverilog-kinds=+ctfmpied
这的function 正则匹配做了以下升级:
--regex-systemverilog=/^\s*(\b(static|local|virtual|protected)\b)*\s*\bfunction\b\s*(\b(\w+)\b)?\s*(\w+::)?\s*(\b\w+\b)/\6/f,function/
--regex-systemverilog=/^\s*(\b(static|local|virtual|protected)\b)*\s*\bfunction\b\s*(\b(\w+)\b)?(\s*\[.+\])??\s*(\w+::)?\s*(\b\w+\b)/\7/f,function/
适配这种情况:
function bit [11:0] freq_func(input bit[6:0] freqrange);
2. 需要在taglist/autoload/taglist.vim line_340新增以下代码(参考上面的verilog)
"systemverilog language
let s:tlist_lang_def["systemverilog"] = 'systemverilog;m:module;c:class;' .
\ 't:task;p:program;f:function;i:interface;e:typedef'
3. 更新vimrc
"Taglist ###########################
let Tlist_Ctags_Cmd = '<YOUR_PATH>/ctags'
let Tlist_Show_One_File = 1
let Tlist_Exit_OnlyWindow = 1
" let Tlist_Use_Right_Window = 1
" let Tlist_Compact_Format = 1 " remove message <F1> show help
PS: 几个常用的非贪婪匹配Pattern
- *? 重复任意次,但尽可能少重复
- +? 重复1次或更多次,但尽可能少重复
- ?? 重复0次或1次,但尽可能少重复
- {n,m}? 重复n到m次,但尽可能少重复
- {n,}? 重复n次以上,但尽可能少重复