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)
('python-mode-hook #'lsp) (add-hook
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
変数を設定します。
eval . (setq-local lsp-pyright-venv-path (expand-file-name "~/.venvs")))))) ((python-mode . ((
これだけだと、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-valueseval setq-local lsp-pyright-venv-path
'(("~/.venvs"))))) (expand-file-name
この、custom-set-variables
関数の呼び出しをinit.el
にベタ書きするか、custom-file
変数が示すファイルに記載しておきinit.el
からロードするようにしておけば、警告が表示されなくなります。
各プロジェクトのpyrightconfig.json
では、~/.venvs
ディレクトリ配下にあるサブディレクトリ名を指定します。
~/.venvs/sandbox
ディレクトリのvirtualenv環境を使う場合は以下の記載とします。
{
"venv": "sandbox"
}