2021年1月10日日曜日

lsp-mode と python-language-server と pipx

長く Emacs でプログラムを書いている。 最近は(?)時代遅れ扱いされがちな Emacs ではあるが、特に乗り換えたいというほどのものがなく、何となく使い続けている。 他の環境で使えるようになった良さげな機能があって食指が動いても、それ Emacs でもできるよ、と言われると、じゃあいいかとなる。

今回、導入してみたいのは python-language-server である。 LSP (language server protocol) 自体は、VS Code のためにか何か Microsoft が作ったものだそうだが、 プロトコルの規定なので結局それを Emacs だったり Vim だったりから使えるようにする人が現れて、事実上の標準になっている。 昔何か別のコード補完のパッケージを Emacs に入れたときは重すぎて使い物にならず、 いままで dabbrev 以外の補完は使ってこなかったのだが、これはどうだろうか。

導入に際して引っかかるのは、python-language-server のインストール先である。 だいたい、Python のプロジェクトは、少し前まで Python 2 と 3 を使うものが混在していたために必要に迫られて、 pipenv で環境を切り分けて依存から何から別々に持つ、という方針で扱ってきたので、 その方針でいくとプロジェクトごとかもしれない、と最初は考えた。 しかし、Emacs でこれを使う lsp-mode の設定はパスを一つ指定する必要があるようだ。 どうしよう、と、ここで1ヶ月は放置していたと思う。

そんなある日 pipx というものを知った。 Python で書いたコマンドを隔離した環境にインストールするという。 要するに1つのコマンド用に venv を切ってインストールしてパスを通す、みたいなことをコマンド一発でやってくれるというわけだ。 これだわ。

ということで、インストール方法は

  1. pipx をインストールする。たとえば mac なら brew install pipx でいける。
  2. pipx install python-language-server
  3. Emacs に lsp-mode を入れる。普通に package-list-packages から選択。
  4. .emacs (などの Emacs の設定ファイル)に、次のように書く
    ;;; lsp-mode (language server protocol)
    (use-package lsp-mode
      :hook
      (python-mode . lsp)
      :init
      (setq lsp-keymap-prefix "C-c l")
      :config
      (setq lsp-pyls-server-command (expand-file-name "~/.local/bin/pyls"))
      :commands lsp)
    

となる。 ちなみに ~/.local/bin が pipx がインストールしたコマンドのリンクをおいてくれるパス。

また今回も、Emacs で使えるなら移行しなくていいか、となるパターンのようだ。

0 件のコメント:

コメントを投稿