ctags
1.安装ctags
sudo apt-get install ctags
也可以源码安装或直接下载可执行的bin文件。
2.生成tags数据文件
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q
也可以先生成一个文件列表,再根据文件列表生成tags数据文件。这样可以排除不想要的一些源码文件。
ctags --c++-kinds=+p --fields=+iaS --extra=+q
对于linux kernerl源码,有个更简单的方法。
make tags ARCH=arm64
另一个生成tags数据的命令:
ctags -R --c++-kinds=+p --fields=+ias --extra=+q --tag-relative=yes --links=yes -o ~/xxx/tags
3.加载tags文件
如果tags文件在当前目录下,当打开vim的时候可自动加载。
如果不在当前目录下,可在vim中用如下方法加载tags文件。
:set tags=~/xxx/tags
使用tags
ctrl-]
跳转到光标所在标识符定义处。
ctrl-w ]
分割窗口并跳转到光标所在标识符定义处。
ctrl-t
跳回去。
:tag xxx
跳转到xxx定义处。
:stag xxx
分割窗口并跳转到xxx定义处。
:tags
显示跳转历史。
:tag
跳转到跳转历史的最后一条。
:[n]tnext
下一个。
:[n]tprev
上一个。
:tfirst
第一个tag。
:tlast
最后一个tag。
:tag xxx_<Tab>
自动补全。
:tag /xxxx
搜索而不是完全匹配。
其它用法:
:help tag
cscope
vim默认支持cscope
http://cscope.sourceforge.net
1.安装cscope
sudo apt-get install cscope
2.生成cscope数据库文件
cscope -Rbq -f xxx.out
也可根据文件列表生成cscope数据库文件。这样可以排除源码目录中某些不想要的源码文件。
cscope -bqk -i cs.files
对于linux kernel,应该指定“k”选项:
cscope -Rbqk -f xxx.out
另外,对于linux kernel,有更简单的方法:
make cscope ARCH=arm64
在vim中使用cscope
加载cscope数据库文件:
:cs add ~/xxx/cscope.out
如果cscope数据库文件在当前目录,是可以自动加载的。
:cs help
:cs find c/d/e/f/g/i/s/t
:help cs
cscope的快捷键
有一个插件,将cs命令映射成快捷键。
http://cscope.sourceforge.net/cscope_maps.vim
下载这个插件,放到~/.vim/plugin/目录下,可以使用快捷键。
ctrl-\ c
: 查找调用本函数的函数
ctrl-\ d
: 查找本函数调用的函数
.ctrl-\ s
: 查找C语言符号出现的地方。
ctrl-\ g
: 查找C语言符号定义的地方。
ctrl-\ t
: 查找指定的字符串。
ctrl-\ e
: egrep模式,相当于egrep功能,但比egrep快多了。
ctrl-\ f
: 查找并打开文件,类似于vim的find功能。
ctrl-\ i
: 查找包含本文件的文件。
附A:生成文件列表的一种方法
find . \
-path "./arch/*" ! -path "./arch/arm64/*" -prune -o \
-path "./Documentation*" -prune -o \
-path "./scripts*" -prune -o \
-name "*.[chxsS]" -print > cs.files
附B:vim之于程序的其他常用方法
[I
查找全局标识符定义。这个命令不依赖ctags,而是在当前文件和include的文件中搜索。
[<Tab>
查找全局标识符定义并直接跳转到第一个匹配的。
3[<Tab>
跳转到第3个匹配的。
[i
只列出第一个匹配的。
]I
只列出当前光标之后的匹配项。
]i
只列出当前光标之后的第一个匹配项。
[D
只查找以"#define"定义的宏。
[d
只列出第一个匹配。
]D
只列出当前光标之后的匹配。
]d
只列出当前光标之后的第一个匹配。
gD
与[I
类似,但只搜索当前文件,不搜索include的文件。
gd
只在当前函数中查找。
[#
跳转到#if或#ifdef。
]#
跳转到#else或#endif。
[[
跳转到代码块开头。
][
跳转到代码块结尾。
[{
跳转到代码块开头,但越过平级的代码块。
]}
跳转到代码快几位,但越过平级的代码块。
[]
上一个函数的结尾。
]]
下一个函数的开始。
[m
上一个成员函数的开头。
]m
下一个成员函数的开头。
[/
注释的开头。
]/
注释的结尾。