EmacsでGo言語する際のメモ
主にlsp関連
EmacsでGo言語する
シンタックスハイライト
まず、GNU EmacsにはデフォルトでGo言語のシンタックスハイライトがない(Go言語用のmajor-modeがない)。package.elなどを使って、dominikh/go-mode.elからgo-mode
パッケージをインストールする。
READMEを読めばわかるが、go-mode
パッケージはM-x gofmt
などの便利なコマンドも提供している。
コード補完
必須ではないが、欲しい機能である。LSPを使う。
GOPATH/bin
もしくは`go env GOPATH`/bin
をPATHに追加しておく。
端末で以下を行い、マシンにgopls
(language server) をインストールする。
go get golang.org/x/tools/gopls@latest
Emacsにlsp-mode
、company-lsp
、lsp-ui
パッケージをインストールし1、init.elに以下の設定を記述する。
;; go-modeのときlspする (add-hook 'go-mode-hook #'lsp-deferred) ;; yasnippetをインストールしていない or snippetを使わない (with-eval-after-load 'lsp-mode (setq lsp-enable-snippet nil))
company-lsp
とlsp-ui
はインストールさえしておけば、設定は不要(lsp-auto-configure
変数に依る)。company
の設定は適宜...(company-idle-delay
とかcompany-minimum-prefix-length
とか)
lsp-mode
は最初にGo言語ファイルを開くときにworkspaceを聞いてくるので、Importするほうを選ぶ。workspaceはM-x lsp-workspace-<hoge>
なコマンドで後から追加、削除できる。.emacs.d/に.lsp-session-v1というテキストファイルができる。
補完のあれこれ
最初は、LSPではなくgocode
での補完をやろうとしたが、うまくいかなかった。(gocode
インストールして、company-go
パッケージを設定しただけだとダメだった。)
gopls
& lsp-mode
ではほぼ設定を行うことなくできたので非常に楽。そして、せっかくだからとインストールしたlsp-ui
にびっくりする。他の言語もlspするか〜って気になる。
Go言語のLSPサーバ
Go言語のlanguage serverとして、調べると色々出てくるけど、現在はgopls一択な感じ。
- go-langserver: goのlanguage serverの老舗? 昔は内部でgocodeを使ってたらしい。
- bingo: 後発。golspと合流して、開発終了。
- gopls: Go言語の開発者公式が提供している。bingoと合流する前はgolspって名前だった。
普通にgoplsとgolspで混乱しました。でもGo言語開発公式が提供してるとはすごいですね。
以下の記事が参考になりました。