MENU

第3回 Python補完の実践 ― Emacsに頭脳を宿す

ここまでで、LSPとは何か、そしてEmacsがそれをどう扱うかを理解した。

最終回では、実際にPython補完を動かすための構築手順を示す。
目的は単純だ。「なんとなく動いた」ではなく、「なぜそうなるか」を理解したうえで、確信をもって環境を作ることである。
Emacsは設定が複雑なようでいて、理屈が分かれば極めて論理的な道具である。


目次

Python用LSPサーバの選択肢

LSPサーバは、言語ごとに独立した解析プロセスである。
Python用には主に次の二つが使われている。

サーバ実装特徴
python-lsp-server(pylsp)Python製標準的で扱いやすく、拡張が豊富。Emacsとの親和性が高い。
pyrightTypeScript製(Microsoft)高速で型解析が強力。静的型を多用するコードベース向け。

どちらもLSP仕様に従うため、クライアント(lsp-mode/eglot)から見れば等価である。
決めるべきは、「柔軟なPython的挙動を重視するか」「型安全性と速度を取るか」だ。


サーバの導入

仮想環境を使っている場合は、その中にインストールするのが望ましい。
グローバルに導入する場合は以下のようにする。

pylspの場合

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

これで pylsp コマンドが使えるようになる。
[all] オプションはflake8やmccabeなどLint系のプラグインもまとめて導入する。

pyrightの場合

npm install -g pyright

こちらはNode.js環境が必要である。型チェックを多用するプロジェクト向けだ。


Emacs側の準備

ここからは、LSPクライアントとして lsp-mode を例にとる。
eglot を使う場合も設定は簡略化されるだけで、概念は同じだ。

基本設定例(use-package使用)

(use-package lsp-mode
  :hook (python-mode . lsp-deferred)
  :commands (lsp lsp-deferred)
  :config
  (setq lsp-prefer-flymake nil)) ; flycheckを使う場合

(use-package lsp-ui
  :commands lsp-ui-mode)

(use-package company
  :config
  (global-company-mode))

これでPythonファイルを開いた時に自動でLSPサーバが起動し、
補完・定義ジャンプ・ドキュメント表示などが可能になる。
裏ではlsp-modepylspプロセスを立ち上げ、JSON-RPCで通信している。


動作確認

Emacsで任意の.pyファイルを開き、数行書いてみる。
import os の後に os. と打てば、補完候補が即座に表示されるはずだ。
もし表示されない場合は、M-x lsp-describe-session でサーバの状態を確認できる。
通信が確立していれば、そこに pylsp または pyright のプロセス情報が出る。


周辺ツールの統合

LSPは補完だけではなく、周辺ツールとも密接に連携する。
特にPython環境では以下の3つが鉄板である。

自動整形:blacken

(use-package blacken
  :hook (python-mode . blacken-mode))

保存時に black でコードを整形する。

構文チェック:flycheck

(use-package flycheck
  :init (global-flycheck-mode))

エラーをリアルタイムで表示。pylspにも統合されているが、外付けで使うと制御しやすい。

仮想環境切替:pyvenv

(use-package pyvenv
  :config
  (pyvenv-tracking-mode 1))

プロジェクトごとに異なる環境を自動で反映する。

これらを組み合わせることで、補完だけでなく実行環境全体が整う。


eglot を使う場合

Emacs 29以降であれば、eglot は標準で使える。
設定は驚くほど少ない。

(use-package eglot
  :hook (python-mode . eglot-ensure))

以上で完了だ。
補完はEmacs標準の completion-at-point に統合され、company も自然に動作する。
構造的には lsp-mode と同じ三層だが、設定と依存が極端に少ない。
LSPという機構そのものを理解する目的なら、まずはeglotで始めるのが良い。


実際の動作の理解

Python補完が動くとき、背後では次のやり取りが行われている。

Emacs → pylsp: "この位置の補完候補をくれ"
pylsp → Emacs: "print, property, process, ..."

単純だが、これがすべての基本である。
サーバが変わってもこの会話形式は変わらない。
だからこそ、EmacsでもVSCodeでも同じ補完が得られる。
LSPという共通言語が、エディタの枠を越えた知能を可能にしている。


まとめ

Python補完を動かすには、

  1. LSPサーバ(pylsp or pyright)を導入し、
  2. Emacsクライアント(lsp-mode or eglot)で通信を確立し、
  3. UI層(company, flycheck, blackenなど)で結果を扱う。

この三層を理解しておけば、どんな構成にも柔軟に対応できる。
Emacsは「設定地獄」と呼ばれがちだが、それは自由の裏返しである。
自分で理屈を掴み、構造を選び、道具を組み立ててこそEmacsである。


終わりに

この三部作を通じて伝えたかったのは、「LSPを理解すれば、Emacsは現代的IDEと同じ地平に立てる」という事実だ。
LSPはEmacsを変えるものではなく、Emacsの自由さを外の世界へ拡張する手段である。
設定例を丸写しにするのではなく、どう動くかを知り、自分の思想に合わせて構築してほしい。
Emacsは道具であり、思想である。
そしてLSPは、その思想を現代に接続するための共通語にすぎない。

目次