我的代码如下:
/**
* 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
目的是运行音译并在建议中显示它。目标是选择建议中的音译来替换该单词。
我可以在调试时在控制台中获得正确的输出,但在激活扩展时无法在建议工具提示中获得正确的输出。
我克隆了你的存储库并解决了它。
简短回答:将其添加到您的代码中:
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,
.......
这是一个演示: