つーさにブログ

つうさにのメモ用ブログ

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

Emacslsp-modecompany-lsplsp-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-lsplsp-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言語開発公式が提供してるとはすごいですね。

以下の記事が参考になりました。


  1. Emacs用のLSPクライアントの実装はeglotもある。依存パッケージが少ないのところがいい。