Emacsでeglotから pylsp (python-lsp-server, Python LSP Server) を使おうと思ったのですがエラーとなってしまいました。対処のメモを残しておきます。
やったこととエラー内容
Emacsでプログラミング時の補完やジャンプなどを行うためにeglotを使おうと思いました。そして Language Server として py-lsp-server を使おうとGitHubのREADMEを参考にインストールしました。
ちゃんとインストールできたようなのでEmacsを起動して試しに test.py
を開いたのですが以下のようなエラーが出ました。
Error in post-command-hook ((closure ((–cl-maybe-connect– closure #1 nil (let ((G1 buffer)) (if (buffer-live-p G1) (save-current-buffer (set-buffer G1) (remove-hook ‘post-command-hook –cl-maybe-connect– t) (if eglot–managed-mode nil (apply #’eglot–connect (eglot–guess-contact))))))) (buffer . #)) nil (let ((G1 buffer)) (if (buffer-live-p G1) (save-current-buffer (set-buffer G1) (remove-hook ‘post-command-hook –cl-maybe-connect– t) (if eglot–managed-mode nil (apply #’eglot–connect (eglot–guess-contact)))))))): (error “None of’pylsp, pyls, pyright-langserver, jedi-language-server, ruff-lsp’ are valid executables”)
ライブラリがバイトコンパイルされている場合は以下のような文字化けっぽい表示になると思います。
Error in post-command-hook (#[0 “\303\301!\205 r\301q\210\304\305\300\242\306#\210 ?\205 \307\310\311 ")\207” [(#0) # eglot–managed-mode buffer-live-p remove-hook post-command-hook t apply eglot–connect eglot–guess-contact] 4]): (error “None of ’pylsp, pyls, pyright-langserver, jedi-language-server, ruff-lsp’ are valid executables”)
これはeglotから pylsp
(などのlanguage serverを起動するコマンド)が見つからないと起こるものです。
対処
私の環境では、Emacsから pylsp
コマンドへのパスが通っていなかったことが原因でした。ではパスを通せばいいのかと言うと必ずしもそれがベストとは限りません。
まず、python-lsp-serverのREADMEではインストールコマンドとして以下が紹介されています(2024-09-22現在)。
pip install python-lsp-server
しかしpipコマンドでこうしたシステム上で広く使うコマンドをインストールするのはあまり得策ではありません。ユーザーごとにPythonの環境を複数作っている場合(venvやpyenv, pipenvなどなど)、コマンドがどこにインストールされるのかが明確ではなくなってしまうためです。
解決策としては以下が考えられます。
要はこうしたシステム全体へのコマンドインストールを想定したパッケージマネージャを使うべきです。今回の場合は pylsp
がHomebrewでインストール可能であるため、Homebrewが使える環境であればこれでOKです。
brew install python-lsp-server
しかし常にHomebrewなどにもパッケージがあるとは限りません。もしpipにしか無いという場合は、もう一つの方法であるpipxを使うのがおすすめです。pipxの詳細については他の記事にお任せします。
こうして無事インストールできたら、あとはEmacsからパスを通すだけです。
Homebrewの場合:
(add-to-list 'exec-path "/opt/homebrew/bin/")
pipxの場合:
(add-to-list 'exec-path (expand-file-name "~/.local/bin/"))
もちろん実際のパスは環境によりますので which pylsp
などをして実際のパスを確認しておきましょう。
さいごに
今回はpython-lsp-serverをインストールしたにもかかわらずEmacsのeglotから使えなかった状況に対する対処方法をまとめました。根本の原因としてpipでコマンドインストールはやめようということと、Emacsからはコマンドのパスをきちんと通しておきましょうということですね(特にCLI版ではなくGUI版のEmacsを使う場合)。