EmacsでPythonを書く設定 2021

はじめに

PythonまわりのEmacsの設定を整理したということ。Company-modeの設定は言語共通の部分が多く長くなるので省略した。Language serverの紹介がメイン。

Language server

Emacsからlanguage serverを使うためにeglotを入れる。MELPAからインストール可能。さらにPython用のpython-language-serverをインストールしている。ターミナルから以下を実行しておく。

pip3 install python-language-server

Flymake

flycheckはOFFにして、flymakeを使うようにした。flymake-diagnostic-at-pointはなかなか便利なのでおすすめ。MELPAからインストール可能。

設定

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

;; pip3 install python-language-server
;; https://github.com/palantir/python-language-server
;;
;; 以下は追加でインストール
;; pip3 install rope
;; pip3 install pyflakes
;; pip3 install mccabe
;; pip3 install pycodestyle
;; pip3 install pydocstyle
;; pip3 install pyls-mypy
;; pip3 install pyls-isort
;; pip3 install pyls-black

(require 'eglot)
(add-hook 'python-mode-hook 'eglot-ensure)

;; server として起動
(add-to-list 'eglot-server-programs
             `(python-mode . ("pyls" "-v" "--tcp" "--host"
                              "localhost" "--port" :autoport)))

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

;; point位置にメッセージを表示する。eldocと干渉しないのが利点
(with-eval-after-load "flymake"
  (require 'flymake-diagnostic-at-point)
  (add-hook 'flymake-mode-hook #'flymake-diagnostic-at-point-mode))

その他

ほか、以下は好みで設定した。エコーエリアが複数行になるのを防ぐ効果がある。

(custom-set-variables
  '(eldoc-echo-area-use-multiline-p nil))

またsmart-jumpやivy-xrefも便利なので使っている。

(require 'smart-jump)
(smart-jump-setup-default-registers)  ;; pythonはデフォルトで有効になる
;; M-. (smart-jump-go; xref-find-definitions)
;; M-, (smart-jump-back; xref-pop-marker-stack)
;; M-? (smart-jump-references; xref-find-references)

(require 'ivy-xref)
(setq xref-show-xrefs-function #'ivy-xref-show-xrefs)

もし、blackユーザならばpycodestyleの設定をしておくと良い。

[pycodestyle]
ignore = E203, W503, W504
max-line-length = 88

おわりに

eglotとpython-language-serverの組み合わせがなかなか快適だったので紹介した。lsp-modeを設定するのも悪くはないし、elpyとflycheckの組み合わせで書くのも悪くはないので(特に軽快性が優れる)、このあたりは好みだろう。