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

Time:02-23

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)

...

}
  • Related