如何使用vim跳转到函数定义?例如,使用Visual Assist,我可以在函数下键入Alt+ g,它会打开一个上下文菜单,列出带有定义的文件.
我怎样才能在vim中做这样的事情?
使用ctags.生成一个标签文件,并使用:tags命令告诉vim它在哪里.然后你可以使用Ctrl- 跳转到函数定义-]
此问题中有更多标签技巧和提示.
如果所有内容都包含在一个文件中,则会出现命令gd
(如'goto definition'),它将带您到光标下单词文件中的第一个出现位置,这通常是定义.
g* 在没有设置ctags的情况下做得不错.
也就是说,类型g,*(或只是*-见下文)搜索光标下的单词(在这种情况下,函数名).然后按n转到下一个(或Shift- n前一个)发生.
它没有直接跳转到定义,因为这个命令只是在光标下搜索单词,但是如果你现在不想处理设置ctags,你至少可以避免重新使用 - 键入要搜索其定义的函数名称.
- 编辑 - 虽然我已经使用g*很长一段时间了,但我最近发现了这些快捷方式的两个快捷方式!
(a)*将跳转到光标下的下一个单词.(无需g
在vi中键入'goto'命令).
(b)#以类似的方式前一次发生.
N和n仍然可以工作,但是'#'通常在反向开始搜索时非常有用,例如,在光标下查找变量的声明时.
使用gd
和gD
将光标放在程序中的任何变量上.
gd
将带你到当地的声明.
gD
将带你到全球宣言.
这里可以找到更多导航选项.
使用cscope交叉引用大型项目,如linux内核.
正如保罗·汤姆林所提到的,你必须使用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
另一种常见技术是将函数名称放在第一列中.这允许通过简单搜索找到定义.
int main(int argc, char *argv[]) { ... }
然后可以/^main
在文件内部或:grep -r '^main' *.c
目录中找到上述函数.只要代码被正确缩进,标识符在行的开头出现的唯一时间就是函数定义.
当然,如果你现在不使用ctags,你应该为自己感到羞耻!但是,我发现这个编码标准也是一个有用的补充.
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`
credit: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://packoverflow.com/a/53929/226255)
第二个保罗的回答:是的,ctags(特别是exuberant-ctags(http://ctags.sourceforge.net/))很棒.我还将此添加到我的vimrc中,因此我可以为整个项目使用一个标记文件:
set tags=tags;/
实现此目的的现代方法是运行语言服务器 -一个单独的独立应用程序(每种编程语言一个),该应用程序实时分析整个项目并为您的编辑器提供功能(这是一种通用解决方案)。您会得到如下信息:
命名空间感知标签完成
跳到定义
找到对一个对象的所有引用
查找实现接口的所有类型
在整个项目中重命名
悬停文档
格式化,整理和更多...
在nvim
和vim8
(或更高版本),你通过安装语言服务器协议插件郎服务器进行通信:
vim-lsp-client-处理与语言服务器的通信
deoplete-可选,在您键入时触发标签完成
您可以在Lang Server网站上找到活跃开发的语言服务器及其功能的列表。
语言服务器协议是由Microsoft为Visual Studio Code 创建的,并作为具有许可的MIT许可证(通过与Red Hat和Codenvy协作进行标准化)的开源项目发布。
我建议在选择的编辑器(VIM的DAP插件:vimspector)中结合使用LSP和DAP(调试适配器协议)来获得完整的IDE体验。