首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于JSON完成的自定义扩展在双引号中不起作用

用于JSON完成的自定义扩展在双引号中不起作用
EN

Stack Overflow用户
提问于 2020-01-31 18:03:31
回答 1查看 298关注 0票数 2

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

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

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

当我在CompletionItemProvider中设置断点时,两种情况下的执行都会像预期的那样暂停。所以它的调用是正确的,并且它肯定会返回我的建议。我查看了现有的JSON编辑器扩展(甚至是VSCodes默认扩展),以获得如何正确实现它的建议,并查看默认的JSON扩展是否会覆盖双引号中的所有建议(尽管在我看来这会破坏整个可扩展性思想),但什么也找不到。

要重现它,只需搭建一个空的扩展就足够了,如here所述。

这是我的extension.ts:

代码语言:javascript
复制
// 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() { }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-31 19:11:07

起始引用"是VSCode认为的当前“单词”的一部分。因此,您返回的完成项与当前筛选器字符串"不匹配,因此不会显示。

可以通过在插入文本中包含完整的单词(带引号)来解决此问题:

代码语言:javascript
复制
new vscode.CompletionItem('"foo"', vscode.CompletionItemKind.Class)

(如果不希望在完成弹出窗口中显示引号,请保持label字符串不变,并使用insertText )

或者,您可以相应地调整range

代码语言:javascript
复制
var item = new vscode.CompletionItem('foo', vscode.CompletionItemKind.Class);
item.range = new vscode.Range(position, position);

注意:您可能会发现document.getWordRangeAtPosition()很有用。您可以在JSON here中找到“单词”的定义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60001714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档