Python
Emacs
jedi

Emacsのjediのビューワーjedi-direxを使ってみる

はじめに

試した環境については下記。

  • OS
    macOS High Sierra(10.13.2)
  • GNU Emacs
    25.3.1
  • emacsのjediパッケージ
    0.2.7
  • python
    2.7.12, 3.6.2

jediはEmacsでPythonのコーディングを行うときにコード補完や定義への移動、ヘルプの表示など可能にするパッケージ。
(ジェダイという名前が気に入っています)

公式サイトの画像

ただ、公式サイトのQuick Startのとおりにやっても、なぜかM-x jedi:install-serverのところでエラーが出てしまったので、下記のサイトを見ながらpipで直接jediとepcをインストールしました。
http://d.hatena.ne.jp/n-channel/20131220/1387551080

pipでインストールしたjediとepcのバージョンは下記です。

  • jedi
    0.11.1
  • epc
    0.0.5

このjediですが、extensionで下記のようなコードビューワーがあり、これがjedi-direxになります。

jedi-direx

jedi-direxのインストール

実際にjedi-direxをインストールして使ってみました。
まず、package-installを使ってインストール。

M-x package-install RET jedi-direx RET

インストールされたバージョンは20140310.236でした。

そして下記を.emacsに追加してpythonファイルをpython-modeで開いてみました。

(setq jedi:complete-on-dot t)
(define-key python-mode-map "\C-cx" 'jedi-direx:pop-to-buffer)
(define-key python-mode-map "\C-c\C-x" 'jedi-direx:switch-to-buffer)
(add-hook 'jedi-mode-hook 'jedi-direx:setup)

しかし、ここで下記のエラーが発生。

deferred error : (error "\"AttributeError(\\\"module 'jedi.api' has no attribute 'defined_names'\\\",)\"")

どうやらjediをM-x jedi:install-server RETではなくpipで直接インストールしたためバージョンが合っていないようです。
このdefined_namesは既にjediの0.11.0からドロップされていました。
https://github.com/tkf/emacs-jedi/issues/293

そのため0.10.2をインストール。

$ pip uninstall jedi -y
Uninstalling jedi-0.11.1:
  Successfully uninstalled jedi-0.11.1
$ pip install jedi==0.10.2
Collecting jedi==0.10.2
  Using cached jedi-0.10.2-py2.py3-none-any.whl
Installing collected packages: jedi
Successfully installed jedi-0.10.2

Emacsを再起動して、もう一度試すとエラーは出ず、C-cxで無事jedi-direxのビューワーが表示されました。
TABキーでツリーが展開され、oキーを押すとそのラインに飛べます。
使いやすそうなので使っていきたいと思います。

BaseHTTPServer_py.png

2018/1/8追記
M-x jedi:install-serverが失敗した理由は単にvirtualenvが入っていないためでした。

pip install virtualenv

公式ドキュメントにも記載有り。

手動で入れたパッケージをアンインストールした後、

pip uninstall jedi epc

M-x jedi:install-serverを入力することで無事インストールできました。

ちなみにインストールされたPythonのパッケージの場所は下記の中でした。

.emacs.d/.python-environments

ただし、この方法でインストールしても結局Emacsのjedi-coreパッケージ内のjediepcserver.pyが対応していないので下記のエラーは発生します。

deferred error : (error "\"AttributeError(\\\"module 'jedi.api' has no attribute 'defined_names'\\\",)\"")

この件については既に修正のプルリクが出ていました。

https://github.com/tkf/emacs-jedi/pull/296