在VS Code中运行终端命令的快捷方式

47

有没有一种方法可以为运行特定命令在终端中设置快捷键?比如说,我想通过快捷键编译我的TypeScript文件,而不是在终端中输入“tsc”或任何其他变体的命令。(编辑:我知道可以在保存时重新编译TS,但问题仍然是一样的。)


如果你使用类似webpack的工具,每次保存时你的TypeScript文件都会重新编译。 - Thomas
6个回答

89

通常情况下,您可以设置一个构建任务或其他任务或 npm 脚本,然后使用热键触发它。

还有一种新的方法可以通过将文本发送到终端实现。

例如,在您的键绑定中尝试这个(Preferences: Open Keyboard Shortcuts (JSON)):


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

对于一个npm脚本:

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

第一步将运行 node -v 命令(\u000D 是回车符,因此它会运行)。我仍然建议实际设置一个构建任务,然后有关键代码可用于运行您的构建任务:Ctrl-shift-B 或者 npm 脚本。

例如,如果您要运行更复杂的脚本,请参见如何将任务绑定到按键绑定如何对外部命令进行按键绑定


编辑:从 v1.32 开始,您现在可以这样做:

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

现在您可以在按键绑定中使用内置变量,例如 ${file},使用 sendSequence 命令。为了防止您的目录结构中有名称带有空格的文件夹,我将 ${file} 用单引号括起来。而\u000D是回车符。


7
唯一的缺点是,如果没有打开终端,这个键盘快捷键会默默地失败。 - Leeroy
可以通过单个快捷方式运行一系列命令吗?例如,“打开新终端” && “运行命令”。 - godblessstrawberry
1
@godblessstrawberry 可以通过宏扩展实现。请参见多命令扩展。 - Mark
1
@godblessstrawberry 可以运行多个命令。请看下面的答案。我没有尝试你的确切顺序,但应该可行。 - Ross Bencina

25

您可以利用VSCode tasks来完成此操作,然后将任务与按键绑定。这种方法的缺点是您必须在工作区的.vscode文件夹中拥有一个tasks.json文件(它不能是全局的)。

这里是一个示例,其中我想要打开自定义GitHub远程中的文件:

// 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"
},

如果您感兴趣,这里有一些更多的VS Code变量可供使用:https://code.visualstudio.com/docs/editor/variables-reference

这里有一个长期存在的问题,应该可以在没有任务的情况下更容易地完成:https://github.com/microsoft/vscode/issues/871


请参见在启动配置中将任务分配给prelaunchtask:https://dev59.com/questions/b1cP5IYBdhLWcg3wyc7W - Hawkeye Parker

5

2

除了@mark之外,还有一种方法可以运行任何脚本,包括bash脚本,不会与其参数冲突

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

这样做将运行任何脚本,包括bash脚本,只要不与它们的参数冲突(例如尝试不使用tee的rsync)。


2
作为对所接受答案的一种变化,需要注意可以设置运行多个命令的热键。以下是一个在调用操作脚本之前保存当前文档并移动光标的示例。打开“打开键盘快捷方式(JSON)”来编辑keybindings.json,然后你可以插入例如以下内容:
    {
        "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"
    },


0
你可以创建一个新的终端,然后通过workbench.action.terminal.sendSequence运行任何命令,别忘了通过发送exit\u000D关闭这个临时终端。
以下是要添加到键绑定中的配置(首选项:打开键盘快捷方式(JSON)):
{
        "key": "ctrl+alt+p",
        "command": "runCommands",
        "args": {
            "commands": [
                {
                    "command": "openInIntegratedTerminal",
                },
                {
                    "command": "workbench.action.terminal.sendSequence",
                    "args": {
                        "text": "npm run build\u000Dexit\u000D"
                    }
                }
            ]
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接