上一篇我讲了VIM常用命令的总结与使用,没看到的同学可以点开看看。
大家阅读代码的时候普遍使用vscode的比较多,但是使用vscode阅读代码会偶尔出现no definition found不知道有没有遇到过,为了避免这样的麻烦产生,小编这次带大家使用VIM来一起阅读C/C++代码,轻松方便快捷而且也有IDE的效果。
安装ctags与cscope
ctags插件的作用
第一步安装vim需要的工具,ctags是一个常用的代码索引工具,用于生成代码中各种符号(例如类变量函数等)的索引文件,它可以用于各种编程语言。
ctags通常与vim一起使用,以便在于都代码的时候更好的利用ctags提供的功能:代码导航,跳转到定义,查找引用,代码补全,重构支持
安装ctags
使用以下命令安装
sudo apt install ctags
创建ctags数据库
ctags有大量的命令行参数,如果要对目录下的所有C代码生成tags文件,进入项目的根目录我们使用
ctags --languages=c --langmap=c:c.h --fields=+S -R .
参数说明:
- --langages=c 选项来检查项目工程下所有C语言文件
- --langmap=c:.c.h 选项是说.h默认是C++文件,这里告诉ctags说.c.h都是C文件
- --field=+s 选项是说tags文件里加入函数签名信息
如果要对目录下下的所有代码C/C++,汇编生成tags文件,进入项目的根目录我们使用
ctags -R .
发现目录下有新生成的tags文件,是专门符号(例如类变量函数等)的数据库索引文件
使用tags文件
如果当前目录下tags文件,vim会自动使用这个文件做一些设定,我们只需要再正常模式下用快捷键即可。
以下是常用的快捷键
- ctrl+t :在跳转之后,按下ctrl+t,vim就会返回之前的跳转位置
- ctrl+] :将光标移动到函数或变量名上,按下ctrl+],vim会自动跳转到该函数或者变量的定义处
- :tags : 输入:tags, vim会显示所有可跳转的列表
cscope插件的作用
虽然用ctags创建的tags数据库可以通过符号名称帮我们查找函数定义处,但是无法帮我们找到所有使用该函数的地方,这时候我们可以两种方法
- 使用搜索工具: grep
- 使用vim内置的检索的工具:Cscope
由于Vim有内置对cscope的支持,我们优先采用cscope方法.
cscope提供的功能: 查找引用某符号的地方、调用某函数的地方、包含某文件得地方,就是cscope的独特地方
下图所示是使用cscope可以清晰快速看到所有使用该函数、变量的地方
安装cscope
使用以下命令安装
sudo apt install cscope
创建cscope数据库
进入到代码项目的根目录,在终端中运行以下命令,生成cscope数据库文件
cscope -Rbq
发现目录下有新生成的cscope.out,cscope.in.out,cscope.po.out文件
使用cscope.out文件
打开vim,在命令行串口中输入cs,可以看到cscope命令使用方法
- a: 查找一个符合被赋值(assigned)的地方
- c: 查找调用(call)这个函数的函数
- d: 查找被这个函数调用(called)的函数
- e: 使用(egrep)搜索进行查找
- f: 按照文件(file)名查找
- g: 查找一个符合的全局(global)定义
- i: 查找包含(include)这个文件的文件
- s: 查找一个符合(symbol)的引用
- t: 查找这个文本(text)字符串的所有出现位置
下面列举下小编阅读代码经常使用的几条cscope命令
cscope find s xxx 在.h文件查找一个符合(symbol)xxx函数/变量的声明
cscope find t xxx 查找xxx函数/变量在项目代码中出现的所有出现位置
cscope find g xxx 查找xxx函数/变量的全局(global)定义 == ctrl+]
cscope find c xxx 查找(call)xxx这个函数被谁调用了
每次敲上面的这串命令,有点影响效率,小编在.vimrc配置文件中做出快捷键方便阅读代码
nmap <silent> <F5> :cs find s <C-R>=expand("<cword>")<CR><CR> :botright copen<CR><CR>
nmap <silent> <F6> :cs find t <C-R>=expand("<cword>")<CR><CR> :botright copen<CR><CR>
nmap <silent> <F7> :cs find g <C-R>=expand("<cword>")<CR><CR> :botright copen<CR><CR>
nmap <silent> <F8> :cs find c <C-R>=expand("<cword>")<CR><CR> :botright copen<CR><CR>
- F5对应命令cscope find s xxx
- F6对应命令cscope find t xxx
- F7对应命令cscope find g xxx
- F8对应命令cscope find c xxx
有需要VIM配置文件的可以在关注公众号[ Linux随笔录 ], 回复关键字"vim"即可获得
如果本篇对你有帮助的,可以一键三连支持一波
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。