静かなる名辞

pythonとプログラミングのこと


emacsでpythonを書くための設定 2019年版

概要

 emacsライトユーザーの私が、新規環境にemacs25を導入してpythonを書くにあたってやった設定を書いておきます。目的はpythonを書くことだけです。

 前提として、以下の記事のように環境を作っています(読まなくてもなんとかなります)。

Ubuntu 18.04 LTSにvenvでミニマムなPython3.7仮想環境を構築 - 静かなる名辞

 あれこれやってもそこまで快適にならないので、flymakeとjediの設定をやっただけです。

インデントの設定

 以前のinit.elからそのまま引き継ぎましたが、要らんかも。

(add-hook 'python-mode-hook
  (lambda () (setq python-indent-offset 4)))

pyflakes・flymakeを入れる

 これは入れないとはかどらないので入れました。

 まずpython側で、仮想環境をactivateした状態でpyflakesを入れます。

$ pip install pyflakes

 flymakeはemacsにデフォルトで入っていますが、設定が要ります。

; これも昔どこかからコピペして使っている秘伝のタレ・・・
(setq flymake-allowed-file-name-masks '())
(add-hook 'find-file-hook 'flymake-find-file-hook)
(when (load "flymake" t)
  (defun flymake-pyflakes-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
           (local-file (file-relative-name
                        temp-file
                        (file-name-directory buffer-file-name))))
      (list "ほげほげ/bin/pyflakesの絶対パスを書く"  (list local-file))))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.py\\'" flymake-pyflakes-init)))
; show message on mini-buffer
(defun flymake-show-help ()
  (when (get-char-property (point) 'flymake-overlay)
    (let ((help (get-char-property (point) 'help-echo)))
      (if help (message "%s" help)))))
(add-hook 'post-command-hook 'flymake-show-help)

; デフォルトだと赤波線になって見づらかったんで直した
; 参考:https://suer.hatenablog.com/entry/20090307/1236403449
(custom-set-faces
  '(flymake-errline 
     ((((class color)) 
       (:foreground "red" :bold t :underline t))))
  '(flymake-warnline 
     ((((class color)) 
       (:foreground "red" :bold t :underline t))))); :background "white")))))

 これだけで使えるはずです。.pyを開けば効くようになります。

jediを入れる

 コード補完のない環境で書いていた期間も割と長く、なければないでやれることは実感として知っていたので入れるかどうか迷いましたが、せっかくなので入れることにしました。

 一応公式のマニュアルの通りにやればだいたいうまく行くはずですが、一回失敗してel-getから導入しなおしたら治ったみたいなこともあったので、割とハマりやすいと思います。要注意です(つーか正直emacsが面倒くさい。pythonに比べれば)。

Jedi.el - Python auto-completion for Emacs — Emacs Jedi 0.2.0alpha2 documentation


 とりあえず、el-getが動くようにしておきましょう。

M-x el-get-install RET jedi RET

 これを打ったら(しばらく時間はかかるけど)そのうちぜんぶ導入終わったというメッセージがミニバッファに出てきますので、その後にinit.elを編集します。

(require 'jedi)
(add-hook 'python-mode-hook 'jedi:setup)
(setq jedi:complete-on-dot t)

 で、残念なことにjediはこれだけでは使えず、サーバなるものをpython側に入れないといけません。

 とりあえず、

$ pip install jedi

 するんですが(当然仮想環境で)、そもそもvenvで仮想環境を組んでいるのでどうしたものか(どう連携させるか)と考え込んでしまいました。virtualenvのやり方は調べると出てくるんですが、venvの場合はググってもよくわかりません。ドキュメントを読んでもさっぱり。

 思案した結果、「まあいいや、ダメ元でやろう」とpython仮想環境にvirtualenvを導入し(依存があるらしい。他にepcとかも要求されますが、jediと一緒に入ったような気もする)、仮想環境をactivateしたターミナルからemacsを立ち上げて、

M-x jedi:install-server RET 

 してみました。そしたらぜんぶ良い感じにやってくれました。警戒して以下のような2行も書いてみたりしたのですが、けっきょくなくてもそこそこちゃんと動いたので消すかどうか迷い中。

(setq jedi:server-command
      (list "仮想環境をactivateした状態のwhich pythonの結果" "ほげほげ/lib/python3.7/site-packages/jediepcserver.pyみたいなの"))

 ただし、この2行がないと「仮想環境をactivateしたターミルから立ち上げないとちゃんと動かない」状態になります。それはそれで良いような気もするし、不便といえば不便。まあ、仕組みがよくわからないので触っていません。

まとめ

 終わってみれば大したことやってないのですが、正直けっこう苦労しました。

 ライトユーザーにはけっこう難しいですが、とにかく環境は揃ったのでがんばります。