GolangのLanguageServerのbingoをEmacsのlsp-modeで動かす

lsp-mode

2019年からEmacsを使う と言い出して、結局そんなに使えていないが、設定はちまちまと進めている。この3連休はEmacsでGolangの開発環境を作っていた。

gocodeで補完をする、という記事がいくらでも出てくるがわたしはLSPで行うことにしたのでLanguage Serverを探すことにした。理由はBig Sky :: gocode やめます(そして Language Server へ) を読んだからである。

Language Serverの選定

そもそもGolangのLanguage Serverは現在3種類あるらしい1

F.A.Q · saibing/bingo Wiki

上記のWikiページによれば、

の3種類がある。go-langserverはREADMEに「エディタと使いたいのであればbingoを使ってみてください」2とある。また golsp は公式のようだがあまり情報が見当たらない。また、Emacsのlsp-modeのREADMEには対応Language Serverとしてbingoが挙げられている。そこでわたしもbingoを使ってみることにした。

環境構築

bingo のインストール#

Install · saibing/bingo Wiki

ここをみてインストールした。たしか下記のような感じだったと思う。

go get -u https://github.com/saibing/bingo
# なにがしかのエラーが出るが無視
cd $GOPATH/src/github.com/saibing/bingo
GO111MODULE=on go install

lsp-modeの設定#

go fmt を保存前に実施したい、以外のことはlsp-modeが起動した段階で実現できていた(コード補完、ドキュメントの出力など)。実際それがlsp-modeの強みではある。

ということで保存する前にlsp-format-bufferを実行するようにhookを書いた。

(use-package go-mode
  :commands go-mode
  :mode (("\\.go?\\'" . go-mode))
  :defer t
  :init
  (add-hook 'go-mode-hook #'lsp)
  :config
  ;; インデント関係の設定
  (setq indent-tabs-mode nil)
  (setq c-basic-offset 4)
  (setq tab-width 4)
  ;; 保存前に lsp-format-buffer
  (add-hook 'before-save-hook 'lsp-format-buffer))

lsp-modeのLanguage Serverの起動設定は https://github.com/emacs-lsp/lsp-mode/blob/master/lsp-clients.el をみればわかるようだ。このファイルを見れば設定を変えられそうだが、とりあえず今はデフォルトの挙動でいいかなと思っている。


  1. 当然Language Serverの実装はひとつになることが望ましい。少なくとも go-langserver の README.md にはそう書いてある↩︎

  2. この記事執筆時点では次のように書かれている: If you want to use a Go language server with your editor in the meantime, try https://github.com/saibing/bingo, which is a partial fork of this repository with fixes for Go modules and other editor bugs. ↩︎