[emacs][howm] howm-mode で使っている Todo の切り替え関数のバグを取った

僕は普段 howm を使って、以下のような表記で Todo を管理している。

 * { } やること
 * {*} やったこと

そして、自作の関数を使って、上記のような表記がある行では、 C-t を押すたびに { } と {*} が切り替わるようにしている。
このエントリはその自作関数のバグを取ったよ、という話。


以下が修正後の最新版。

;; 汎用的に使える関数
(defun my-delete-insert-char(c)
  "ポイントの文字を1文字消し、代わりに文字 c を挿入する。"
  (interactive)
  (progn (delete-char 1 nil) (insert c) (backward-char 1)))

(defun my-swap-char-at-point(a b)
  "ポイントの文字 a と b を入れ替える。"
  (let ((c (char-to-string (char-after))))
    (cond
     ((string-equal c a) (my-delete-insert-char b))
     ((string-equal c b) (my-delete-insert-char a)))))

;; Todo 切り替え関数
(defun my-toggle-todo-brackets ()
  "現在行の先頭にある Todo 表記の切り替えを行う。"
  (interactive "*")
  (save-excursion
    (beginning-of-line)
    ;; Todo のフォーマット (* { } todo のような形式) にマッチ
    (re-search-forward "^[ ]*[*]+ {\\([ *]\\)}" (point-at-eol) nil)
    (goto-char (match-beginning 1))
    (my-swap-char-at-point " " "*")
    ))

;; howm-mode のキーバインドの設定
(eval-after-load "howm-mode"
  '(progn
     (define-key howm-mode-map "\C-t" 'my-toggle-todo-brackets)
  ))

今回修正したバグについて

re-search-forward に第一引数で渡している正規表現がちょっと間違っていたっぽい…。なので修正した。


あと、ずっと re-search-forward の第三引数を t にして使ってたんだけど、ここも nil に直した。
第三引数は、エラーをミニバッファに出力しないかどうかを決めるもので、

  • t にすると、エラーをミニバッファに出力せずに、関数の結果として nil を返すようになる。
  • nil にすると、エラーをミニバッファに出力する。

エラーしたかどうかを気にしたくなかったので、今まで t にしていてたのだけど、
nil にしておけば、エラーしたときにすぐに気付けるし、エラーを出力するとそれ以降の処理を中断して終わってくれるので安心だ。
しばらく使ってみて完全にエラーの心配がなくなったら t に戻そうと思う。