Emacs lsp-modeに新しいClientを追加する方法

Table of Contents

背景・動機

メジャーなEmacsのLSP Clientは3種類ある。

それぞれメリットデメリットがあるが、自分としてはlsp-modeを推していて今後も使い続けるつもりでいる。 lsp-mode最大のメリットはClientサポート数の多さにあり、メジャーなLSP Clientなら必ず収録されていると言っても過言ではない。

過去に次の2つのClientを追加するPRを出したことがあるので、後学の為にも追加方法を纏めておく。

試したこと・やったこと

0. Language Server選定

追加したいLSP Serverをみつける。 流石に個人が趣味で開発した中途半端なものは避けるべきだと思うが、そこは取り込む人が判断するのでとりあえず出してみるのがよいかもしれない。

CONTRIBUTINGを熟読して、Pull Requestにすでにあるかどうかを確認する。

https://github.com/emacs-lsp/lsp-mode/blob/master/CONTRIBUTING.md

1. Repoをforkして手元に落とす

emacs-lsp/lsp-mode からforkボタンを押して、自分の手元にGit Cloneする。

EmacsからPATHを通して (require 'lsp-mode) を実行する。

2. lsp-modeの設定をする

clients/lsp-python-ty.el のように clients/ に空気を読んでファイルを作成する。

Jsonnetの場合は以下。

最低限次の2つを定義すればよい。 完成度の高いLanguage Serverはオプションがあるので defcustom で都度定義する。

  • server-executable
  • lsp-register-client

https://github.com/emacs-lsp/lsp-mode/blob/master/clients/lsp-jsonnet.el

(require 'lsp-mode)

(defgroup lsp-jsonnet nil
  "LSP support for jsonnet."
  :group 'lsp-mode
  :link '(url-link "https://github.com/grafana/jsonnet-language-server"))

(defcustom lsp-clients-jsonnet-server-executable '("jsonnet-language-server")
  "The jsonnet language server executable to use."
  :group 'lsp-jsonnet
  :risky t
  :type '(repeat string))

(lsp-register-client
 (make-lsp-client
  :new-connection (lsp-stdio-connection (lambda () lsp-clients-jsonnet-server-executable))
  :activation-fn (lsp-activate-on "jsonnet")
  :priority -1
  :major-modes '(jsonnet-mode)
  :server-id 'jsonnet-lsp))

(lsp-consistency-check lsp-jsonnet)

(provide 'lsp-jsonnet)

3. 手元で動作確認する

ちょうどよいサイズのプロジェクトを手元に用意して実際に動かしてみる。 基本的なLSP機能が正常に動くか確認する。

  • 定義ジャンプ
  • 構文エラー表示
  • Rename
  • 補完

4. Pull Requestを出す

lsp-mode.elのlsp-client-packagesにclient追加をする必要がある。

またドキュメントやCHANGELOGに反映させる必要があるので、次のファイルを追加する。

あとはdescriptionを書いてPRを出し、レビュワーの指示にしたがって修正する。

得られた結果・所感

lsp-modeプロジェクトは非常に良くできているので追加が簡単。 レビュワーから速攻レビューが返ってきたので本当に助かった。

今後の展開・検討事項

新しいLanguage Serverを見つけたら積極的にPull Requestを出していきたい。