我正在开发一个VSCode扩展,它将通过额外的代码完成功能来增强JSON编辑。因此,我添加了四个虚拟建议(foo,foo1,foo2,foo3)来开始测试。当在JSON键后键入冒号时,它的工作方式与预期相同:

此外,当我在一个空对象中触发完成时,它会按照我想要的方式工作(包括来自其他扩展的建议):

但是,当我触发双引号内的补全时(无论它们是否包含文本),我的建议都会丢失:


当我在CompletionItemProvider中设置断点时,两种情况下的执行都会像预期的那样暂停。所以它的调用是正确的,并且它肯定会返回我的建议。我查看了现有的JSON编辑器扩展(甚至是VSCodes默认扩展),以获得如何正确实现它的建议,并查看默认的JSON扩展是否会覆盖双引号中的所有建议(尽管在我看来这会破坏整个可扩展性思想),但什么也找不到。
要重现它,只需搭建一个空的扩展就足够了,如here所述。
这是我的extension.ts:
// The module 'vscode' contains the VS Code extensibility API
// Import the module and reference it with the alias vscode in your code below
import * as vscode from 'vscode';
class OpenApiCompletionItemProvider implements vscode.CompletionItemProvider {
public provideCompletionItems(
document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken):
Thenable<vscode.CompletionItem[]> {
return Promise.resolve([
new vscode.CompletionItem('foo', vscode.CompletionItemKind.Class),
new vscode.CompletionItem('foo1', vscode.CompletionItemKind.Property),
new vscode.CompletionItem('foo2', vscode.CompletionItemKind.Interface),
new vscode.CompletionItem('foo3', vscode.CompletionItemKind.Class),
]);
}
}
export function activate(ctx: vscode.ExtensionContext): void {
ctx.subscriptions.push(
vscode.languages.registerCompletionItemProvider(
{ pattern: '**/*.openapi.json' },
new OpenApiCompletionItemProvider(),
':',
'"'
)
);
}
// this method is called when your extension is deactivated
export function deactivate() { }发布于 2020-01-31 19:11:07
起始引用"是VSCode认为的当前“单词”的一部分。因此,您返回的完成项与当前筛选器字符串"不匹配,因此不会显示。
可以通过在插入文本中包含完整的单词(带引号)来解决此问题:
new vscode.CompletionItem('"foo"', vscode.CompletionItemKind.Class)

(如果不希望在完成弹出窗口中显示引号,请保持label字符串不变,并使用insertText )
或者,您可以相应地调整range:
var item = new vscode.CompletionItem('foo', vscode.CompletionItemKind.Class);
item.range = new vscode.Range(position, position);注意:您可能会发现document.getWordRangeAtPosition()很有用。您可以在JSON here中找到“单词”的定义。
https://stackoverflow.com/questions/60001714
复制相似问题