EmacsでのPython開発
tl;dr
lsp-mode, lsp-pyrightとpyrightを用いることで、十分に快適な環境を得ることができました。
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で確認できます。
最低限必要な設定オプジョンはvenvPathとvenvの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"
}