环境

  • Ubuntu22.04
  • VIM - Vi IMproved 8.2 (2019 Dec 12, 编译于 May 03 2024 02:37:51)

引言

Linux环境下,Source Insight只能在Wine环境下运行,显得并没有那么好用,于是便有了本文,使用Vim+Ctags+Cscope来进行阅读代码。

安装

安装Ctags

打开终端,运行以下命令安装 ctags

sudo apt install exuberant-ctags

如果你希望使用 universal-ctags(这是一个更新和维护更积极的分支),则可以安装它:

sudo apt install universal-ctags

安装Cscope

sudo apt install cscope

配置与使用

配置Ctags

在项目根目录执行如下命令生成tags文件:

ctags -R .  

可以发现在项目根目录下多了如下文件:

ls tags
tags

为了能够在项目中使用该文件作为tag索引,则在~/.vimrc中增加如下配置,这个配置的目的是为了能够让vim在项目的任意目录中都能够找到tags的配置:

set tags=./tags;/

使用Ctags

  • ctrl+t :在跳转之后,按下ctrl+t,vim就会返回之前的跳转位置
  • ctrl+] :将光标移动到函数或变量名上,按下ctrl+],vim会自动跳转到该函数或者变量的定义处
  • ctrl + w + ctrl + ]: 将光标移动到函数或变量名上,按下快捷键,vim会自动跳转到该函数或者变量的定义处并垂直拆分标签页
  • ctrl +w +w: 在刚才垂直拆分的标签页中来回跳转光标
  • ctrl + w + c: 关闭一个垂直拆分的标签页
  • :tags : 输入:tags, vim会显示所有可跳转的列表

配置Cscope

在项目根目录执行如下命令生成tags文件:

cscope -Rbq

可以发现在项目根目录下多了如下文件:

ls cscope*
cscope.in.out cscope.out cscope.po.out

为了能够在项目中使用这些文件作为索引,则在下载cscope的官方配置文件:

wget -O ~/.cscope_maps.vim https://cscope.sourceforge.net/cscope_maps.vim

并且在.vimrc中增加配置:

source ~/.cscope_maps.vim

使用Cscope

vim中光标放到一个symbol上,随后使用vim中配置的快捷键(details: ~/.cscope_maps.vim)。

  • a: 查找一个符合被赋值(assigned)的地方
  • c: 查找调用(call)这个函数的函数
  • d: 查找被这个函数调用(called)的函数
  • e: 使用(egrep)搜索进行查找
  • f: 按照文件(file)名查找
  • g: 查找一个符合的全局(global)定义
  • i: 查找包含(include)这个文件的文件
  • s: 查找一个符合(symbol)的引用
  • t: 查找这个文本(text)字符串的所有出现位置

e.g.: ctrl + \ + c: 搜索光标处的symbol在工程中被谁调用了。

创建脚本

为了每次创建cscopectag索引的方便快捷性,可以在/usr/local/bin目录下创建一个名为ctcs的脚本,脚本内容如下:

#!/bin/bash
#
# ctcs

star()
{
ctags -R *
if [ $? -eq 0 ]; then
echo "ctags successfully!"
fi
cscope -qbR
if [ $? -eq 0 ]; then
echo "cscope successfully!"
fi
}

del()
{
if [ -f tags -o -f cscope.out -o -f cscope.po.out -o -f cscope.in.out ]; then
rm -f tags && echo "clean tags ok!"
rm -f cscope.* && echo "clean cscope.* files ok!"
fi
}

case "$1" in
-r)
del
star
;;
-d)
del
;;
*)
echo "usage : ctcs -r|-d"
exit 1
esac

exit 0

随后使用如下命令赋予执行权限:

chmod +x /usr/local/bin/ctcs

Ref

https://cscope.sourceforge.net/cscope_maps.vim
https://stackoverflow.com/questions/563616/vim-and-ctags-tips-and-tricks
https://bigeast.github.io/Source_Code_Tree_Navigation_in_Vim.html
https://segmentfault.com/a/1190000044591252
https://blog.csdn.net/zg_hover/article/details/78917921