我正在开发VSCode扩展,该扩展应通过附加代码完成功能来增强JSON编辑。所以我添加了四个虚拟的建议(foo
,foo1
,foo2
,foo3
)开始测试。在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() { }
引号"
是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一个“字”的定义在这里。
谢谢您的快速建议!像魅力一样工作。