ChangeLogでtodoの管理

ChangeLogにtodoを書く。

以下のような形式で書く。

表記 意味
をやる(todo)
をやった。(done)

やる=□、やった=■で変換できるようにしておくと便利。

カーソルを合わせて□■をtoggleできると便利

ものぐさなので、□(または■)にカーソルを合わせるのも面倒くさいと思った。
行だけカーソルを合わせれば十分なように変更。
(ただし、同じ行に複数のtodoをかけなくなった。)

elisp作成

(defun toggle-string (from to i &optional p)
  (when p (goto-char p))
  (let ((prev (buffer-substring-no-properties p (+ p 1)))
	(replace (lambda (str) 
		   (delete-char i) (insert str) (backward-char i))))
    (cond ((string-equal prev from)
	   (funcall replace to))
	  ((string-equal prev to)
	   (funcall replace from))
	  (t nil))))

(defun toggle-string-in-line (from to i)
  (save-excursion 
    (dolist (pat (list from to))
      (beginning-of-line)
      (when (re-search-forward pat (point-at-eol) t 1)
	(toggle-string from to i (1- (point)))
	(return)))))

(define-key change-log-mode-map "\M-f"
  (lambda () (interactive) (toggle-string-in-line "□" "■" 1)))

M-fでtoggleできるようになった。

現在のtodoとかをみたい。

あと、手軽に現在作業しているbufferとChangeLogを行き来したいと思った。

(defun search-with-block (pat-for-block pat n)
  (let (result area)
    (save-excursion
      (dotimes (i (1+ n))
	(push (re-search-forward pat-for-block nil t 1) area))
      (unless (null (cdr area))
	(let ((end (car area)) (start (nth n area)))
	  (goto-char start)
	  (while (re-search-forward pat end t 1)
	    (push (buffer-substring (point-at-bol) (point-at-eol))
		  result))))
      (nreverse result))))

(defun search-todo-contents (str n)
  (let ((reg
	 (rx (repeat 4 num)"-"(repeat 2 num)"-"(repeat 2 num)
	     (+ whitespace)
	     (+ word)
	     (+ whitespace)
	     "<")))
    (with-output-to-temp-buffer "*todo*"
      (dolist (todo (search-with-block reg str n))
	(princ todo) (princ "\n")
	))))


(defvar MyChangeLog-prev-buffer nil)
(defvar todo-path "~/ChangeLog")

(defun MyChangeLog () (interactive)  
  (let ((bn (buffer-name (current-buffer)))
	(clg "ChangeLog"))
    (cond ((string-equal bn clg)
	   (switch-to-buffer MyChangeLog-prev-buffer))
	  (t 
	   (setq MyChangeLog-prev-buffer bn)
	   (find-file (concat "~/" clg))))))

(defun todo-list (n) (interactive "p")
  (with-current-buffer (find-file-noselect todo-path)
    (goto-char (point-min))
    (search-todo-contents "□" n)))

;;設定
(global-set-key "\C-cl" 'MyChangeLog)
(global-set-key "\C-ct" 'todo-list)

C-c l でChangeLogに移動できるようになった
C-c t で現在存在するtodoを表示するようになった。(defaultでは1日だけ)
(3日分とか見たかったら、C-u 3 C-c t)