準備

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))
(package-install 'flycheck)
(use-package flycheck :ensure t)
(require 'flycheck)

checkerの定義

要点

  • flycheck-define-checkerを使う。

  • 定義したチェッカーはchecker-compileで手動実行できる。

  • 実行するチェッカーはflycheck-select-checkerで選択できる。

Pythonのdoctestをflycheckで実行する。

python -c 'import doctest; doctest.testmod("test")'
(flycheck-define-checker python-doctest
  "Run python doctest"
  :command ("python"
            "-c"
            (eval (format "import doctest; doctest.testfile('%s')"
			  (file-name-nondirectory buffer-file-name))))
  :error-patterns
  ((error line-start
	  "File \"" (file-name) "\", line " line ", in " (submatch (* nonl)) "\n"
	  (message)
	  line-end)
   )
  :modes python-mode)

Djangoでdoctestを行う場合はセットアップ処理が必要になる。

  1. 現在のカレントディレクトリを保持する。…(1)

  2. プロジェクトのルートディレクトリを探索する。

  3. カレントディレクトリをプロジェクトのルートディレクトリに移動する。

    カレントディレクトリに.envなどが配置されていることが多く manage.pyの実行もカレントディレクトリがプロジェクトのルートディレクトリの状態で実行することを前提としていることが多い。

  4. セットアップ処理を実行する。

    • import django

    • django.setup()

  5. (1)で保持したディレクトリをカレントディレクトリにする。

  6. doctestを実行する。

python -c "import doctest, os, sys, django; os.chdir('/srv/symdon-ga/symdon-middlewares/mnt'); sys.path.append(os.getcwd()); django.setup(); os.chdir('/srv/symdon-ga/symdon-middlewares/mnt'); doctest.testfile('tests.py')

error-filterにはrx形式の正規表現を使う

要点

  • rx形式

  • file-name, message, line, columnは特別に用意されており、flycheckの結果をバッファに反映するために使われる

  • flycheck-compileで正規表現の一致具合を確認できる

  • re-builder