これまで持っているタスクをどのように管理し、どの順番で処理するのかという事について様々な工夫をしてきた。現時点ではEmacsを使ってタスクを管理している。
Emacsには Org-mode
というドキュメントシステムがある。これは軽量マークアップ言語であり、それらを統合的に扱うための仕組みだ1。他の軽量マークアップ言語との違いを考えると、 Org-mode
自身が様々な機能を取り入れていれている大きなシステムになっている。例えば表計算機能、出力の変換、タスクの管理、時間計測などだ。そして Org-mode
の拡張として様々な機能がサードパーティとして公開されている。
僕はこの Org-mode
の機能やその拡張である、 org-todo
、 org-agenda
や org-super-agenda
を使ってタスクの管理をしている。 org-todo
の記法に従いタスクを Org-mode
のファイル内に記述し、 org-agenda
を使い一覧表示して進捗状況を把握している。 org-super-agenda
は org-agenda
の表示を更に見やすくするために、タスクのカテゴリをグループ化した表示を提供する。 org-super-agenda-groups
変数の設定によって表示する。この設定は、通常 .emacs.d/init.el
に指定するため固定される。
表示順序が固定されると、表示上部(ファーストビュー)のカテゴリに属するタスクに目が行くため、どうしてもそのカテゴリの作業を優先して取り組んでしまう。
優先して取り組むカテゴリが固定している場合はそれで良いが、僕の場合は持っているカテゴリをそれぞれ進めていく必要があり、優先すべきカテゴリを固定しづらい。
つまり、作業をまんべんなく開発するために、 org-super-agenda-groups
の設定( :order-multi
属性の値)をリングバッファのように循環させ、切り替えたい。このカテゴリの順序を切り替えられるようなEmacs Lispを実装した。
(setq org-cycleagenda-current-category "minet")
(defun org-cycleagenda-number-sequence ()
(let ((first-index (ring-member org-agenda-categories-ring org-cycleagenda-current-category)))
(number-sequence first-index (+ -1 first-index (ring-size org-agenda-categories-ring)))))
(defun org-cycleagenda-render-order-multi (index)
`(:order-multi
(,index
(:category ,(ring-ref org-agenda-categories-ring
index)))))
(defun org-cycleagenda-render-super-agenda-groups ()
`((:name "Habit" :habit t)
(:name "Schedule" :todo "TODAY" :time-grid t)
(:name "Deadline" :todo "TODAY" :deadline t)
,@(mapcar #'org-cycleagenda-render-order-multi
(org-cycleagenda-number-sequence))))
(defun org-cycleagenda-apply-next ()
(interactive)
(setq org-cycleagenda-current-category
(ring-next org-agenda-categories-ring org-cycleagenda-current-category))
(setq org-super-agenda-groups
(org-cycleagenda-render-super-agenda-groups)))
これで、まんべんなく作業を進行できるようになる2。暫くはこれを使ってみる事にする。