vim+ctags+cscope+Taglist+Nerdtree打造成sourceinsight

vim+ctags+cscope+Taglist+Nerdtree打造成sourceinsight

听说vi很强大?是的,最近笔者需要在Linux下编写一些C代码和查看一些C源码,但是默认的vi并不支持函数之间的跳转、查看函数的定义等等,所以笔者就将vi打造成了一个ide(可以勉强称得上吧)。首先我们来看一下搭建完成之后的样子:

那么下面我们通过ctags+cscope+Taglist+Nerdtree将vi/vim打造成一个ide。

0.环境描述

Linux版本:ubuntu 16.04_64 LTS

vi版本:vi/vim v7.4

所用用户:root

1.安装配置ctags

ctags可以实现找到这个函数的定义处,也可以退回到上一步。那么要想使用ctags,首先使用下面的命令安装

$ sudo apt-get install ctags

当然也可以选择源码包方式进行安装,sourceforge.net/project,解压缩之后,在源代码目录中依次执行下述命令即可

$ ./configure
$ make 
$ make install

安装完成之后,想要使用ctags,那么必须在你想要调试或者查看的代码目录中有tags文件,使用如下语句即可生成tags文件,当用户在当前目录中运行vi时,会自动载入此tags文件。

$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q
-R表示递归创建,也就包括源代码根目录(当前目录)下的所有子目录;
--c++-kinds=+ps是为c/c+语言添加函数原型信息;
--fields=+iaS是为标签添加继承信息(inheritance),访问控制信息(access)和函数特征(Signature)如参数表或原型等;
--extra=+q是为类成员添加标签;

假如你想让你当前目录文件中的函数名在其他目录中打开vim时也能被定位到的话,那么可以把当前目录的tags文件路径添加到~/.vimrc中,如下所示

set tags+=/root/mit6.828/jos/tags

tags包括以下文件:

  • #define定义的宏
  • 枚举型变量的值
  • 函数的定义、原型和声明
  • 名字空间(namespace)
  • 类型定义(typedefs)
  • 变量(包括定义和声明)
  • 类(class)、结构(struct)、枚举类型(enum)和联合(union)类
  • 结构和联合中成员变量或函数

个人的理解,ctags能定位函数主要是将上述的信息存储到了tags文件中,当我们使用ctags一些命令时,它都会从设置tags路径中查找相应的值,然后跳转过去。下面的cscope同理。

2.安装配置cscope

cscope可以说是ctags的升级版,他可以在代码中实现快速切换到函数的定义处、查找某个函数被使用的情况等等。假如没有安装cscope可以使用下述命令先安装:

$ sudo apt-get install cscope 

同样也可以使用源码包进行安装,sourceforge.net/project,安装命令同上。接下去就是配置cscope,因为使用cscope查找函数定义等,需要用到cscope.out数据库,通过下面命令即可递归所有源码文件生成.out文件:

$ cscope -Rbkq

当然我们也可以将相关文件汇集到某一个文件(如cscope.files),然后再使用cscope -bkq -i cscope.files生成out文件,如下:



生成.out文件之后,我们需要在当前用户的用户目录中的.vimrc文件中把.out数据库的路径配置进去,假如不配置的话,cscope无法查找.out所在目录文件中的函数等,使用cs add命令添加.out的路径,即在~/.vimrc文件中添加下面这些内容即可

cs add /home/jackie/fragmetation/linux-4.12.1/linux/cscope.out

当然我们也可以在vim打开的文件中,在底线命令模式下输入上述内容,但是底线命令模式的话,重新打开vim之后,要想再次使用该路径下的cscope.out,那么得再次添加。同ctags,假如将当前目录A中的.out文件的路径添加到了~/.vimrc文件中的话,那么在其他地方打开vim,也可以定位目录A中文件的内容了。

.vimrc文件不存在的话,那么自己创建一下;
当前用户的用户目录:比如root用户那么就是在/root目录下


3.安装配置Taglist

Taglist其实是一个vim的插件,能将当前vim打开的文件中函数名、变量名等在一个窗口中列出来,并支持通过列出的函数名实现跳转。将Taglist下载下来的压缩包解压缩,将解压缩出来的doc里面的taglist.txt复制到~/.vim/doc/下面,plugin里面的taglist.vim文件拷贝到~/.vim/plugin目录下。这就相当Taglist这个插件安装完成了。

接下来是使用Taglist,在vim打开的文件中,切换到底线命令模式,输入Tlist即可使用该插件了。当然你想设置快捷键也可以,如下就是将F2设置为打开Taglist的快捷键了:

 " Tlist 的快捷键
 map <F2> :Tlist <CR>

附:Taglist下载地址:vim.org/scripts/script.


4.安装配置Nerdtree

Nerdtree其实也是一个vim插件,他是列出当前目录的文件结构。同安装Taglist类似,先下载压缩包,将解压缩的文件拷贝到~/.vim/中即可,但是你会发现下载来的压缩包东西有点多,你可以把压缩包的东西都拷贝到~/.vim/中。

Nerdtree使用方式也跟Taglist一样,在vim打开的文件中,切换到底线命令模式,输入NERDTree ,回车就可以了,当然你也可以设置快捷键方式。考虑到Nerdtree和Taglist共同显示的问题,我们可以将NERDTree设置到vim窗口的右侧(默认为左侧),在~/.vimrc文件中添加如下内容

let NERDTreeWinPos="right"

当你想打开NERDTree窗口的时候,自动显示书签,那么在~/.vimrc文件中添加如下内容

let NERDTreeShowBookmarks=1

当你想在vim启动的时候默认开启NERDTree,那么在~/.vimrc文件中添加如下内容,其中autocmd可以缩写为au

autocmd VimEnter * NERDTree

附:Nerdtree的下载地址:vim.org/scripts/script.


5.上述工具的简单使用

这篇先讲一下上述工具的简单基本的使用,更加详细的工具介绍以后还会推出。

ctags的简单使用

当前目录生成tags文件之后,在当前目录vim一个文件,只有就可以操作了:

:ta x(ta是tag的缩写)跳转到符号x的定义处,如果有多个符号,直接跳转到第一处:ts x列出符号x的定义:tj x可以看做上面两个命令的合并,如果只找到一个符号定义,那么直接跳转到符号定义处,如果有多个,则让用户自行选择:tn/:tp在符号的多个定义之间跳转Ctrl+]跳转到当前光标下符号的定义处,和ta类似Ctrl+t退到跳转之前

cscope的简单使用

cscope用的比较多的是在vim底线命令模式中输入如下格式的内容:

:cs find {querytype} {name}

其中{querytype}内容如下:

querytype含义0或者s查找这个C符号1或者g查找这个定义2或者d查找被这个函数调用的函数(们3或者c查找调用这个函数的函数(们)4或者t查找这个字符串6或者e查找这个egrep匹配模式7或者f查找这个文件8或者i查找#include这个文件的文件(们)

比如我想查找main这个函数的定义,那么在底线命令行中输入

cs find g main


附:本文参考

源代码查看工具:vim中ctags的使用(跳转查定义)blog.csdn.net
利用ctag+cscope+taglist+Nerdtree打造功能等价于sourceinsight的内核代码阅读神器blog.csdn.net
Vim+ctags+cscope+Nerdtree+Taglist入门blog.csdn.net

关注微信公众号【一口程序锅】,一口想煮点技术的锅。

发布于 2019-10-02

文章被以下专栏收录