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。
上記のWikiページによれば、
の3種類がある。go-langserverはREADMEに「エディタと使いたいのであればbingoを使ってみてください」2とある。また golsp は公式のようだがあまり情報が見当たらない。また、Emacsのlsp-modeのREADMEには対応Language Serverとしてbingoが挙げられている。そこでわたしもbingoを使ってみることにした。
環境構築
bingo のインストール#
ここをみてインストールした。たしか下記のような感じだったと思う。
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 をみればわかるようだ。このファイルを見れば設定を変えられそうだが、とりあえず今はデフォルトの挙動でいいかなと思っている。
-
当然Language Serverの実装はひとつになることが望ましい。少なくとも go-langserver の README.md にはそう書いてある 。 ↩︎
-
この記事執筆時点では次のように書かれている: 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. ↩︎