org-modeのステータス変更のショートカットを設定する

僕は、org-modeを使ってタスクの管理を行っている。org-modeに対しては、自動化や使い勝手など自分なりの工夫をしている。 M-n で状態変更、 M-i で clock in、 M-o で clock out できるようにしている。加えて、 org-todo の実行時には completing-read でキーワードを選べるようにしている。

当初は org-todo のラッパー関数を定義して、それを org-mode-map に割り当てていた。しかし、現在は advice-add を使う形に整理している。また、一覧表示からも同じ操作を行いたいため、 org-agenda-mode 側にもキーバインドを設定している。

以下に設定例を示す。

(define-key org-mode-map (kbd "M-i") 'org-clock-in)
(define-key org-agenda-mode-map (kbd "M-i") 'org-agenda-clock-in)

(define-key org-mode-map (kbd "M-o") 'org-clock-out)
(define-key org-agenda-mode-map (kbd "M-o") 'org-agenda-clock-out)

(define-key org-mode-map (kbd "M-n") 'org-todo)
(define-key org-agenda-mode-map (kbd "M-n") 'org-agenda-todo)

(defun select-org-todo-staus-from-keywords (orig-fun &rest args)
  (funcall orig-fun (completing-read
      	       "[Change Status] "
      	       (cdr (car org-todo-keywords)))))

(advice-add 'org-todo :around #'select-org-todo-staus-from-keywords)