在 VS Code 中没有获得新创建的扩展的建议

问题描述 投票:0回答:1

我的代码如下:

/**
 *  Input auto-completion provider
 */
class InputAutoCompletionProvider {
  // eslint-disable-next-line class-methods-use-this
  provideCompletionItems(document, position) {
    const lineAt = document.lineAt(position);
    const lineText = document.getText(lineAt.range);

    const searchText = getSearchText(lineText, position);

    const items = [];
    // console.log('lineAt', lineAt);
    // console.log('lineText', lineText);
    // Add the actual typed text to suggestions list
    const item = new vscode.CompletionItem(kh2dev(searchText));
    item.sortText = String(0);
    console.log(item);
    items.push(item);

    return items;
  }
}

module.exports = InputAutoCompletionProvider;

其余的托管在github

目的是运行音译并在建议中显示它。目标是选择建议中的音译来替换该单词。

我可以在调试时在控制台中获得正确的输出,但在激活扩展时无法在建议工具提示中获得正确的输出。

javascript visual-studio-code vscode-extensions
1个回答
0
投票

我克隆了你的存储库并解决了它。

简短回答:将其添加到您的代码中:

    item.filterText = searchText;
    item.preselect = true;  // this sometimes helps

更长的答案:

我记得有时你必须添加

CompletionItemRange.range
,即使你认为默认值可以工作。所以我尝试了

item.range  = new vscode.Range(position, position);

事实上,现在您想要的完成情况确实出现了。但它们被放在建议的最后,因此人们通常必须滚动才能看到它们。更糟糕的是,选择它们只会将它们放在光标位置 - 它不会替换触发完成的字母。这可能不是你想要的。

我发现了这个 GitHub 问题:CompletionItems 和范围不起作用。以下是完整的相关部分:

调用完成项提供程序,返回完成项,但它们 别出现! 😕 有什么问题吗?过滤!过滤比较 带前缀的补全并隐藏那些不匹配的。

示例
  • 在此处触发补全:

    say.he|
    |
    是光标)

  • 提供商退货

    abc
    help
    hood

  • 编辑器采用

    he
    前缀,并针对
    abc
    help
    hood
    进行评分。

  • 评分产生以下结果:

    abc
    - 不匹配,不显示
    help
    - 很好的比赛,表演
    hood
    - 没有匹配,仅出现
    h
    ,不显示

  • 编辑器显示帮助建议,不显示

    abc
    hood
    建议

扩展规则!

上面的示例使用“defaults”来确定前缀和 过滤标准。

  • prefix
    :每个补全都可以通过
    vscode.CompletionItem#range
    定义自己的前缀。以上面的例子来说,有效 前缀可以是
    say.he
    .he
    或 `` (空字符串)。任意范围 只要包含光标位置并且是单行就有效 只是。

  • filter
    :每个补全都可以定义过滤时使用什么字符串。默认是标签,但是通过
    vscode.CompletionItem#filterText
    可以定义任何字符串

什么时候用什么?这取决于语言、单词定义以及 您是否控制/理解这个词的定义。默认值 通常工作得很好,但某些语言可能会使用非直观的 单词定义,或补全跨越多个单词,或补全 包括非单词字符等。在所有这些情况下

range
-应该使用属性。

我检查了您完成的建议分数。选择您的建议之一,然后按Ctr+/。它的得分为-100,毫不奇怪为什么它被放在所有建议的末尾。但它根本没有

prefix
值,这解释了为什么接受完成并没有替换触发它的当前字母。

阅读上述 GH 引用意味着使用

item.filter
或设置
prefix
。但没有
prefix
属性 - 您可以通过设置
prefix
来设置
range
。我已经尝试过设置
range
,虽然它确实显示完成,但它实际上并没有替换触发字母。

所以我尝试了

item.filterText = searchText;

现在将

prefix
设置为触发字符,例如
a
,并且分数要高得多,因为
prefix
与同时也是触发字符的
leading word
进行匹配。

重要

使用

*
作为
DocumentSelector
中的
registerCompletionItemProvider()
对我来说不起作用。如果您想定位所有文件,这似乎可行:

        const provider = new InputAutoCompletionProvider();
        disposableProvider = vscode.languages.registerCompletionItemProvider(
          // '*',    // doesn't work
          { pattern: '**/' },   // does target different filetypes
          provider,
           .......

这是一个演示:

© www.soinside.com 2019 - 2024. All rights reserved.