TL;DR:
您可以使用内部 VIM 功能执行此操作,但一种现代(且更简单)的方法是使用 COC 进行类似智能感知的完成,并使用一个或多个 language servers (LS) 进行跳转-to-definition(以及更多)。要获得更多功能(但跳转到定义不需要),您可以安装一个或多个 debuggers 并获得完整的 IDE 体验。
最好的第二个是使用名为define-search 的本机 VIM 功能,但它是为 C 预处理器的 #define 指令发明的,对于大多数其他语言来说,需要额外配置,因为有些根本不可能(你也错过了其他 IDE特征)。最后,回退到 ctags。
快速入门:
- 安装vim-plug来管理你的VIM插件
- 在
~/.vimrc 的顶部添加COC 和(可选)Vimspector:
call plug#begin()
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'puremourning/vimspector'
call plug#end()
" key mappings example
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gD <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
" there's way more, see `:help coc-key-mappings@en'
- 调用
:source $MYVIMRC | PlugInstall重新加载VIM配置和下载插件
- 重启
vim并拨打:CocInstall coc-marketplace即可轻松访问COC扩展
- 致电
:CocList marketplace并搜索语言服务器,例如:
- 输入
python 查找coc-jedi,
- 键入
php 以查找coc-phpls 等。
- (可选)查看
:h VimspectorInstall 以安装额外的调试器,例如:
-
:VimspectorInstall debugpy,
-
:VimspectorInstall vscode-php-debug等
全文:
Language server (LS) 是一个单独的独立应用程序(每种编程语言一个),它在后台运行并实时分析您的整个项目,为您的编辑器提供额外的功能(任何编辑器,不仅仅是vim) .你会得到类似的东西:
- 命名空间感知标记完成
- 跳转到定义
- 跳转到下一个/上一个错误
- 查找对象的所有引用
- 查找所有接口实现
- 在整个项目中重命名
- 悬停文档
- sn-ps、代码操作、格式化、linting 等等...
通过Language Server Protocol (LSP) 与语言服务器进行通信。 nvim 和 vim8(或更高版本)都通过插件支持 LSP,最流行的是 Conquer of Completion (COC)。
Lang Server 网站上提供了积极开发的语言服务器及其功能的列表。并非所有这些都是由 COC 扩展提供的。如果您想使用其中之一,您可以自己编写 COC 扩展或手动安装 LS,并使用以下 VIM 插件的组合来替代 COC:
与调试器的通信通过Debug Adapter Protocol (DAP) 进行。 VIM 最流行的 DAP 插件是Vimspector。
Language Server Protocol (LSP) 由 Microsoft 为 Visual Studio Code 创建,并作为具有许可 MIT 许可证的开源项目 发布(通过与 Red Hat 合作标准化和 Codenvy)。后来微软也发布了Debug Adapter Protocol(DAP)。 VIM 支持任何 VSCode 支持的语言。
我个人建议使用 COC + 由 COC 扩展提供的语言服务器 + ALE 进行额外的 linting(但禁用 LSP 支持以避免与 COC 冲突)+ Vimspector + Vimspector 提供的调试器(称为“gadgets”)+以下VIM插件:
call plug#begin()
Plug 'neoclide/coc.nvim'
Plug 'dense-analysis/ale'
Plug 'puremourning/vimspector'
Plug 'scrooloose/nerdtree'
Plug 'scrooloose/nerdcommenter'
Plug 'sheerun/vim-polyglot'
Plug 'yggdroot/indentline'
Plug 'tpope/vim-surround'
Plug 'kana/vim-textobj-user'
\| Plug 'glts/vim-textobj-comment'
Plug 'janko/vim-test'
Plug 'vim-scripts/vcscommand.vim'
Plug 'mhinz/vim-signify'
call plug#end()
你可以用谷歌搜索每个人的工作。
原生 VIM 跳转到定义:
如果您真的不想使用 Language Server 并且仍然希望使用原生 VIM 稍微体面地跳转到定义,您应该熟悉 :ij 和 :dj,它们代表 include-jump 和 definition-jump。这些 VIM 命令可让您跳转到项目包含的任何文件或跳转到任何包含文件中的任何已定义符号。然而,要使其工作,VIM 必须知道包含文件或定义符号的行在任何给定语言中的外观。您可以使用set include=$regex 和set define=$regex 中描述的:h include-search 中描述的~/.vim/ftplugin/$file_type.vim 中的每种语言设置它,但是,提出这些模式有点艺术,有时根本不可能,例如对于符号定义或文件导入可以跨越多行的语言(例如 Golang)。如果这是您的情况,通常的后备是 ctags,如其他答案中所述。