如何使用Vim跳转到函数定义?例如,在Visual Assist中,我可以在函数下输入Alt+g,它会打开一个上下文菜单,列出带有定义的文件。

如何在vim中做这样的事情?


当前回答

安装cscope。它的工作原理很像ctags,但更强大。要转到definition,请执行Ctrl + \ + g,而不是Ctrl +]。当然,您可以同时使用两者。但是对于一个大项目(比如Linux内核),cscope遥遥领先。

其他回答

使用ctags。生成一个标记文件,并使用:tags命令告诉vim它的位置。然后使用Ctrl-]跳转到函数定义

在这个问题中有更多的标签技巧和提示。

正如Paul Tomblin提到的,你必须使用标签。 您还可以考虑使用插件来选择合适的一个或在游标下预览函数的定义。 如果没有插件,你将会头疼地试图从数百个重载的“doAction”方法中选择一个,因为内置的ctags支持不考虑上下文-只是一个名称。

你也可以使用cscope和它的“查找全局符号”函数。但是你的vim必须用+cscope支持编译,这不是默认的一个构建选项。

如果您知道该函数在当前文件中定义,则可以在正常模式下使用'gD'键击跳转到光标下的符号定义。

这里是下载最多的导航插件 http://www.vim.org/scripts/script.php?script_id=273

下面是我编写的在跳转到标签时选择上下文的程序 http://www.vim.org/scripts/script.php?script_id=2507

保罗的第二个回答是:是的,ctags(尤其是exuberant-ctags (http://ctags.sourceforge.net/))很棒。我还添加了这个到我的vimrc,所以我可以为整个项目使用一个标签文件:

set tags=tags;/

如果所有内容都包含在一个文件中,则有命令gd(就像在'goto definition'中一样),它将带您到光标下的文件中单词的第一个出现处,这通常是定义。

另一种常用的技术是将函数名放在第一列中。这样就可以通过简单的搜索找到定义。

int
main(int argc, char *argv[])
{
    ...
}

上面的函数可以在文件中使用/^main或在目录中使用:grep -r '^main' *.c找到。只要代码被正确缩进,标识符只会出现在一行的开头是在函数定义处。

当然,如果你从此不再使用标签,你应该为自己感到羞耻!然而,我发现这个编码标准也是一个有用的补充。