听说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
当然也可以选择源码包方式进行安装,https://sourceforge.net/projects/ctags/files/,解压缩之后,在源代码目录中依次执行下述命令即可
$ ./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
同样也可以使用源码包进行安装,https://sourceforge.net/projects/cscope/files/,安装命令同上。接下去就是配置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下载地址:https://www.vim.org/scripts/script.php?script_id=273
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的下载地址:https://www.vim.org/scripts/script.php?script_id=1658
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 | 含义 |
---|---|
0或者s | 查找这个C符号 |
1或者g | 查找这个定义 |
2或者d | 查找被这个函数调用的函数(们 |
3或者c | 查找调用这个函数的函数(们) |
4或者t | 查找这个字符串 |
6或者e | 查找这个egrep匹配模式 |
7或者f | 查找这个文件 |
8或者i | 查找#include这个文件的文件(们) |
比如我想查找main这个函数的定义,那么在底线命令行中输入
cs find g main
附:本文参考