如何使用vim跳转到函数定义?例如,使用Visual Assist,我可以在函数下键入 Alt + g ,它会打开一个上下文菜单,列出带有定义的文件。
我怎样才能在vim中做这样的事情?
答案 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)
答案 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-一个独立的独立应用程序(每种编程语言一个),该应用程序实时分析整个项目并为编辑器提供功能(这是一种通用解决方案) 。你会得到类似的东西:
在nvim
和vim8
(或更高版本)中,您通过安装语言服务器协议插件来与lang服务器通信:
您可以在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>
上面将带您进入函数定义。