温馨提示:本文翻译自stackoverflow.com,查看原文请点击:typescript - Custom Extension for JSON Completion Does Not Work in Double Quotes

typescript - JSON完成的自定义扩展不能用双引号引起来

发布于 2020-03-30 21:35:15

我正在开发VSCode扩展,该扩展应通过附加代码完成功能来增强JSON编辑。所以我添加了四个虚拟的建议(foofoo1foo2foo3)开始测试。在JSON密钥后键入冒号时,它可以按预期工作:

预期行为

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

在此处输入图片说明

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

在此处输入图片说明 在此处输入图片说明

CompletionItemProvider在这两种情况下,当我在我的执行中设置断点时,都会暂停。因此,它被正确调用,并且可以肯定地返回我的建议。我查看了现有的JSON编辑器扩展(甚至是VSCodes的默认扩展),以获取有关如何正确实现它的建议,并查看默认的JSON扩展是否可能覆盖双引号中的所有建议(即使在我看来这会破坏整个可扩展性想法)但找不到任何东西。

要进行复制,足以支撑此处所述的空扩展名

这是我的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() { }

查看更多

提问者
Corristo
被浏览
51
Gama11 2020-01-31 19:17

引号"是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一个“字”的定义在这里