【问题标题】:Vim: How to go to the declaration (of a class, method, function, variable, etc)Vim:如何去声明(类、方法、函数、变量等)
【发布时间】:2013-11-24 21:21:54
【问题描述】:

现在我正在处理一个使用许多类、方法、函数、变量等的文件。是否可以转到所有这些的声明?请注意,其中一些声明在同一个文件中,而另一些在其他文件中(可能无法打开,您不知道声明在哪里,但它们确实存在)。如果声明在目录中的上一级会发生什么?如果是低一级呢?

这是根据我们所讨论的编程语言以不同的方式完成的,还是无论语言如何,查找声明的过程都是相同的?

我一直在阅读,似乎解决方案与标签有关。但是,我想知道如何(逐步)实现这一点,特别是考虑到我们在某些情况下正在谈论其他文件中的定义。

我知道这可以通过 IDE 完成,但我想知道使用 vim 可以实现多少不同。

我只有全新安装的 Vim。我还没有安装任何插件,但如果有必要,我愿意这样做。也许这可以在没有和使用插件的情况下完成。

提前致谢!

【问题讨论】:

  • 是的,在 Vim 中最好使用标签来完成。您是否阅读过内置文档 (:help tags),您到底在为什么而苦苦挣扎?!
  • @IngoKarkat:感谢您的评论。我读了它,但我正在为搜索声明可能涉及不同文件这一事实而苦苦挣扎。此外,我不清楚这一切是否因编程语言而异。

标签: vim tags


【解决方案1】:

设置 标签 并不难,虽然(与 Vim 中的大多数东西一样)它不像 IDE 那样自动。

  1. 首先,您需要ctags 工具。今天最常见的是 Exuberant Ctags,可在 ctags.sourceforge.net 找到。
  2. 接下来,您需要为项目中的所有文件创建一个标签数据库(文件名tags)。这通常通过从项目根目录运行ctags -R . 来完成(也可以通过:!ctags ... 在Vim 中运行)。 Exuberant Ctags 支持41 languages,您甚至可以通过正则表达式对其进行扩展。
  3. 最后,需要配置 Vim 以获取 tags 数据库。使用:set tags=./tags;,它将在文件目录中向上搜索到根目录。如果您有某些全局包含目录,则可以添加这些目录。
  4. 这样,您就可以开始使用 Vim 的标签功能,例如 <C-]>:tag

您需要定期更新标签数据库;有一些插件(如easytags.vim)可以自动为您完成。

【讨论】:

  • 传递--exclude=file.js,或者忽略警告。
  • A) 使用ctags -R,在当前(项目根)目录下创建数据库,因此所有文件将向下;从文件的角度来看,这是相反的,所以不用担心。
  • B) 阅读:help 'tags':help file-searching(不要被吓倒!)。 C) 是的,例如。
  • 问题要求声明。 Ctrl+] 将带您进入定义,而不是声明。我加入了一个项目,其中使用文档作为 cmets 存在于带有声明的 *.h 文件中,而不是带有定义的 *.c 文件中。有一些方法可以跳转到声明和定义,这真的很方便。
  • 好的,我知道了。我需要使用 ctags 的 --LANG-kinds= 选项来添加函数原型。 vim 的 :tselect 命令可以轻松跳转到原型或定义。
【解决方案2】:

你可以试试gd,它会去本地声明,为了更强大的'去定义',你可能想试试 Ingo 建议的tags

【讨论】:

    【解决方案3】:

    我为此使用you complete me (ycm) plugin,即

    一个快速的、随你输入的、用于 Vim 的模糊搜索代码完成引擎

    它适用于多种语言并且非常强大。查看this section 了解如何在您的系统上安装它。

    例如,当将它与 Java Maven 项目一起使用,从包含您的 pom.xml 文件的文件夹中打开所需的文件,插件会扫描您的所有文件和依赖项。

    我的~/.vimrc 中有以下键映射,以便于使用您请求的功能:

    let g:ycm_key_list_select_completion = ['<C-n>', '<Down>']
    let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
    let g:SuperTabDefaultCompletionType = '<C-n>'
    nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
    nnoremap <leader>ji :YcmCompleter GoToImplementation<CR>
    nnoremap <leader>jr :YcmCompleter GoToReferences<CR>
    

    假设您的&lt;leader&gt; 使用let mapleader = "," 映射到,,在我的情况下,以下命令有效:

    • ,jd 去定义或声明
    • ,ji 去实现
    • ,jr 参考资料
    • Ctrl+n/Ctrl+p 在弹出的自动完成列表中向下/向上移动

    【讨论】:

    • 很好!但是,Vim 有 gd 用于获取定义,你可以在没有 ycm 的情况下使用它
    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    相关资源
    最近更新 更多