跳转到vim中的函数定义

时间:2009-03-11 18:27:28

标签: function vim

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

我怎样才能在vim中做这样的事情?

11 个答案:

答案 0 :(得分:170)

使用ctags。生成一个标签文件,并使用:tags命令告诉vim它在哪里。然后你可以使用 Ctrl - ]

跳转到函数定义

this question中有更多标签技巧和提示。

答案 1 :(得分:113)

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

答案 2 :(得分:92)

g * 在没有设置ctags的情况下做得不错。

即,输入 g * (或只是 * - 见下文)来搜索光标下的单词(在此case,函数名称)。然后按 n 转到下一个(或 Shift - n 以前)。

它没有直接跳转到定义,因为这个命令只是在光标下搜索单词,但如果你现在不想处理设置ctags,你至少可以保存自己必须重新输入函数名称才能搜索其定义。

- Edit-- 虽然我长期使用g *,但我最近发现了这些快捷方式的两个快捷方式!

(a) * 将跳转到光标下的下一个单词。 (无需在vi中键入g,'goto'命令)。

(b)以类似的方式转到上一次出现。

N和n仍然可以工作,但是'#'通常非常有用,可以在反向开始搜索,例如,在光标下查找变量的声明时。

答案 3 :(得分:40)

将光标放在程序中的任何变量上时,使用gdgD

  1. gd将带您到当地宣言。
  2. gD将带您进入全球声明。
  3. here可以找到更多导航选项。

    使用cscope来交叉引用大型项目​​,例如linux内核。

答案 4 :(得分:14)

Paul Tomblin提到你必须使用 ctags 。 您还可以考虑使用插件来选择合适的插件或预览光标下的功能定义。 如果没有插件,您将会头痛地尝试选择数百个重载'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

答案 5 :(得分:11)

另一种常见技术是将函数名称放在第一列中。这允许通过简单的搜索找到定义。

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

然后可以在文件内部使用/^main或在目录中使用:grep -r '^main' *.c找到上述函数。只要代码正确缩进,标识符在行的开头出现的唯一时间就是函数定义。

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

答案 6 :(得分:9)

1-安装旺盛的ctags。如果您正在使用osx,本文将展示一个小技巧: http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html

2-如果您只希望在目录中包含文件的ctags,请在您的目录中运行以下命令:

ctags -R

这将为您创建“标签”文件。

3-如果您正在使用Ruby并且希望为您的宝石添加ctags(这对我使用RubyMotion和我开发的本地宝石非常有用),请执行以下操作:

ctags --exclude=.git --exclude='*.log' -R * `bundle show --paths`

信用:https://coderwall.com/p/lv1qww (注意,我省略了-e选项,它为emacs而不是vim生成标签)

4-将以下行添加到〜/ .vimrc

set autochdir 
set tags+=./tags;

(为什么是半结肠:http://vim.wikia.com/wiki/Single_tags_file_for_a_source_tree

5-转到您要关注的字词并点击ctrl + ];如果您想返回,请使用ctrl+o(来源:https://stackoverflow.com/a/53929/226255

答案 7 :(得分:6)

第二个保罗的回答:是的,ctags(特别是exuberant-ctags(http://ctags.sourceforge.net/))很棒。我还将此添加到我的vimrc中,因此我可以为整个项目使用一个标记文件:

set tags=tags;/

答案 8 :(得分:4)

执行此操作的现代方法是运行language server-一个独立的独立应用程序(每种编程语言一个),该应用程序实时分析整个项目并为编辑器提供功能(这是一种通用解决方案) 。你会得到类似的东西:

  • 了解名称空间的标记完成
  • 跳转到定义
  • 找到对对象的所有引用
  • 找到实现接口的所有类型
  • 在整个项目中重命名
  • 悬停文档
  • 格式化,整理和更多...

nvimvim8(或更高版本)中,您通过安装语言服务器协议插件来与lang服务器通信:

  1. vim-lsp-client-处理与语言服务器的通信
  2. deoplete-可选,在您键入时触发标记完成

您可以在Lang Server网站上找到活跃开发的语言服务器及其功能的列表。

语言服务器协议是由 Microsoft 为Visual Studio Code(VSC)创建的,并作为具有许可的MIT许可证的开源项目发布(通过与Red Hat合作进行标准化)和Codenvy)。

答案 9 :(得分:1)

安装cscope。它非常像ctags,但功能更强大。要进行定义,而不是 Ctrl + ] ,请执行 Ctrl + \ + g 。当然你可以同时使用它们。但是对于一个大项目(比如Linux内核),cscope领先一步。

答案 10 :(得分:0)

生成ctag之后,您还可以在vim中使用以下内容:

:tag <f_name>

上面将带您进入函数定义。