EmacsでPythonを書く設定2022

はじめに

2022年にあたってPythonまわりのEmacsの設定を再び整理した。
今回もLanguage serverの紹介がメイン。

追記:2024年のものには3rd party plugin に ruffを使うものを書いてみた。language serverはお好みで。
tam5917.hatenablog.com

Python-mode

MELPAからインストール可能。
melpa.org

Language server

Emacsからlanguage serverを使うためにeglotを入れる。

さらにPython用のlanguage serverをインストールする。

pip install 'python-lsp-server[all]'

以前の記事ではpython-language-serverを入れていたが、現在メンテナンスが停止している。
github.com

そこでfork版のpython-lsp-serverを入れたというわけだ。
github.com

3rd Party Plugins

それぞれpython-lsp-serverに対応している。

pip3 install python-lsp-isort
pip3 install python-lsp-black

python-lsp-isortはimport順を自動でソートしてくれるパッケージである。

python-lsp-blackはblackの仕様に沿ってコードをフォーマットしてくれるパッケージである。

これらはeglot-format-bufferからまとめて起動できるが、バッファをファイルに保存する際にhookとして引っ掛けておくことにした。

設定

;; Python
(setq auto-mode-alist (cons '("\\.py$" . python-mode) auto-mode-alist))
(setq interpreter-mode-alist (cons '("python" . python-mode)
                                   interpreter-mode-alist))

(require 'eglot)

;; Python-mode起動時にeglotを有効化
(add-hook 'python-mode-hook 'eglot-ensure)

;; 保存時に自動整形 (eglot)
(add-hook 'python-mode-hook
          #'(lambda ()
              (add-hook 'before-save-hook
                        'eglot-format-buffer nil t)))

;; flycheckはOFFにして、flymakeを使うようにしている。
;; 以下のパッケージを使うと、メッセージがカーソル位置に出現するので、
;; エコーエリアと干渉しないのが良い。お好みで。
;; (with-eval-after-load "flymake"
;;   (require 'flymake-diagnostic-at-point)
;;   (add-hook 'flymake-mode-hook #'flymake-diagnostic-at-point-mode))