1. 前言
其实很早之前就应该写这篇文章了,只是最近太忙了。这几天看到我只列了一个空标题在这里都有好几个人点进来看过了,感觉做得挺不厚道,想想还是先写一点吧,一方面也是为了表明本文绝对是干货满满,值得期待的,废话不多说了,进入正文。
2. 项目管理相关
A) 快速模块跳转
不知道有多少读者有过维护项目目录的经验,我反正是做过一次之后就生不如死,于是赶紧开发出来了这么一套方法。你是否经常忘记某个模块的代码放在哪个目录里?你是否经常为了追溯一根信号线需要跨越几十个模块然后不停切换目录和文件到头晕眼花?有了这个方法,你就可以立刻从此摆脱这样的烦恼,任何模块跳转动作只需要几秒钟就可以立刻完成!同时你再也不需要记得目录树结构了!
值得注意的是,本方法只在Linux和类Unix系统下有效,Windows系统的用户可能需要使用Cygwin,至于如何在Windows平台下搭建Cygwin环境,我之后会专门开一篇文章来写。
首先,你需要进入项目工程的顶层目录,假设你整个项目最顶层的目录名叫myproject,那么你就先进入这个目录,然后调用Linux自带的ctags工具生成整个工程目录的标签列表。
[source lang="bash"]
cd myproject
ctags -R *
[/source]
顺利的话,你将会看到在myproject下新创建了一个叫tags的文件,在这个文件里将会以“定义名称 文件位置:行数”的格式将你所有项目中的模块,信号,参数定义全部列出,而此处参数-R的含义是递归执行,也就是从顶层目录向下自动遍历全部子目录进行文件检索和定义收录。在默认配置下,ctags可以自动识别.v和.vhdl后缀文件的语法,如果你同时希望收录测试平台中的.sv文件的话,可能你需要额外增加一个System Verilog的语法说明文件。
有了这个标签列表之后应该如何使用呢?总不能每次都打开这个tags文件然后挨个查询吧?当然不是,接下来我们需要把这个tags文件和Vim结合起来。首先我们需要打开.vimrc文件,这个文件一般位于用户根目录下,即~/.vimrc,是一个隐藏文件,如果是OS X用户,这个文件名可能是.virc。而Windows用户一般是_vimrc,位置跟Gvim的安装目录有关。打开该配置文件后在任意位置(例如最后)输入以下内容:
[source lang="bash"]
set tags=tags;
set autochdir
nnoremap t :tag<space>
[/source]
(第4行为网站乱码,只需写入前3行就可以)第一行命令的含义是指定标签列表名称为tags,命令最末的;号不可省略,其含义是告知Vim首先在当前目录下寻找tags文件,如果找不到则自动向更上一级目录查找,现在你明白为什么我们一开始要把tags文件生成在项目的顶层目录了吧。第二行命令不是必须的,其含义是每次打开新的文件时,自动将终端切换到该文件的所在目录下。这个功能我觉得挺好用的,有时候偷懒甚至就干脆用这个功能来切换目录了,不过也有人跟我抱怨过不喜欢这个功能,各位按自己的喜欢来选择是否增加该命令吧。第三个命令同样也不是必须的,只是由于经常需要使用tag进行文件切换,所以我习惯于将命令模式下的t键功能映射为自动输入:tag (此处有空格)。设置完毕后保存退出。
下面就是见证奇迹的时刻了。你可以进入项目目录下的任何一个子目录,然后vi sfsfs随便啥反正目的只是为了打开Vim编辑器。如果你的vimrc配置跟我上文写的一模一样,那么你就按一下t,如果你的vimrc里没有nnoremap t:tag这一句的话,请手工输入:tag (此处有空格)。然后接着输入任何项目中存在的模块名称,信号名称或者参数名称。比如项目中有一个模块名叫uart,那么完整的命令应该是:tag uart。注意,如果你并不记得模块的完整名称也没关系,随时按下tab键都可以自动补全,即使你连开头都不记得了,还可以用/keyword的办法进行搜索。输入完毕后按下回车,如果Vim在标签列表中只找到唯一匹配定义的话,就会立刻跳转到对应文件的对应行;如果找到的匹配结果不止一个,就会把所有结果列出来让你用数字序号选择跳转目标
很多老手看到这里可能觉得不够过瘾,就只是这样而已,我也早就会了,只不过嫌太麻烦而已,还不是要不停输入模块名称吗,能快到哪里去?呵呵,最会偷懒的我怎么可能只是做到这样的程度而已呢?
大家觉得,平时在修改代码设计的时候,最需要进行频繁文件跳转的是什么时候?是不是当你找到了一个关键的寄存器,想顺着信号的传播路径一直跟踪下去的时候?当你跟着这个信号来到一个模块例化面前,是不是恨不能立刻跟着信号钻进这个模块的代码里去?其实,这非常简单。
根据我们前面的介绍,你肯定已经想到了,可以通过:tag module_name跳转到这个模块的设计文件,但是这样太麻烦了,万一模块名字老长还带有大小写,写一遍就得费老半天功夫。有一个相对简单的办法,把光标移动到模块名称上,按下ctrl+],你会发现自己立刻飞到了该模块的设计文件中!但是!!等等!!我刚才要跟踪的信号是什么名字来着?忘记了对不对?这个方法还是不够方便。
有没有更简单的办法?这个办法最好能从我们决定要进入这个模块的那一刻起,只用一个按键操作就能立刻进入这个模块的设计文件,同时光标最好还能直接定位到我们要追踪的信号位置,这个信号的名字最好还能被高亮显示!当!然!没!问!题!
[source lang="bash"]
nnoremap [] ?\.<cr>wviwy*#/);<cr>%bb<c-]>/<c-r>"<cr>
[/source]
在.vimrc配置文件中输入以上魔法命令(第2行为网站乱码,只需写入第1行就可以),重新打开任何Vim文件,假装自己跟踪到了某个模块例化的某个信号上,类似.abc (net_abc),通常你跟踪到这里的时候,光标应该是放在net_abc上面,这时你在键盘上快速按下[和]这两个键,发生了什么??!!!我是谁??!我在哪里?!!!恭喜你!成功进入了该模块!!!并且光标飞到了之前net_abc所连接的abc管脚上!!