emacs 
 2018-11-20

大学時代から使っていたemacsの設定たちを綺麗にするという目的で、ついでにlsp-modeを導入してみようと思う。

lsp-mode
https://github.com/emacs-lsp/lsp-mode

language server protocolとは

language server protocol(lsp)とは、IDEやエディタとIDEが提供する機能(補間、定義jump、ドキュメントの表示など)の間で使用されるプロトコルを定義したものである。
これまで、IDEなどの提供する機能(補間、定義へのjump、ドキュメントの表示など)は言語ごと、IDEごとに提供されていた。
それを取りまとめるプロトコルが定義されることで、IDEごとの格差が緩和され、emacsでもIDEと同様の機能が実現でき流ようになるということです。
詳しくは、以下が参考になると思う。

https://microsoft.github.io/language-server-protocol/
https://github.com/Microsoft/language-server-protocol
https://qiita.com/atsushieno/items/ce31df9bd88e98eec5c4

lsp-mode

emacsでは、lsp-modeとeglotがlspをサポートしているみたい。今回はlsp-modeを導入する。
lsp-mode: https://github.com/emacs-lsp/lsp-mode
を見ながら設定していく。

melpaからインストール

M-x package-install [RET] lsp-mode [RET]

以下のように設定する。

(use-package lsp-mode
  :custom
  (lsp-print-io t)
  (lsp-prefer-flymake 'flymake)
  :commands lsp)

lsp-print-ioで全てのログを*lsp-log*に表示する。今回はflymakeを使うので、(lsp-prefer-flymake 'flymake) を設定しておく。

続いて、lsp-modeのバックエンドにcompanyを使うためにcompany-lspを、lsp-modeのUIをリッチにしてくれるlsp-uiを入れる。
それぞれmelpaからインストールします。

company-lsp

https://github.com/tigersoldier/company-lsp

companyのバックエンドに設定

(use-package 'company-lsp
  :after (lsp-mode company)
  :init (push 'company-lsp company-backends)
 )

lsp-ui

https://github.com/emacs-lsp/lsp-ui

(use-package lsp-ui
  :custom
  ;; lsp-ui-doc
  (lsp-ui-doc-enable nil)
  (lsp-ui-doc-header t)
  (lsp-ui-doc-include-signature t)
  (lsp-ui-doc-position 'at-point) ;; top, bottom, or at-point
  (lsp-ui-doc-max-width 150)
  (lsp-ui-doc-max-height 30)
  (lsp-ui-doc-use-childframe t)
  (lsp-ui-doc-use-webkit t)
  
  ;; lsp-ui-flycheck
  (lsp-ui-flycheck-enable nil)

  ;; lsp-ui-peek
  (lsp-ui-peek-enable t)
  (lsp-ui-peek-peek-height 20)
  (lsp-ui-peek-list-width 50)
  (lsp-ui-peek-fontify 'on-demand) ;; never, on-demand, or always
  
  ;; lsp-ui-imenu
  (lsp-ui-imenu-enable nil)
  (lsp-ui-imenu-kind-position 'top)
  
  ;; lsp-ui-sideline
  (lsp-ui-sideline-enable nil)
  
  :commands lsp-ui-mode
  :config
  (add-hook 'lsp-mode-hook 'lsp-ui-mode)
  (eval-after-load "flymake"
    (setq flymake-fringe-indicator-position nil)
    )
  )

主な機能は以下

  • lsp-ui-doc:
    リファレンス表示
    (lsp-ui-doc-use-childframe t)でchildframeを使ったドキュメント表示ができる。webkitでもできるみたいだけどうまくいかない
  • lsp-ui-peek:
    定義ジャンプ
  • lsp-ui-sideline
    現在行の情報を表示(肩情報はchildframeで表示され、表示情報が重複しているので非表示にした)

動いている様子は、各GitHubのページで確認

以上で、lsp-modeの設定は終了

各言語の設定

goのLanguage Serverはbingoを使うと良いそうです。

bingo
https://github.com/saibing/bingo

これもmelpaでインストールし、以下のように設定

(use-package go-mode
  :config
  (add-hook 'go-mode-hook #'lsp)
 )

まとめ

lsp-modeを使って、IDEで提供されている機能をemacsでも使えるように設定しました。これでgo langで補間、リファレンス参照、定義ジャンプなどできるようになりました。その他設定の見直しは今後記事に落としていくということで。

See Also