Emacs で python を使う(第三回)

Syntax Check
今回は構文シンタックスチェックを扱います。
flymake-python-pyflakes と flymake-cursor と pep8 を入れる
それぞれ pip でインストールします。

面倒なので python 設定まとめw

;; python
(require 'python-mode)
(setq auto-mode-alist (cons '("\\.py\\'" . python-mode) auto-mode-alist))

(add-hook 'python-mode-hook
          '(lambda ()
             (setq indent-tabs-mode nil)
             (setq indent-level 4)
             (setq python-indent 4)
             (setq tab-width 4)
             (elpy-enable)
             (elpy-mode)
             (flymake-mode t)
             ))

;; flymake
(require 'flymake)
(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 "/usr/local/bin/pychecker"  (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)

;; 下波線は見づらいので変える
(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")))))

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

ここで、/usr/local/bin/pychecker ってなんやねん!
と思ったそこのあなた。するどい!

このファイルは自分で作りますw

#!/bin/bash

/usr/bin/pyflakes "$1"
/usr/bin/pep8 --ignore=E221,E701,E202 --repeat "$1"
true

こんなのを /usr/local/bin/pychecker として作成。pyflakes と pep8 の絶対パスは適宜置き換えてください。
あと実行権限付与を忘れないように。

$ chmod +x /usr/local/bin/pychecker

で、たぶん出来ます。

f:id:umeaji:20200207130228p:plain
オペレーター(ここでは代入記号)の周りにスペースを入れないとダメ。

f:id:umeaji:20200207130243p:plain
foo は定義されてない。

このように構文の警告やエラーの指摘をしてくれます。