emacsで画像の変更をチェックしてリロードする関数を書いた

これで絵を書くコードで遊ぶのが楽になるはず><

(defvar reload-image-target-path "")
(defvar reload-image-target-buf "")
(defvar reload-image-current-buffer "")
(defvar reload-image-wait-time 1)

(defvar reload-image-every-where-p nil)
(defvar reload-image-timer nil)
(defvar reload-image-timer-active-p nil)


(defun reload-image-target-update-p ()
  (let* ((l (file-attributes reload-image-target-path))
	 (last-access (nth 4 l))
	 (last-modification (nth 5 l)))
    (time-less-p last-access last-modification)))
   
(defun reload-image ()
  (when (or reload-image-every-where-p
	    (string= (buffer-name) reload-image-current-buffer))
    (with-current-buffer (get-buffer reload-image-target-buf)
      (when (reload-image-target-update-p)
	(message "reload-image")
	(revert-buffer t t)))))
    
(defun reload-image-timer (&optional opt)
  (setq reload-image-timer-active-p
	(case opt 
	  (1 t) (-1 nil) (t (not reload-image-timer-active-p))))
  (if reload-image-timer-active-p
	(setq reload-image-timer
	      (run-with-idle-timer
	       reload-image-wait-time t 'reload-image))
    (when reload-image-timer
      (cancel-timer reload-image-timer)))
  (message (format "reload-image-timer is %s"
		   (if reload-image-timer-active-p "on" "off"))))

(defun reload-image-timer-start (path) (interactive "Ftarget")
  (if reload-image-timer-active-p
      (message "another timer is also acitive.")
    (progn
      (setq reload-image-target-path path)
      (setq reload-image-current-buffer (buffer-name))
      (find-file-other-frame path)
      (setq reload-image-target-buf (buffer-name))
      (reload-image-timer 1))))

(defun reload-image-timer-stop () (interactive)
  (reload-image-timer -1))

;; (reload-image-timer-start "a.png")
;; (reload-image-timer-stop)

;; (benchmark-run (dotimes (i 1000) (reload-image-target-update-p))); =>(0.023139 0 0.0)
;; (benchmark-run (dotimes (i 1000) (string= (buffer-name) reload-image-target))); =>(0.0010249999999999999 0 0.0)