【问题标题】:How to run `go fmt` on save, in Visual Studio Code?如何在 Visual Studio Code 中保存时运行“go fmt”?
【发布时间】:2015-11-20 13:55:45
【问题描述】:

如何让 Visual Studio Code(或 Go 编程语言扩展)在保存时运行 go fmt(或其他工具/命令)?甚至自动保存?

更新: 它现在在 VSCode 中完美运行,此时;只需在 .vscode 目录中添加一些配置文件(我使用these)。

2019 年更新: 这个问题很老了。现在,VSCode Go 扩展拥有您在 Go 中开发所需的一切。

2019 年最后更新 顺便说一句,值得一提的是,在您的测试文件中的包声明的正上方出现了一个运行包测试。如果单击它,您可以看到您的代码的代码覆盖率。被覆盖和未被覆盖的部分以不同的颜色突出显示。

2020 年更新 现在,VSCode 的 Go 扩展,在 Go Team 的监督下! ????

【问题讨论】:

    标签: go visual-studio-code


    【解决方案1】:

    现在,该功能已经实现,您可以在保存时启用格式:

    1. 打开设置 (Ctrl + ,)
    2. 搜索editor.formatOnSave并将其设置为true

    您的 Go 代码将在 Ctrl + s 上自动格式化

    【讨论】:

    • 如果你新安装 Go 扩展,我认为这甚至应该是默认设置。
    • 有没有办法改变格式选项?我已经启用了带空格的缩进选项,但是在文件保存后 go fmt 将其转换回制表符。
    • 请记住,如果您已经在 VS 中设置了不同的格式化程序(如 Prettier),此解决方案将需要最后一步:您需要将设置中的“默认格式化程序”更改为“Go”。
    • 对我来说这个解决方案有效,但即使启用了自动保存,我也必须执行 ctrl+s。
    • 我知道这是一个老问题,但供将来参考@rd22 这个不可配置的事实实际上解决了“制表符与空格”的问题:就像我一样使用空格进行编程,但是当你保存 gofmt 会将其转换为其他人使用的规范化格式。再也不用担心这个了。我只是建议配置标签的大小以匹配用于缩进的空格数。
    【解决方案2】:

    目前不可能,但正在处理https://github.com/Microsoft/vscode-go/issues/14

    【讨论】:

    • 这不再是最新的了。
    • 这个答案错过了大量的赞成票......如果它被更新以反映现实;)
    【解决方案3】:

    我不特别熟悉“go fmt”,但您可以创建一个简单的 vscode 扩展来处理保存事件并执行任何将文件路径作为参数传递的任意命令。

    这是一个只调用echo $filepath的示例:

    import * as vscode from 'vscode';
    import {exec} from 'child_process';
    
    export function activate(context: vscode.ExtensionContext) {
    
        vscode.window.showInformationMessage('Run command on save enabled.');
    
        var cmd = vscode.commands.registerCommand('extension.executeOnSave', () => {
    
            var onSave = vscode.workspace.onDidSaveTextDocument((e: vscode.TextDocument) => {
    
                // execute some child process on save
                var child = exec('echo ' + e.fileName);
                child.stdout.on('data', (data) => {
                    vscode.window.showInformationMessage(data);
                });
            });
            context.subscriptions.push(onSave);
        });
    
        context.subscriptions.push(cmd);
    }
    

    以及打包文件:

    {
        "name": "Custom onSave",
        "description": "Execute commands on save.",
        "version": "0.0.1",
        "publisher": "Emeraldwalk",
        "engines": {
            "vscode": "^0.10.1"
        },
        "categories": [
            "Other"
        ],
        "activationEvents": [
            "onCommand:extension.executeOnSave"
        ],
        "main": "./out/src/extension",
        "contributes": {
            "commands": [{
                "command": "extension.executeOnSave",
                "title": "Execute on Save"
            }]
        },
        "scripts": {
            "vscode:prepublish": "node ./node_modules/vscode/bin/compile",
            "compile": "node ./node_modules/vscode/bin/compile -watch -p ./"
        },
        "devDependencies": {
            "typescript": "^1.6.2",
            "vscode": "0.10.x"
        }
    }
    

    扩展是通过 cmd+shift+p 然后键入“保存时执行”启用的,但它可以重新配置为通过包括“*”在内的另一个命令启动,这将导致它在 VSCode 加载时加载。

    启用扩展后,只要保存文件,事件处理程序就会触发(注意:这在第一次创建文件或另存为时似乎不起作用...)

    这只是对 yo 代码脚手架扩展的小修改,如下所述:https://code.visualstudio.com/docs/extensions/example-hello-world

    更新

    这是我为运行文件保存命令而编写的 Visual Studio Code 扩展。 https://marketplace.visualstudio.com/items/emeraldwalk.RunOnSave.

    【讨论】:

    • gofmt 通过stdin 获取一个字符串(在编辑器中打开的当前文件的内容),并通过stdout 向我们提供格式化的Go 代码或通过stderr 提供一些错误(如果有) .所以基本上(我最希望的)我想将更改的内容提供给gofmt 并获取输出,如果没有错误,将其保存到文件中。我将围绕这个进行游戏,看看我能在有意义的时间范围内做什么(否则我现在将回退到 LiteIDE)。谢谢;
    【解决方案4】:

    我使用 CTRL+S 手动保存文件(这对我来说是习惯性的)。但是,我在 VS Code 中有一个不同的绑定,它以 CTRL+S 开头(例如,swagger 扩展有一个和弦,按 CTRL+S CTRL+W 会生成 swagger 注释)。这导致 VS Code 等待我按下第二个和弦 (CTRL+W),因此它完全忽略了保存部分。我将所有以 CTRL+S 作为第一个和弦的键绑定和弦重新配置为不同的组合。在此之后,按 CTRL+S 正确地用 gofmt 格式化了我的文件。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 2019-11-24
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多