如何使用 coc-clangd/coc-nvim 手动无键绑定在源代码中搜索符号?

问题描述

我使用 neovim 和 coc-clangd 进行 C/C++ 编程。一切正常,我可以通过将光标放在符号上并使用 gr 键绑定调用 jumpReferences 操作来跳过所有项目文件中符号的定义和搜索引用。>

我想知道在 coc-clangd 中是否可以通过简单地输入符号而不是使用 gr 键绑定来搜索符号?

实际上我可以通过下面的命令使用 cscope 来完成这项工作:

:cs find global <symbol-name>

但使用 coc-clangd 会好得多,因为索引过程更简单。所以我搜索并找到了 this link 并在那里找到了 jumpReferences coc action。我玩了很多这个动作。例如我已经运行波纹管命令:

:call CocAction('jumpReferences',<symbol-name>)

这不会导致任何错误,但会忽略 <symbol-name> 并仅提供对光标下符号的引用列表。

解决方法

经过更多搜索,我找到了答案。实际上,我已经在 coc.nvim repository 中看到了我的问题的答案,但要弄清楚我必须更仔细地阅读。

基于feature list of clangd,从clangd-10开始可以在整个项目范围内搜索符号。 (在了解这个事实后)我在 vim sample configuration for coc.nvim plugin 中发现了波纹管:

" Search workspace symbols.
nnoremap <silent><nowait> <space>s  :<C-u>CocList -I symbols<cr>

因此,我们可以通过点击 <space>s 并在打开的交互式缓冲区中输入符号名称来搜索项目中的符号。

注意:coc-clangd 找到的符号列表比cscope 少。我实际上认为这并不意味着 coc-clangd 不完整。实际上,coc-clangd 运行良好。例如,考虑 linux 内核中符号 io_delay 的情况。这个符号是一个函数,coc.nvim/coc-clangd 会在项目中找到它的所有引用,但在某些地方使用它,如下所示:

.io_delay = xen_io_delay,

并且 clangd 没有看到这些用法,但 cscope 找到了它们。在这种情况下,我知道 io_delay 不是一个函数,并且 clangd 没有看到它的事实并不是它的缺点,实际上我认为它运行良好。我认为(我不完全知道)cscope 索引有时像在 vim 中搜索一样工作,因为在这种情况下使用 io_delay 一词,cscope 看到了 io_delay 的这种用法。(​​这就是我的想法关于这种情况的原因,所以如果有人专家解释更多并为每个人澄清,我会很高兴。)