34

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

这是否根据我们正在谈论的编程语言以不同的方式完成,或者无论语言如何,查找声明的过程都是相同的?

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

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

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

提前致谢!

4

3 回答 3

30

设置标签并不是那么困难,尽管(就像 Vim 中的大多数事情一样)它不像 IDE 那样自动。

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

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

于 2013-11-13T09:46:50.967 回答
7

您可以尝试gd,它进入本地声明,对于更强大的“去定义”,您可能想tags按照 Ingo 的建议尝试。

于 2013-11-13T03:33:24.257 回答
1

我为此使用了你完成我(ycm)插件,即

Vim 的快速、随需、模糊搜索代码完成引擎

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

例如,将它与 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>

假设您<leader>的映射到我,let mapleader = ","情况,则以下命令有效:

  • ,jd转到定义或声明
  • ,ji去执行
  • ,jr去参考
  • Ctrl+n/Ctrl+p在弹出的自动完成列表中向下/向上移动
于 2020-04-27T10:49:16.623 回答