ert.el が素敵 その四

どもです。
食べ蒔きしたミディトマトについて大事件が発生しました。
詳細は明日アップする予定でござんす。


こないだ言っていた ert バッファでのデフォルトディレクトリ問題を
下記の様に解決。無駄が多いですけど。
とりあえず大丈夫っぽい。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; for ert.el
(require 'ert)

(defun my-run-ert-test-maybe ()
  (interactive)
  (when (eq major-mode 'emacs-lisp-mode)
    (save-excursion
      (beginning-of-defun)
      (let ((line (buffer-substring-no-properties (point)
                                                  (save-excursion
                                                    (end-of-line)
                                                    (point)))))
        (when (string-match "^(ert-deftest \\([^ \n]+\\) ()$" line)
          (let ((w (selected-window))
                n
                (dir (file-name-as-directory (expand-file-name ".")))
                (b (get-buffer "*ert*")))
            ;; Change the current directory to this test directory
            (when b
              (save-excursion
                (set-buffer b)
                (cd dir)))
            ;; Run the test.
            (ert (match-string-no-properties 1 line))
            ;; Now, we're in *ert* buffer.
            (save-excursion
              (when (re-search-forward "Failed: \\([^ ]+\\)" nil t)
                (setq n (string-to-number (match-string-no-properties 1)))))
            (when (zerop n)
              ;; When passed, move to the original window.
              (select-window w))))))))

(define-key emacs-lisp-mode-map "\C-c\C-c" 'my-run-ert-test-maybe)


本当は,カーソルがあるS式,つまり,ert-deftest で定義されるテストを
評価してから,実行したいのですが,eval-defun, eval-last-sexp を
呼ぶと,うまくいかん。call-interactively したけど,
なんかしらんが,そのテストの名前が2つ続いたものが定義されてしまう。
わからんので,ギブということで。