在vi/vim中如何找到一个C代码函数的调用者和被调用者?

11

我想知道如何轻松点击(或使用一些简单的快捷键)函数名称并查找所有调用方或打开其定义的位置。大多数Web手册都很难理解或不能正常工作。比如,我想点击allocuvm并查看它在哪里被定义了?

uint newstk=allocuvm(pgdir, USERTOP-PGSIZE, USERTOP); 

5
要跳转到定义,请使用ctags。要查找函数的调用者,请使用cscope。搜索这两个术语,您会找到大量信息。 - glts
3个回答

22

cscope最简单的例子

Ingo提到了,这里有一个例子。

首先你应该在你的.vimrc文件中设置:

set cscopequickfix=s-,c-,d-,i-,t-,e-

然后进入您的项目的根目录并运行:

cscope -Rb

这将生成一个cscope.out文件,其中包含分析信息。即使对于像Linux内核这样的大型项目,生成速度也相当快。

打开vim并运行:

:cs add cscope.out
:cs find c my_func

c 是表示 callers 的助记符。其他提供的 cscope 查询也是可能的,对应的助记符列在下面:

help cscope

这将向快速修复列表中添加一个调用者列表,您可以使用以下命令打开:

:copen

前往您感兴趣的行,按回车键跳转到该行。

要查找当前光标下函数名称的调用者,请在.vimrc文件中添加以下内容:

function! Csc()
  cscope find c <cword>
  copen
endfunction
command! Csc call Csc()

当光标在函数上方时,键入:Csc<enter>

TODO:

一句忠告:我喜欢vim,但对于我来说设置这种东西太复杂了。 它也不考虑类,例如C ++中的类。 如果一个项目很重要,请尝试在一些“IDE”上工作。 如果项目没有跟踪IDE配置文件(这些是自动更改的污染库的大块),则可能涉及一些额外的开销,但对我来说这是值得的。 对于C / C ++,我迄今为止最喜欢的是KDevelop 4。


2
在vim中,<C-r><C-w>ctrl-r ctrl-w)将插入光标下的单词。这使得cs find c my_func更容易使用。 - pattivacek
@patrickvacek 是的,那是另一个选项。但由于 :cs find c 是很多字符,我更喜欢使用带有 <cword> 的命令;-) - Ciro Santilli OurBigBook.com
有一件事情是缺失的。在运行 :cs find c my_func 后,结果没有自动添加到 quickfix 中。运行 copen 会得到一个空的 quickfix 窗口。你需要在你的 .vimrc 文件中添加 set cscopequickfix=s-,c-,d-,i-,t-,e- 才能让它正常工作。 - Salahuddin
@Salahuddin 谢谢你提供的信息,可能是我的其中一个插件设置了这个,现在已经添加了。 - Ciro Santilli OurBigBook.com

12
为此,Vim与cscope工具集成;有关更多信息,请参见:help cscope

1
我发现cscope无法找到C++方法的被调用者。 “查找调用此函数的函数”命令仅适用于C函数。在C ++情况下,如果我提供ClassName :: MethodName,则始终会给我“这不是C符号”,而如果我只提供方法名称,则会给我“Egrep y在此模式中:MethodName”。但是,“查找调用此函数的函数”(调用程序)适用于C函数和C ++方法。 - kakyo

-1

vi / . --- / 是 vi 中的搜索功能,而 . 将重复相同的命令。

如果是大文件,您也可以使用 sed(流编辑器)。 sed grep 可以获取行号

阅读 man 页面


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接