【问题标题】:VSCode Intelligence C extension does not suggest useful wordsVSCode Intelligence C 扩展不建议有用的词
【发布时间】:2021-10-12 11:08:47
【问题描述】:

我已经开始使用 VSCode 了。我正在用 C 编写代码,所以我安装了推荐的 C/C++ 插件,这些插件提供了 de Intellisense 完成功能。我还添加了 VIM 扩展和其他一些小东西。 我注意到 Intellisense 建议很好地推荐宏、函数名称、字段等……但它们从不建议将简单的词作为变量或参数,这些词确实在我正在编写的代码的密切上下文中。

本机 VSCode 自动完成功能可以做到这一点。 我已经尝试了几件事:

  1. 启用该功能: "editor.wordBasedSuggestionsMode": "currentDocument", 但是效果什么都没有,即使 Intellisense 结果无效,我也没有得到任何基于单词的建议。我认为当 tje Intellisense 找不到任何匹配项时,此功能将查询基于原生单词的建议。
  2. 禁用 Intellisense 建议:

CA根据 cmets 的设置,这应该使编辑器使用基于单词的 VSCOde 补全。但是使用此设置,我永远不会收到任何自动完成建议。

  1. 完全禁用 C/C++ 扩展。在这种情况下,我终于获得了一个基于单词的原生 VSCode 建议,但当然我也失去了其他插件的优势,如大纲、符号搜索、语法帮助等......

我想知道:

  1. 这是代码完成的预期 Intellisense 行为还是错误?
  2. 除了符号和宏之外,还有什么方法可以让 Intellisense 建议上下文词?
  3. 是否有任何方法可以仅禁用扩展的自动完成功能并使“本机”VSCOcode 代码完成工作?我希望通过“C_Cpp.autocomplete”获得这样的行为:“禁用”,但由于我没有看到这样的结果,我想知道这是否是扩展的错误。

用一些图片更新了评论:

事实上,现在我注意到这种行为有点令人困惑。在上面的示例中,我从头开始编写了 functionA,在这种情况下,我确实对局部变量和参数变量提出了建议。但是对于已经存在的项目函数(ApplyGainControl)请注意,我正在尝试使用 gain_word_current 参数并且我没有得到任何建议。当我尝试局部变量时也是如此。当我输入 gain 时,我确实得到了一些建议,但建议与关闭上下文不同。

所以现在我想知道当我打开现有文件夹项目或在 VSCode 中编写新内容时,建议是否有任何不同。我不知道构建建议数据库的潜在行为。

【问题讨论】:

  • 你试过Editor > Suggest: Locality Bonus吗?或者你根本没有得到任何建议(基本上是一个空列表)?
  • 我无法重现您的问题。只要我输入g,建议窗口就会弹出,列表中的第一个条目是:gain_word_current。我想,这是因为您没有 #include <stdint.h> 指令。如您的图像示例所示,stdint.h 中的符号表示错误。添加包含并重试。
  • 事实上,我忘了测试它,如果我删除包含指令,我将不再得到想要的建议。
  • 好的,当我添加包含指令时,至少参数中的红色错误行消失了,但仍然没有建议,可能是因为我在项目的文件系统中没有这样的文件。确实感谢您的评论,我注意到在我们不使用 stdint 数据类型的其他现有项目中自动完成其他功能时,我没有同样的问题。这是一个巨大的线索,谢谢。无论如何,我认为这是我猜的建议插件的弱行为
  • <stdint.h> 是标准标题,请参阅:C Standard Library header files,因此您应该将它放在附近的某个地方。也许,您的包含路径设置搞砸了?如果您使用 stdint.h 中的符号编译源文件,是否会收到警告?

标签: c visual-studio-code intellisense


【解决方案1】:

您有两个选项来控制建议:

正如我在 cmets 中提到的,我不知道您是否没有得到任何建议。但如果您对建议不满意,链接中描述的选项可能会有所帮助。

一些实验:

标记后的 cmets 显示建议窗口的第一个条目。

#include <stdint.h>

void foo(int i, int in, int *intp, int *int8p, int interrupt)
{
    i    //int i
    in   //int in
    int  //int (followed by the standard fixed sized integers)
    intp //int *intp
    int8 //int8_t, the second entry: int *int8p
    inte //int interrupt
}

注意editor.suggest.localityBonus被激活,editor.suggestSelection是默认的,好像是recentlyUsed。

【讨论】:

  • 我还激活了localityBonus,抱歉不提了,确实我尝试了很多选项的“组合”,我只是提到了与我最相关的选项。我没有注意到 localityBonus 有更好的行为
  • 您有任何示例,以便重现结果或您的期望吗?
  • 嗨@Erdal,我已经更新了一些捕获和cmets的初始帖子,请看一下,谢谢
猜你喜欢
  • 2020-09-27
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2022-10-24
  • 2017-08-31
  • 2022-01-09
相关资源
最近更新 更多