现在我正在处理一个使用许多类,方法,函数,变量等的文件。是否可以转到所有这些的声明?请注意,其中一些声明属于同一个文件,但其他声明属于其他文件(可能无法打开,您不知道声明的位置,但确实存在)。如果声明是目录中的一级,会发生什么?如果它是一级下降怎么办?
根据我们所讨论的编程语言,这是以不同的方式完成的,或者无论语言如何,查找声明的过程都是相同的吗?
我一直在阅读,似乎解决方案与标签有关。但是,我想知道如何实现这一目标(一步一步),特别是考虑到我们在某些情况下正在讨论其他文件中的定义。
我知道这可以通过IDE完成,但我想知道使用vim可以实现多少不同。
我只有全新安装的Vim。我还没有安装任何插件,但如果有必要,我愿意这样做。也许这可以在没有插件的情况下完成。
提前致谢!
答案 0 :(得分:24)
设置标签并不是那么困难(与Vim中的大多数事情一样),与IDE相比,它并不是那么自动。
ctags
工具。今天最常见的是 Exuberant Ctags ,可在ctags.sourceforge.net找到。tags
)。这通常是通过从项目根目录运行ctags -R .
来完成的(也可以通过:!ctags ...
从Vim内部运行)。丰富的Ctags支持41 languages,您甚至可以通过正则表达式扩展它。:set tags=./tags;
,它将在文件目录中向上搜索根目录。如果您有某些全局包含目录,则可以添加这些目录。<C-]>
和:tag
。您需要定期更新标签数据库;有插件(如easytags.vim)可以自动为您完成。
答案 1 :(得分:6)
您可以尝试gd
,它会转到本地声明,对于更强大的“转到定义”,您可能需要尝试使用Ingo建议的tags
。
答案 2 :(得分:1)
为此,我使用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>
假设您的<leader>
已通过,
映射到let mapleader = ","
,在我的情况下,以下命令将起作用:
,jd
转到定义或声明,ji
进行实施,jr
转到参考Ctrl+n
/ Ctrl+p
在会自动填充的列表中上下移动