EmacsでのPython開発

Posted on September 16, 2021 by nobiruwa

tl;dr

lsp-mode, lsp-pyrightpyrightを用いることで、十分に快適な環境を得ることができました。

lsp-mode + lsp-pyright + pyright の構築手順

npmのインストール

pyrightはNode.jsパッケージです。よって、はじめにnpmコマンドをインストールします。

$ sudo apt install npm

追記

nodenv/nodenvを使ってnpmコマンドを準備するようにしました

また、Pythonもpyenv/pyenvを使うようにしました

Emacsパッケージのインストール

M-x package-install
lsp-mode
lsp-pyright

lsp-modeの設定は過去の記事で書いた通りなので省略します。

;;;;;;;;
;; lsp-pyright
;;;;;;;;
(require 'lsp-pyright)
(add-hook 'python-mode-hook #'lsp)

pyrightのインストール

pyrightはEmacsにlsp-pyrightを入れた後、Pythonのソースコードを開いたときにインストールのミニプロンプトでインストールことができます。 選択肢はpyrightしかありませんので迷うことはないでしょう。

Unable to find installed server supporting this file. The following servers could be installed automatically: pyright[Enter]

この手順によりpyrightコマンドは~/.emacs.d/.cache/lsp/npm/pyright/bin/pyrightにインストールされます。

virtualenvを使うプロジェクトの設定

私はしばしばvirtualenvを使います。virtualenvにしかないパッケージに対して補完を有効にするためにはpyrightconfig.jsonを用意してvirtualenv環境のパスをpyrightに伝える必要があります(pyrightコマンドの起動オプションで伝えることもできます)。

pyrightconfig.jsonの書式はPyright Configurationで確認できます。

最低限必要な設定オプジョンはvenvPathvenvの2つです。

pyrightconfig.jsonを含むプロジェクトのリソースを複数のユーザーで共用したいので、venvPathには~/.venvsを指定したいです。

しかしながら、pyrightの設計思想から~や環境変数は展開されません。

LSPクライアント、つまりEmacsで展開する必要があります。

そこで、evalを使って動的にローカル変数の値を設定できる仕組みを使って、venvPathオプションを設定することにします。

ホームディレクトリかPythonプロジェクトのワークスペースのルートディレクトリに.dir-locals.elを用意しvenvPathオプションに対応するlsp-pyright-venv-path変数を設定します。

((python-mode . ((eval . (setq-local lsp-pyright-venv-path (expand-file-name "~/.venvs"))))))

これだけだと、Pythonのソースコードを開くたびにlsp-pyright-venv-path変数が安全でないローカル変数であるとして警告が表示されます。

The local variables list in /home/ein/pythonprojects/
contains values that may not be safe (*).

Do you want to apply it?  You can type
y  -- to apply the local variables list.
n  -- to ignore the local variables list.
!  -- to apply the local variables list, and permanently mark these
      values (*) as safe (in the future, they will be set automatically.)

  * eval : (setq-local lsp-pyright-venv-path (expand-file-name "~/.venvs"))

!を選択して安全なローカル変数であると永続的にマークします。

すると、Emacsのinit.el(あるいはcustom-file変数が示すファイル)のcustom-set-variables関数の呼び出しパラメータにsafe-local-variable-valuesが追加されます。

(custom-set-variables
 ...
 '(safe-local-variable-values
   '((eval setq-local lsp-pyright-venv-path
           (expand-file-name "~/.venvs")))))

この、custom-set-variables関数の呼び出しをinit.elにベタ書きするか、custom-file変数が示すファイルに記載しておきinit.elからロードするようにしておけば、警告が表示されなくなります。

各プロジェクトのpyrightconfig.jsonでは、~/.venvsディレクトリ配下にあるサブディレクトリ名を指定します。

~/.venvs/sandboxディレクトリのvirtualenv環境を使う場合は以下の記載とします。

{
  "venv": "sandbox"
}