跳转到vim中的函数定义

Jon*_*egg 223 vim function

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

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

Pau*_*lin 195

使用ctags.生成一个标签文件,并使用:tags命令告诉vim它在哪里.然后你可以使用Ctrl- 跳转到函数定义-]

此问题中有更多标签技巧和提示.

  • 与C的相似性与CTags支持PHP无关.它支持PHP和Python.查看http://ctags.sourceforge.net/languages.html以查看完整支持. (10认同)
  • 没有使用Cscope的经验.是什么? (4认同)
  • 这已经过时了。当前的解决方案是使用可用于“vim”和“nvim”的 LSP 客户端之一作为插件,与实时分析代码的专用独立语言服务器结合使用。有许多 LSP 服务器,例如用于 Java 的 Eclipse.JDT.ls、用于 PHP 的 felixfbecker/php-language-server 等等。 (4认同)
  • 不爱Cscope? (3认同)
  • 如果能够最好地学习如何操作这些ctags,那就太棒了. (3认同)
  • php很像C,"Exuberant ctags"应该可以使用它.不知道它是否有python模式. (2认同)

Sco*_*e T 125

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

  • `/`几乎总是不精确,因为它会匹配所有的事件.我发现你实际上可以做`:tag <function_name>`通过ctags跳转到定义. (6认同)
  • 完成“gd”后如何回到原来的位置? (4认同)
  • @gloriphobia `Ctrl`+`o` 返回;`Ctrl`+`i` 前进 (4认同)

Bre*_*ust 99

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

也就是说,类型g,*(或只是*-见下文)搜索光标下的单词(在这种情况下,函数名).然后按n转到下一个(或Shift- n前一个)发生.

它没有直接跳转到定义,因为这个命令只是在光标下搜索单词,但是如果你现在不想处理设置ctags,你至少可以避免重新使用 - 键入要搜索其定义的函数名称.

- 编辑 - 虽然我已经使用g*很长一段时间了,但我最近发现了这些快捷方式的两个快捷方式!

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

(b)#以类似的方式前一次发生.

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

  • `*`和`g*`之间的区别在于搜索中的字边界.`*`执行`\ <keyword \>`搜索(与常规正则表达式中的`\ bkeyword\b`相同),而`g*`搜索没有字边界的`keyword`. (9认同)
  • @naught101,但是如果该函数出现两次,则“*”平均只需点击一次即可找到定义。除非你在定义上执行“*”,否则你可能应该短暂休息一下...... (2认同)

0x9*_*x90 43

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

  1. gd 将带你到当地的声明.
  2. gD 将带你到全球宣言.

这里可以找到更多导航选项.

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

  • @71GA你没有在我的回答下问:)`nmap &lt;silent&gt; gD &lt;Plug&gt;(coc-implementation)`应该将你想要的内容绑定到`gD`。 (2认同)

Myk*_*yev 14

正如保罗·汤姆林所提到的,你必须使用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


Jud*_*den 12

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

int
main(int argc, char *argv[])
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我一直想知道为什么有些程序员会这样写他们的签名! (12认同)

Abd*_*bdo 11

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

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

ctags -R
Run Code Online (Sandbox Code Playgroud)

这将为您创建"标签"文件.

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

ctags --exclude=.git --exclude='*.log' -R * `bundle show --paths`
Run Code Online (Sandbox Code Playgroud)

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

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

set autochdir 
set tags+=./tags;
Run Code Online (Sandbox Code Playgroud)

(为什么是半冒号:http://vim.wikia.com/wiki/Single_tags_file_for_a_source_tree)

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


Dav*_*ver 6

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

set tags=tags;/
Run Code Online (Sandbox Code Playgroud)


cpr*_*prn 6

实现此目的的现代方法是运行语言服务器 -一个单独的独立应用程序(每种编程语言一个),该应用程序实时分析整个项目并为您的编辑器提供功能(这是一种通用解决方案)。您会得到如下信息:

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

nvimvim8(或更高版本),你通过安装语言服务器协议插件郎服务器进行通信:

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

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

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

我建议在选择的编辑器(VIM的DAP插件:vimspector)中结合使用LSP和DAP(调试适配器协议)来获得完整的IDE体验。

  • Coc 支持自己的扩展类型,并附带一些扩展 - 其中有一个“符号列表”扩展。默认情况下它映射到 `&lt;space&gt;s` (至少我认为是这样 - 如果没有,只需输入 `:CocListsymbols`)。当列表触发时,您将获得一个输入来搜索变量、函数、类、接口等。 (2认同)