👌

[VSCode] Goのフォーマットが変なときに確認するべき点

2024/02/10に公開

VSCode で Go を書く人は Go Team at Google 謹製の Go 拡張機能を使うと思うのだけれど、フォーマットまわりの設定で苦心したのでメモ。動作確認した際の拡張機能のバージョンは v0.40.3

要約

拡張機能側でいくつか設定が行われているので、適切に上書きする必要がある。

https://github.com/golang/vscode-go/blob/5b0d6db961e2b0a346d2984b0d10d8137cc5aba5/extension/package.json#L195-L203

以下、ケース別に説明。

設定を上書きできないとき

例えば以下のように editor.formatOnSave を無効にするだけでは、保存時のGoのフォーマットは無効にならない。これは拡張機能側の設定に優先順位で負けてしまうから(setting precedence)。

以下のように言語を明示すれば、拡張機能側の設定に勝てる。この画面を開く方法はいくつかあるが、例えばコマンドパレットで Preferences: Configure Language Specific Settings を実行するとよい(詳細は language specific editor settings)。

これはsettings.jsonに以下を記載するのと等価。

settings.json
{
    "[go]": {
        "editor.formatOnSave": false
    }
}

importが勝手に修正されるとき

以下のコードを保存すると、editor.formatOnSave適切に無効化していても "fmt""gonum.org/v1/gonum/stat" の間に空行が加えられる。

package main

import (
	"fmt"
	"gonum.org/v1/gonum/stat"
)

func main() {
	sd := stat.StdDev([]float64{8, 2, -9, 15, 4}, nil)
	fmt.Println(sd)
}

実はこれを無効化する設定は source.organizeImports。先述の通り拡張機能側の設定を上書きするため、言語を明示して以下のようにする。

settings.json
{
    "[go]": {
        "editor.codeActionsOnSave": {
            "source.organizeImports": "never"
        }
    }
}

以上。

普通はデフォルトの設定で問題ないだろうけれど、既存のコードをいじるときに変な差分が生じて困ったら確認してみるとよいかも。

Discussion