Home > Back-end >  How to pass arguments to a task in vscode that executes a snippet linked to a hotkey?
How to pass arguments to a task in vscode that executes a snippet linked to a hotkey?

Time:12-23

I have this working hotkey:

  {
        "key": "cmd t",
        "command": "editor.action.insertSnippet",
        "args": {
            "name": "TryCatch"
        }
    },

Which wraps the selected text into a tryCatch block, and adds the wanted logs and error reporting.

However, I want to link it with other sequence of either hotkeys or tasks.

I have this task in tasks.json, when when triggered in attempts to perform the above command, it prompts me for user input, because I can't figure out how to pass the name of the snippet as an argument, similar to what is done with hotKey binding configurations in example 1 above. This is the task:

       {
            "label": "insertSnippet",
            "command": "${command:editor.action.insertSnippet}",
            "args": [
                // "${name:TryCatch}",

            ],
        },

I've been trying to get tasks to execute without having to wait for user input or pressing enter for example, but dreadfully failed. I couldn't find a wait to intercept the execution of a task and pass data or select an item from a menu.

Any help on setting up a single hotKey which then triggers two or more commands?

Please note that I need to commands/tasks in the editor, not in terminal or shell. All the solutions I came across are for shell. Also inputs or text work in shell or in the editor, but not in the dropdown as in the following images, which are triggered by tasks.

enter image description here

enter image description here

Thanks.


Edit, what worked in the end. Thanks a lot @Mark

{
    "version": "2.0.0",
    "tasks": [
       
        {
            "label": "insertTryCatchSnippet",
            "command": [
                "workbench.action.tasks.runTask",
                "${input:tryCatchInput}"
            ]
        },

        {
            "label": "save",
            "command": "${command:workbench.action.files.save}",
        },

        {
            "label": "TryCatch",
            "dependsOrder": "sequence",
            "dependsOn": [
                "insertTryCatchSnippet",
                "save",
            ],
        },
    ],

    "inputs": [
        {
            "id": "tryCatchInput",
            "type": "command",
            "command": "editor.action.insertSnippet",
            "args": {
                "name": "TryCatch"
            }
        }
    ]
}

And this hotkey shortcut:

   {
        "key": "cmd t",
        "command": "workbench.action.tasks.runTask",
        "args": "TryCatch"
    },

Flawlessly without using macros or extensions. Thanks again.

CodePudding user response:

You can run vscode commands, like editor.action.insertSnippet. But if they take arguments than I believe you have to use the inputs of tasks.json to supply the args. In your tasks.json:

{
  "version": "2.0.0",

  "tasks": [

    {
      "label": "insertTryCatchSnippet",
      "command": [
        "${input:tryCatchInput}"
      ],
    }
  ],

  "inputs": [
    
    {
      "id": "tryCatchInput",
      "type": "command",
      "command": "editor.action.insertSnippet",
      "args": {
        "name": "tryCatch"
      }
    }

where your snippet name is defined in some snippets file.

You can then assign this task directly to a keybinding like this (in your keybindings.json):

  {
    "key": "alt w",
    "command": "workbench.action.tasks.runTask",
    "args": "insertTryCatchSnippet",
    "when": "editorFocus"
  }

If your desired command didn't need any args than you could do something like this in a task:

    {
      "label": "SplitTerminal",
      "command": "${command:workbench.action.terminal.split}",
      "type": "shell",
      "problemMatcher": []
    }

You can use multiple vscode commands in a task too (although some commands may need to wait for the previous command to finish and you should make 2 tasks that then run from a master task with the dependsOrder property sequence):

    {
      "label": "open new terminal and then saveAll",
      // "type": "shell",
      "command": [
        "${command:workbench.action.terminal.new}",
        "${command:workbench.action.files.saveAll}"
      ]
    }
  • Related