vim-ctag-符号查找

2024/06/16

Tags: C++ C VIM CTags

Table of Contents

0x00 为什么使用CTag

长久以来, 我一直在ide中使用VIM插件,除此之外在Bash,Zsh也使用vim作为基本的文本编辑器, 所有的Git操作也都都交给了VIM+ Shell,在文本编辑方面,我使用统一的一套快捷键方案

我使用过的IDE:visual studio , visual studio code , qt creator

他们都有很好的VIM插件,并且集成了很好的符号查找,所以作为实用主义者,我一直觉得没有使用CTag+VIM的必要

直到上周疯狂摸鱼后,被抓去写 C & Embedded, 我接触到了 Xilinx Vitis这款AMD旗下的IDE,这货竟然没有VIM键盘方案

整一周在这条路上我走得像一个瘸子,痛定思痛,我认为是时候端出CTag这根阵年火腿了

0x01 CTag安装+生成索引

0x0101 安装

由于编译服务器是Ubuntu,所以先只记录Ubuntu, 其他平台大差不差

1
$ sudo apt-get update && sudo apt-get install -y exuberant-ctags

0x0110 生成索引

写一个用于生成c/c++ tag的脚本 ctag.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash
regex="^.+.+$" 
if [[ ! $1 =~ $regex ]]; then
    echo "需要输入生成tag的目录的绝对路径,不能是‘.’"
    exit 1
fi

cd $1
ctags -R --languages=c,c++ --exclude=node_modules  --c++-kinds=+p --fields=+iaS --extra=+q .

-R:递归处理当前目录及其子目录中的所有文件。

--languages=c,c++:指定要处理的编程语言为 C 和 C++。

--exclude=node_modules:排除 node_modules 目录,不处理该目录下的文件。

--c++-kinds=+p:在 C++ 中包括函数原型(prototypes)标签。

--fields=+iaS:为生成的标签添加额外的信息。

--extra=+q:为标签添加额外的扩展信息。

使用脚本

1
2
3
sudo chmod +x ctag.sh
cd src
ctag.sh $(pwd)

0x10 在VIM中使用CTag 索引

在.vimrc 中配置 tags的路径

1
set tags=./.tags;$HOME  #从当前目录向上递归搜索.tags目录,直到到$HOME目录

在 Vim 中打开任何源文件,并使用以下基本命令:

键盘命令 行动
Ctrl + ] 或 或g] :ta[g] Ctrl+rw 使用标签文件中的信息跳转到光标下方的标签
:ts[elect] <tag_name> 使用标签文件中的信息列出匹配的标签。如果未给出,则使用标签堆栈中的最后一个标签名称<tag_name>``<tag_name>
:pts[elect] <tag_name> 在不移动光标的情况下在“预览”窗口(水平拆分)中执行并显示新标签:tselect
Ctrl + w }:ptag Ctrl+rw 打开一个预览窗口,其中包含标记定义的位置。光标不会更改其位置,因此不会更新标签堆栈
Ctrl + wz:pc 关闭命令创建的预览窗口Ctrl+w }
Ctrl + w Ctrl + ] 在水平拆分中打开定义
:tn 跳转到下一个匹配标签(如果有多个匹配项)
:tp 跳转到上一个匹配标签(如果有多个匹配项)
Ctrl-t 在标签堆栈中跳回
:tags 显示标签堆栈的内容。活动条目标有><br /
:tag 正则 用正则搜索tag

也可以在shell中直接使用vim 打开 搜索的tag

1
vim -t '/vimregex'

0x11 其他补充

需要注意,修改程序后需要重新生成ctag,

0x1100 代码补全

生成ctags后也可以用地代码补全, ctrl+n, ctrl+p

image-20240616141642998

0x1101 头文件切换

光标定位于#include gf 可以跳到头文件, 前是在.vimrc中配置了path+=path2include

也可以配置 在.vimrc 中配置path+=**

这样vim中使用 :find 就会递归搜索,

然后

: find %:r.c 切换到当前header对应的source

: find %:r.h 切换到当前source对应的header

>> Home

Comments