In my VS Code Extension I would like the opening and closing parentheses to be inserted automatically after a function is selected from the list provided by the completion item provider.
After the parentheses are added, I would like the extension to trigger the signature help provider (note that VS Code triggers the signature help provider when you manually type the opening parenthesis (
.
Here's a snippet of what I've added inside the provideCompletionItems
method:
myFunctions.forEach((func) => {
const completion = new CompletionItem(func, CompletionItemKind.Function);
completion.detail = func.signature;
completion.documentation = func.description;
completion.insertText = func '(';
...
});
I am aware that I can execute a command after inserting a completion by adding something like
completion.command = ...
The VS Code Extension API has vscode.executeSignatureHelpProvider
as a built-in command to execute the Signature Help Provider. Thus, I would run this command like this:
vscode.commands.executeCommand('vscode.executeSignatureHelpProvider', document.uri, position)
However, I don't know how to run this command as part of the command
variable, meaning that I can't do
completion.command = vscode.commands.executeCommand('vscode.executeSignatureHelpProvider', document.uri, position)
because the command
variable accepts only the type Command
.
So, how would I be able to run a command after the completion is inserted into the editor?
CodePudding user response:
assign an instance of the Command
object
completion.command = { command: 'vscode.executeSignatureHelpProvider', title: 'Signature' };
CodePudding user response:
You can also invoke a command, if you have more work to do there, via this in your 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;
And then that command is registered somewhere - it doesn't have to be in the 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)
...
}