最近使用vim直接查看linux源码的时候越来越多,许多时候想去看看函数的定义及其引用的时候,不会使用直接跳转的方法,查看起来十分的麻烦,所以总结一下通过cscope和ctags在vim下查看函数定义与引用的方法。
1、安装ctags和cscope
我使用的是ubuntu16.04,按如下方式安装:
apt-get install exuberant-ctags
apt-get install cscope
2、建立索引
在linux源码根目录,通过如下命令建立跳转索引:
find `pwd` -name '*.[chS]' -print > cscope.file && cscope -Rbkq
ctags -R
在当前目录下会生成几个索引文件:tags, cscope.file, cscope.in.out, cscope.out, cscope.po.out
建立索引后,这几个索引文件只会在执行命令的目录中保存。注意,索引是按照当前工程目录结构关系进行建立的,如果源文件有变动,cscope只能傻傻的跳到之前认为的地方。所以如果代码变化了,索引也需要更新。更新索引,就删除这几个文件,然后再执行上面的命令。
3、跳转到函数定义
使用vim打开文件,将光标移动到函数func处,按ctrl+],可跳转到函数func定义的地方。同理,有宏、结构体、变量。如果定义有多处,会列出列表,输入1、2、3...选择要跳转的目的地。
如果出现使用ctl+]报错:“E257: cstag: tag not found”,
解决方法:
# 创建~/.vimrc 文件,并输入如下内容,然后重启
idle@ubuntu:~/study/linux-5.4-arm64$ cat ~/.vimrc
set tags=tags;
set autochdir
4.查找函数引用
mkdir -p ~/.vim/plugin 创建文件夹,并下载 cscope.sourceforge.net/cscope_maps… 文件内容,保存到~/.vim/plugin/cscope_maps.vim
使用vim打开文件,将光标移动到函数func处,按ctrl+\,再按s,可展示所有引用func的地方。如果引用有多处,会列出列表,输入1、2、3...选择要跳转的目的地。
如果出现E429: File "mm/page_alloc.c" does not exist问题:
vim ~/.vimrc
加入:set cscoperelative,原因是当我们使用`cscope -Rbq`生成`cscope.out`文件时,使用的是相对路径。
5.跳转后返回
使用ctrl+]或ctrl+\方式跳转后,想要返回跳转前的位置,可使用ctrl+t,即可返回到上一处光标所在处。