53

Is there a way to make a hotkey for running specific command in terminal? Say I want to compile my TypeScript files by hotkey and not to type to terminal "tsc" or any other variation of that command. (Edit: I know it is possible to recompile TS on save, but the question is still the same)

1
  • if you use a tool like webpack, your typescript file will be recompiled anytime you save Commented Oct 12, 2018 at 19:54

6 Answers 6

108

Typically you would set up a build or another task or an npm script and then trigger that with a hotkey.

There is another new way to do it with send text to the terminal.

For example, try this in your keybindings (Preferences: Open Keyboard Shortcuts (JSON)):

{
  "key": "ctrl+alt+u",
  "command": "workbench.action.terminal.sendSequence",
  "args": {
    "text": "node -v\u000D"
  }
}

for an npm script:

{
  "key": "ctrl+alt+u",
  "command": "workbench.action.terminal.sendSequence",
  "args": {
    "text": "npm run-script test\u000D"
  }
}

The first will run the node -v command (the \u000D is a return so it runs). I still recommend actually setting up a build task though, and then there are keychords for running your build task: Ctrl-shift-B. Or an npm script.

For example, if you had a more complex script to run, see how to bind a task to a keybinding or how to keybind an external command.


EDIT: As of v1.32 you can now do something like this:

{
  "key": "ctrl+shift+t",
  "command": "workbench.action.terminal.sendSequence",
  "args": { "text": "tsc '${file}'\u000D" }
}

You can now use the built-in variables, like ${file}, with the sendSequence command in a keybinding. I wrapped ${file} in single quotes in case your directory structure has a folder with a space in the name. And \u000D is a return.

Sign up to request clarification or add additional context in comments.

5 Comments

Only downside to this is the keyboard shortcut fails silently if no terminal is open yet.
is it possible to run sequence of commands via single shortcut? e.g. "open new terminal" && "run command"
@godblessstrawberry With a macro extension yes. See multi-command extension.
@godblessstrawberry it is possible to run multiple commands. see my answer below. i did not try your exact sequence but should be doable.
If you want to kill the currently running command, prefix the sequence with \u0003\n. This sends a Ctrl-C to the terminal.
28

You can accomplish this with VSCode tasks and then wire up your task to a keybinding. The downside to this approach is you have to have a tasks.json file in your workspace .vscode folder (it can't be global).

Here is an example where I wanted to open a file in a custom GitHub remote:

// tasks.json
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
      {
          "label": "Open in remote",
          "type": "shell",
          "command": "open https://github.custom.com/org/repo/blob/master/${relativeFile}#L${lineNumber}"
      }
  ]
}
// keybindings.json
{
  "key": "ctrl+o",
  "command": "workbench.action.tasks.runTask",
  "args": "Open in remote"
},

Here are some more VS Code variables you can use if you are curious: https://code.visualstudio.com/docs/editor/variables-reference

There is a long standing issue open here which should make this easier to do without tasks: https://github.com/microsoft/vscode/issues/871

1 Comment

see also assign task to prelaunchtask in launch configuration: stackoverflow.com/questions/43836861/…
5

I don't think vscode by default can do this, but you can try this extension. That work for me.

https://marketplace.visualstudio.com/items?itemName=mkloubert.vs-script-commands

Comments

4

As a variation on the accepted answer, note that it is also possible to set up hot-keys that run multiple commands via runCommands. Below is one that saves the current document, and moves the cursor, prior to invoking a script that operates on it. Open keybindings.json using "Open Keyboard Shortcuts (JSON)" and you could for example insert:

    {
        "key": "ctrl+shift+enter",
        "command": "runCommands",
        "args": {
            "commands": [
                "workbench.action.files.save",
                "cursorBottom",
                {
                    "command": "workbench.action.terminal.sendSequence",
                    "args": {
                        "text": "py -3 myscript.py ${file}\u000D"
                    }
                },
            ]
        },
        "when": "editorLangId == markdown"
    },

Comments

2

in addition to @mark ..

"args": { "text": "npm run-script test | tee /dev/null \u000D" }

this way it will run any script including bash scripts, that doesn't conflict to their arguments (e.g try rsync without the tee)

Comments

2

You can create one new terminal, then run any command by workbench.action.terminal.sendSequence and don't forget close this new temp terminal by sending exit\u000D.

below is the config to add into your keybindings (Preferences: Open Keyboard Shortcuts (JSON)):

{
        "key": "ctrl+alt+p",
        "command": "runCommands",
        "args": {
            "commands": [
                {
                    "command": "openInIntegratedTerminal",
                },
                {
                    "command": "workbench.action.terminal.sendSequence",
                    "args": {
                        "text": "npm run build\u000Dexit\u000D"
                    }
                }
            ]
        }
    }

1 Comment

superb :)))))))

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.