emacsにlsp-mode入れた

かわEmacs化をするに当たって色々設定をした中でlspが非常に良かったので書き起こしておく。

かわEmacs化が進んでおり、インスタ映えするような設定ができてるので非常に満足。これならスタバで堂々とterminalを開ける。

スクリーンショット: emacs-lsp-mode.png


lspとは、language server protocol のことだ。

Microsoftが提唱したもので、中身はここにある。 Microsoft/language-server-protocol

language serverとは、IDEが必要とするプログラムのプロジェクト ソースを解析して情報を提供する機能を、サービスとして実現するものです。language serverがサポートされたIDEでは、型やメンバーの自動補完、変数やメンバーの定義参照、変数やメンバーの利用箇所の検索、コードの自動フォーマット、コードのエラー分析や修正案の提示といった、さまざまな機能を実現できます。

language server protocolについて (前編)

別記事でちゃんとprotocolと実際のimplementationを読んでまとめるつもりだ。


emacs からも lsp を扱うことができる。それが emacs-lsp/lsp-modeだ。

導入するためにやるべきことは2つ。

  1. language server を入れる
  2. .emacs.d の設定に数行加える

1. language server を入れる

簡単だ。

emacs-lsp/lsp-mode#supported-languages#supported-languages から欲しい language server を見つけて Install Command を叩くだけ。

ちなみに、takeokunnは2019/3/17 現在以下の4つを入れている。

  • html
  • css
  • javascript
  • golang

2. .emacs.d の設定に数行加える

こちらも簡単だ。

Caskに以下を追加して cask install をする。

(depends-on "lsp-mode")
(depends-on "lsp-ui")

init.el など emacs lisp ファイルに以下を追加する。

takeokunn/.emacs.d/blob/master/config/lsp.el 抜粋

;; ----- lsp ----- ;;

;;;;;;;;;;;;;;
;; lsp-mode ;;
;;;;;;;;;;;;;;
(use-package lsp-mode)

;; config
(setq lsp-print-io nil)
(setq lsp-trace nil)
(setq lsp-print-performance nil)
(setq lsp-auto-guess-root t)
(setq lsp-document-sync-method 'incremental)
(setq lsp-response-timeout 5)

;; hook
(add-hook 'go-mode-hook #'lsp)
(add-hook 'js2-mode-hook #'lsp)
(add-hook 'web-mode-hook #'lsp)

;; func
(defun lsp-mode-init ()
    (lsp)
    (global-set-key (kbd "M-*") 'xref-pop-marker-stack)
    (global-set-key (kbd "M-.") 'xref-find-definitions)
    (global-set-key (kbd "M-/") 'xref-find-references))

;;;;;;;;;;;;;;
;;  lsp-ui  ;;
;;;;;;;;;;;;;;
(use-package lsp-ui)

;; config
(setq lsp-ui-doc-enable t)
(setq lsp-ui-doc-header t)
(setq lsp-ui-doc-include-signature t)
(setq lsp-ui-doc-max-width 150)
(setq lsp-ui-doc-max-height 30)
(setq lsp-ui-peek-enable t)

;; hook
(add-hook 'lsp-mode-hook 'lsp-ui-mode)

(add-hook 'go-mode-hook #'lsp) など、それぞれの mode にhookして lsp が動くように設定している。

language server は特に起動しなくても #'lsp で勝手に起動してくれる。

以上だ。これでIDEとして emacs を扱える。


設定簡単なのにメチャクチャ便利に使えるので是非とも入れたい逸品だ。

vim でも同じくらい簡単に扱えるはずなので今度試してみたい。