【问题标题】:Custom Extension for JSON Completion Does Not Work in Double QuotesJSON 完成的自定义扩展在双引号中不起作用
【发布时间】:2020-05-16 23:52:29
【问题描述】:

我正在开发一个 VSCode 扩展,它应该通过额外的代码完成来增强 JSON 编辑。因此我添加了四个虚拟建议(foofoo1foo2foo3)开始测试。在 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() { }

【问题讨论】:

    标签: typescript visual-studio-code vscode-extensions


    【解决方案1】:

    起始引用 " 是 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 中找到“单词”的定义。

    【讨论】:

    • 感谢您的快速建议!像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多