yukke::note

technical note

emacs+pyflakes+flymakeでpythonの構文チェックを勝手にしてもらう

リアルタイムに構文チェックしたい

flymakeについては、flymake (いままでこれ無しでどうやってプログラム書いてたんだろう) - にゃあさんの戯言日記 ここを参考にされたし。emacsで書いてる傍から、リアルタイムに構文チェックが走るというやつ。メジャーな言語なら多分あると思う。

pythonとか動的型付け言語だと、コンパイルフェーズがないから、変数宣言を忘れたり、構文エラーでも実行しないと、それがエラーなのかわからないので困る。特に、重い計算するときに、途中まで処理うまくいったのに、ある関数を呼び出したら変数が未定義でエラーとかつらい。なので、事前に潰しておきたいというモチベーション。ちなみに、emacs 24.4.1を対象としています。このくらい新しいバージョンのemacsだと、flymakeはもう入ってるからすぐ使える。

pyflakesのインストール

pip pyflakesすればよいです。which pyflakesでpathをメモっておく。pyenvでインストールしたpythonだと、$HOME/.pyenv/shims/pyflakesにあると思う。

emacsの設定

(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 "PATH_TO_YOUR_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)

PATH_TO_YOUR_pyflackesを書き換えると、pyflakesがホックされてemacs上でほぼリアルタイムに入力に対して、チェッカーが動く。flymake-show-helpという関数が定義されているが、この関数がflymakeのメッセージをemacsのミニバッファに表示してくれるので便利。

様子

f:id:soh3914:20150109222117p:plain

f:id:soh3914:20150109222124p:plain

importしたのに使ってないとか、定義してない変数ですよとか親切。