基于 task 为 VSCode 添加自定义的外部命令

我们有很多全局的工具能在各处使用命令行调用,针对某个仓库特定的命令可以放到仓库中。不过,如果能够直接为顺手的文本编辑器添加自定义的外部命令,那么执行命令只需要简单的快捷键即可,不需要再手工敲了。


写一个外部命令的调用

由于是调用外部工具,所以工具本身用什么语言写已经不重要的了,只要有环境,没有什么是不能执行的。

这里以我博客中使用的外部命令 mdmeta 为例。我将此工具使用 mklink 命令链接到了 /build 文件夹中(当然,如果需要多人协作开发,可以使用 git-lfs 或者 git-submodule 来管理仅项目的外部命令)。关于 mklink 的使用,可以参考 解决 mklink 使用中的各种坑(硬链接,软链接/符号链接,目录链接)

于是,在 /build 文件夹中添加可执行的脚本,例如:

dotnet build\mdmeta\mdmeta.dll wupdate --ignore-in-hour 6

让 VSCode 使用此外部命令

如果你说使用 VSCode 嵌入的终端来使用外部命令,那我们其实没做什么,就像使用普通的脚本或者命令一样。

但是,VSCode 自带有 Tasks 机制,可以将命令与 VSCode 集成。关于 Tasks,可以阅读 VSCode 的官方文档:Tasks in Visual Studio Code

具体来说,是写一个配置文件 /.vscode/tasks.json。

tasks.json 中有少量的默认内容,如果你完全不知道如可开始编写,可以按 F1,选择 Configure ... 随便配置一个 Task,然后基于它修改。

F1

这里,我定义了两个命令:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Init Metadata",
            "type": "shell",
            "command": "${workspaceRoot}\\build\\mdinit.ps1",
            "problemMatcher": []
        },
        {
            "label": "Update Metadata",
            "type": "shell",
            "command": "${workspaceRoot}\\build\\mdupdate.ps1",
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

当然,这是按照我自己的需求写了两个命令,前者用来初始化我的博客仓库,后者用来更新我所有博客文章的 YAML 元数据。

由于后者才是需要频繁使用的命令,所以我将其设为编译类型的命令("kind": "build")。具体来说,设定为编译类型并指定为默认("isDefault": true)将获得 Ctrl+Shift+B 快捷键的原生支持。

使用快捷键执行外部命令

当然,如果你有其他的编译命令,或者你有很多个命令,可以自己指定快捷键。比如我希望按下 Ctrl+U 时更新我的元数据(即执行以上第二条命令),直接在命令上加上 "key": "ctrl+u" 即可。

{
    "label": "Update Metadata",
    "type": "shell",
    "key": "ctrl+u",
    "command": "${workspaceRoot}\\build\\mdupdate.ps1",
    "problemMatcher": [],
    "group": {
        "kind": "build",
        "isDefault": true
    }
}

参考资料

本文会经常更新,请阅读原文: https://walterlv.com/post/add-run-external-executable-tools-for-vscode.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)