emahiro/b.log

Drastically Repeat Yourself !!!!

IntelliJ から VSCode に移行してみる

もともと JetBrains に魂を売っていた人間なのですが、最近4Kの外部ディスプレイに繋ぐとよく固まってしまってキーボード入力に遅延が発生して体験が圧倒的に不安定になってきているので、これを機に VSCode に乗りかえました。

普段は Go を書いているので、VSCode で Go を書く環境設定の手順をメモっておきます。 なお、今回 VSCode を使うかなーと思ったのは、VSCode と Go の Language Server の相性が少し前まであまり良くなく定義ジャンプなどがもっさりしていたので、ちょっと使いづらいなと思っていたのですが、最近改善されたのを聞いて、それなら使えるかなーと思ったのも1つあります。

また僕自身は完全に JetBrains にキーバインドに慣れて凝り固まってしまっていたので、キーバインドも全て JetBrains のそれを踏襲しました。

Install VSCode

これは書くまでもないと思いますので、割愛します。

https://code.visualstudio.com からDLします。

IntelliJキーバインドを設定する

https://marketplace.visualstudio.com/items?itemName=k--kato.intellij-idea-keybindings がありましたので、このプラグインをインストールして終了です。

正直これが一番悩みました。VSCodeキーバインドに慣れようとも思ったんですが、今更なかなか手に馴染んだ癖を矯正するのはしんどく、これがなかったら移行は無理だったかもしれません。

Language Server を設定する

setting.json に以下を追加するだけです。

"go.useLanguageServer": true,

Language Server の細かい設定がしたい場合は go.languageServerExperimentalFeatures に細かい設定を記載することができます。

"go.languageServerExperimentalFeatures": {
        "format": true,
        "autoComplete": true,
        "rename": true,
        // 略
}

Language Server については公式の README にも記載されてます。

ref: https://github.com/microsoft/vscode-go#go-language-server

generate json tag を設定する

type User struct {
    ID   int64  `json:"id"`
    Name string `json:"name"`
}

Go の struct に json タグを指定することで json で出力するときの key 名を指定できますが、IntelliJ だとstruct の field と同じ行で json.... って打ち込むだけで自動で生成されてくれて(スネークケースでしたけど)、非常に重宝していました。

これと同等の機能をなんとか実現できないものかと調べたところ、公式のドキュメントの https://github.com/Microsoft/vscode-go/wiki/Go-tools-that-the-Go-extension-depends-ongomodifytags for modifying tags on structs という項目があってどうやらデフォでできそう、ということまではわかりました。

実際にどうやって使うのかについては https://github.com/fatih/gomodifytags の本家を見に行きます。

(ここで知ったんですが、この gomodifytags という昨日は各種エディタに提供してるタグの自動生成ツールなんですね....)

本家の README には vscode-go with commands Go: Add Tags and Go: Remove Tags とあるので、struct を記載たら Cmd + Shift + P でコマンドパレットを開いて、Go: Add Tags を探して実行するだけです。普通に Add Tags... と打ち込めば出てくるはず。 タグを削除したいときも同等に コマンドパレットで Remove Tags を探して実行するだけで問題ありません。

ただ1つ問題があって、この gomodifytags を使ってタグを生成するとき、 omitempty がデフォルトだとついてきてしまうので gomodifytags の挙動を設定で制御します。

具体的には以下のような感じです。

"go.addTags": {
    "tags": "json",
    "options": "json=", // json の何もつけない e.g omitemptyをつけたいときは json=omitempty となる。
    "promptForTags": false,
    "transform": "camelcase" // キャメルケースで key 名を記載する e.g. userHoge
},

ref: https://github.com/Microsoft/vscode-go/issues/433#issuecomment-287566310

gomodifytags を使い始めて Intellij より便利だなと感じたのは tag の書式はスネークケースしか指定できなかったのですが、 gomodifytags を使う場合には transform で書式を決めることです。

https://github.com/fatih/gomodifytagsREADME にも書式の記載方法が記載されてます。

その他

言語ごとの細かい設定をする

各言語ごとにタブのサイズとか細かく決めたいケースなどは setting.json

"[$langName]": { // $langName に特定の言語を指定する e.g. ruby, typescript など

}

// e.g.
"[typescript]": {
    "editor.tabSize": 2,
}

こんな感じです。

追記

また色々調べてみて追記できそうなことがあったら随時付け足していきます。

Language Server の挙動の不安定さについて(20190924)

gopls を最新にしたら治るかと思ったんですが、どうやら gopls をアップデートした local の go のversionと setting.json に記載している go の version が一致していないと挙動が不安定(Goのファイルを開いたときに毎回再起動してる?)という状態になりました。

自分の環境で調べただけなので、僕の環境に限った話かもしれませんが。