上一篇我讲了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多平台发布


freedom
4 声望0 粉丝