保存文件时从 vscode 扩展自动运行命令

问题描述 投票:0回答:5

我可以在 VS Code 中保存文件时自动执行 2 个单独的命令吗?

我希望这两个命令执行以下操作:

    1. 设置焦点文档的格式
2. 对文件导入进行排序

visual-studio-code configuration vscode-extensions
5个回答
23
投票

默认不支持在保存 (onSave) 时运行任务或命令。但是,通过 VSCode 扩展“保存时运行”有第 3 方支持。

这是链接:https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave

这是一个非常流行的扩展,我不久前使用过它,它非常适合我的用例。

此外,如果您只想在保存时检查代码或格式化代码,可以通过 VSCode 设置来完成。

编辑 UTC 时间 2021 年 6 月 20 日 @ 晚上 9:04

如果要将命令添加到设置中,则必须配置扩展,扩展 README.md 中对此进行了说明,可以通过单击 VSCode 扩展资源管理器中的扩展图标进行查看。

配置

将“emeraldwalk.runonsave”配置添加到用户或工作区设置。

  • “shell”-(可选)与运行命令的 child_process.exec 选项一起使用的 shell 路径。
  • “autoClearConsole” - (可选)每次命令运行时清除 VSCode 输出控制台。默认为 false。
  • “commands” - 保存文件时将运行的命令数组。
    • “match” - 用于匹配要运行命令的文件的正则表达式

    注意由于这是一个正则表达式,并且在 JSON 字符串中,反斜杠必须进行双重转义,例如在定位文件夹时。例如"match": "某个\\文件夹\\.*"

    • “cmd”-要运行的命令。可以包含将在运行时替换的参数(请参阅下面的占位符令牌部分)。
    • “isAsync”(可选)- 默认为 false。如果为 true,则下一个命令将在本命令完成之前运行。

示例配置

此示例配置将运行 echo 语句,包括保存的文件路径。 在此示例中,第一个命令是异步的,因此即使第一个命令尚未完成,第二个命令也会立即执行。 由于第二个命令不是异步的,因此在第二个命令完成之前,第三个命令不会执行。

"emeraldwalk.runonsave": {
    "commands": [
        {
            "match": ".*",
            "isAsync": true,
            "cmd": "echo 'I run for all files.'"
        },
        {
            "match": "\\.txt$",
            "cmd": "echo 'I am a .txt file ${file}.'"
        },
        {
            "match": "\\.js$",
            "cmd": "echo 'I am a .js file ${file}.'"
        },
        {
            "match": ".*",
            "cmd": "echo 'I am ${env.USERNAME}.'"
        }
    ]
}


配置保存时执行的命令并不像按 [F1] 打开快速输入并找到要运行的扩展任务那么简单。您必须按照说明进行操作,当您遇到困难时,您可能必须返回并询问有关您遇到的问题的问题,或者通过谷歌进行搜索;如果您是 Linux 用户,或者您有丰富的 MS-Dos 或 Powershell 经验,这将非常简单。


5
投票

正如我在评论中指出的,有许多“保存时运行”扩展。这是一个将运行外部命令的命令,例如来自扩展的命令。而且它似乎比某些更新且维护得更好。

运行它

设置示例:

"runItOn": {
    "commands": [
        {
            "match": ".*",
            "isShellCommand" : false,
            "cmd": "myExtension.amazingCommand"
        },
        {
            "match": "\\.txt$",
            "cmd": "echo 'Executed in the terminal: I am a .txt file ${file}.'"
        }
    ],
    "watchers": [
        {
            "match": "**/*.js",
            "cmd": "echo 'Changes detected on js files.'"
        }
    ]
}

myExtension.amazingCommand
就是您正在寻找的。


5
投票

如果您只想格式化代码,请检查激活的本机编辑器设置,而不是安装 RunOnSave


1
投票

请注意所提供的答案:

如果您使用 Python,VSCode 中的

Run on Save
扩展(以及任何与此相关的
tasks.json
看不到(自动识别)工作区中的任何活动虚拟环境。

在激活环境之前,所有命令都像从当前工作目录中的 shell 运行一样。 (如果你仔细想想,认为是有道理的,因为它不知道你要运行什么语言/程序)

要在虚拟环境的上下文中运行 python 命令进行保存,请首先手动激活它:

"cmd": ".venv\\Scripts\\activate.bat && py -m your_script.py"
否则,使用全局python安装。

如果您使用来自第 3 方包的命令(例如

pyupgrade

)并且您的全局 python 中没有安装该命令,则不会运行任何内容。 
更糟糕的是,如果您安装了多个 python 并且都安装了该软件包,则运行的软件包是来自全局 python 的软件包,这可能不是您想要的。


1
投票
为了以上回答

https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave

如何使上述扩展工作:

为了查看控制台输出,您必须位于“输出”选项卡中,并在下拉列表中选择“保存时运行”选项。该扩展是在集成终端存在之前创建的,并且已经有一段时间没有看到重大更新了。

© www.soinside.com 2019 - 2024. All rights reserved.