如何将运行命令完成后插入到文本编辑器(VS Code Extension)中?

How to run command after the completion is inserted into the text editor (VS Code Extension)?

在我的 VS 代码扩展中,我希望在从完成项提供者提供的列表中选择一个函数后自动插入左括号和右括号。

添加括号后,我希望扩展程序能够触发签名帮助提供程序(请注意,当您手动输入左括号时,VS Code 会触发签名帮助提供程序(

这是我在 provideCompletionItems 方法中添加的内容的片段:

myFunctions.forEach((func) => {
    const completion = new CompletionItem(func, CompletionItemKind.Function);
    completion.detail = func.signature;
    completion.documentation = func.description;
    completion.insertText = func + '(';
    ...
});

我知道我可以在插入完成后通过添加类似

的内容来执行命令
completion.command = ...

VS 代码扩展 API 具有 vscode.executeSignatureHelpProvider 作为执行签名帮助提供程序的内置命令。因此,我会 运行 这个命令是这样的:

vscode.commands.executeCommand('vscode.executeSignatureHelpProvider', document.uri, position)

但是,我不知道如何 运行 这个命令作为 command 变量的一部分,这意味着我不能

completion.command = vscode.commands.executeCommand('vscode.executeSignatureHelpProvider', document.uri, position)

因为 command 变量只接受类型 Command.

那么,如何才能运行一个命令完成后插入到编辑器中呢?


解决方案:

根据下面的回答,我意识到我使用了错误的命令来触发参数提示小部件。相反,我使用了 editor.action.triggerParameterHints 命令:

completion.command = { command: 'editor.action.triggerParameterHints', title: '' };

分配 Command 对象的一个​​实例

completion.command = { command: 'vscode.executeSignatureHelpProvider', title: 'Signature' };

尝试使用 editor.action.triggerParameterHints 命令。如果您已经注册了自己的 SignatureHelpProvider,那么应该将其触发到 运行。如果您还没有注册自己的,那应该会触发默认提供程序。

completion.command = "editor.action.triggerParameterHints";


如果您有更多工作要做,您还可以调用命令,通过 CompletionItem:

newCommand.command = "<your extension name>.selectDigitInCompletion";
newCommand.title = "Select the digit 'n' in completionItem";
newCommand.arguments = [key, replaceRange, position];  // whatever args you want to pass to the command
completion.command = newCommand;

然后该命令在某处注册 - 它不必在 package.json:

vscode.commands.registerCommand('<your extension name>.selectDigitInCompletion', async (completionText, completionRange, position) => {

// ...

// access your passed-in args `completionText`,`completionRange` and `position` here
// await vscode.commands.executeCommand('vscode.executeSignatureHelpProvider', document.uri, position)

...

}