はじめに
今年の記事は「やることをTODO化して管理してるんだけど,いっぱいありすぎて,でも今日中に何個も完了しなくちゃならないにも関わらず,その間にも新しいTODOがどんどん流れてくる環境で作業してますけど,なんとかして!」に対する一つのソリューションです.Org-mode のタスク管理に「Doingリスト」という概念を持ち込んで嵐を乗り切る手法を紹介します.
また,今年のカレンダーは .emacs
がテーマですので,私の設定ファイルのうち,2013年に変更を加えた部分についてリスト化しておきます.
キーワード:Emacs, Org-mode, Doingリスト, init.el
まずは趣旨にしたがい,設定ファイルを公開
私の Emacs の設定ファイルは,主に init.el, utility.el, private.el に分けられています.どのファイルも org-mode で管理されたテキストからエクスポートして生成しています.ソースは Github にまとまっています.また,各設定について少し解説が加えてある wiki もあります.もし odt や pdf で見たい人は,Github を漁ってください.
2013年に導入した elisp
- web-mode.el(HTML等を編集するメジャーモード)
- org-crypt.el(Org-modeのツリーをGPGで暗号化保存)
- wakatime-mode.el(WakaTimeと組み合わせた作業ログ記録)
なお,WakaTime がファイルの中身を外部に投げている可能性をまだ検証していません.自己責任でお試しください.
2013年に採用した/変更を加えた主な設定
- ag (The Silver Searcher) を grep の代替ツールとして使う
- マウスで選択した領域を自動コピーする
- MacOS の dictionary.app で COBUILD5 の辞書をひく
- モードラインの色をカスタマイズする
- 全角スペースと行末タブ/半角スぺースを強調表示する
- [org-babel] ソースブロックの入力キーをカスタマイズする
- 行間を制御する
その他,Org-modeが8系に移行したことによるエクスポート周りの設定を変えました.いわゆるox-
系関数への対応です.
Emacsに「Doingリスト」を作ってタスクを制御する
さて本題です.Doingリストのお話をします.
モチベーション
某会議に参加していると,次のような状況に遭遇します.
- 自分が発表しなければならない(しかも複数回)
- 文書チェックなどの作業をお願いされる(しかも数時間の〆切付き)
- 午前中に仕入れた情報を加工して,午後の会議で武器とする
- 会議後には呑み会が入っている
- なぜか別件の原稿〆切が近い
いわゆる「気が抜けない状況」ですね.項目数だけで言えば5つのタスクで済むように思えますが,2番目のタスクは泡のようにどんどん発生しますし,3番目の「さっき仕入れた情報を武器にする」を実現するには,数えきれないほどの付随タスクが発生します.しかも,それらのタスクの粒度は大小様々です.
GTD的な通常のフローで対処するならば,org-capture
で機械的にTODOを作ってInboxに格納して順番に処理していくことになります.ところが,タスク粒度が異なり優先順位が動的に変化する状況下では,確実に破綻します.運良く乗り切ったとしても,重要なタスクを処理し忘れるなどのリスクが伴います.場合によっては,それは信頼を失うタスクかもしれません.
そこで使えるのが,Doingタグを使った「Doingリスト」です.
Org-mode を使います(キリッ)
Doingタグの付いたタスク群は,まさに「今,そこにあるタスク(危機)」です.たとえ一つのタスクに意識が集中して全体像を見失ったとしても,基点である「Doingリスト」に帰ってくれば「今すべきこと」と「次にすべきこと」を俯瞰して確認できます.
(真のモチベーションは4番目で,「スッキリした脳」の状態で呑み会を楽しみたいだけという...)
どうやって「Doingリスト」を作るのか
Org-modeの利用者であれば,実は大した話ではありません.各タスクに Doing タグをつけて,org-tags-view
でそれらを表示するだけの簡単なお仕事です.使っているのはorg-agenda の一つの機能に過ぎませんが「Doingリスト」なる特別なバッファを構築できます.
設定
タグの色を変える
とりあえず赤にしています.目立つので.
(setq org-tag-faces
'(("Doing" :foreground "#FF0000")))
Doingタグの付いたツリーの探索範囲を設定する
アジェンダ作成の対象と同じになります.これらのバッファに含まれるツリーのみが,Doingリストで表示される対象となります.この例では5つのファイルが対象になっています.
(setq org-agenda-files
'("~/Dropbox/org/org-ical.org" "~/Dropbox/org/next.org"
"~/Dropbox/org/today.org"
"~/Dropbox/org/work.org" "~/Dropbox/org/research.org"))
Doing リストを表示するための関数を設定する
キーバインドは,C-c 3
に割り当てています.好みのキーバインドを選んで設定してください.
(defun my-sparse-doing-tree ()
(interactive)
(org-tags-view nil "Doing"))
(define-key org-mode-map (kbd "C-c 3") 'my-sparse-doing-tree)
Doing リストの項目を TAB
で選択し,自動でリストを閉じるようにする
Doing リストのタスク上でTABを押すと,当該ツリーに移動します.TAB
ではなくSPACE
を押すと,別バッファでツリーの中身が表示されます.
(org-defkey org-agenda-mode-map [(tab)]
'(lambda () (interactive)
(org-agenda-goto)
(with-current-buffer "*Org Agenda*"
(org-agenda-quit))))
Doingタグ付きの入力用テンプレート
org-capture でタグ付きのタスク入力を設定します.
(setq org-capture-templates
`(("d" "Doingタグ付きのタスクをInboxに投げる" entry
(file+headline nil "INBOX")
"** TODO %? :Doing:\n")))
Doingタグを簡単に付与する
タグ付けする時に,毎度「Doing」と打つのが面倒になったら,次のような設定を加えると,シングルキーでON/OFFを切り替えられます.以下の例では,f11
にトグルキーを割り当てています.各ツリー上だけでなく,コンテンツを編集している時も my-toggle-doing-tag
を呼び出して一発でトグルできます.
(defvar my-doing-tag "Doing")
;; Doingタグをトグルする
(defun my-toggle-doing-tag ()
(interactive)
(when (eq major-mode 'org-mode)
(save-excursion
(save-restriction
(unless (org-at-heading-p)
(outline-previous-heading))
(if (string-match (concat ":" my-doing-tag ":") (org-get-tags-string))
(org-toggle-tag my-doing-tag 'off)
(org-toggle-tag my-doing-tag 'on))
(org-reveal)))))
(global-set-key (kbd "<f11>") 'my-toggle-doing-tag)
タスクの入力
タスクの入力は2つのパターンが考えられます.一つは,org-capture
でDoingタグ付きのタスクを作る場合,もう一つは既存のツリーでDoingタグを付ける場合です.org-agendaの探索範囲内であれば,どこにツリーが格納されていてもDoingリストに表示されるので,タスクをどこに格納しよう?で迷うことはありません.嵐が過ぎ去ったらゆっくりと整理すればよいのです.
- Doingタグ付きの入力(
C-c r d
, タスクのタイトル入力,C-c C-c
で保存) - 既存のツリーにタグを付ける(
C-c C-c
, ミニバッファで Doing を入力)
このどちらかの方法でリスト登録することで,Doingリストにどんどんタスクが集約されていきます.先に示した my-toggle-doing-tag
を使えば,シングルキーでタグを付けたり外したりできます.
なお,doing.org を作れば?というアプローチもありですが,嵐が過ぎ去ったあとにツリーをどこに配置しようか悩むことになりますし,管理すべきファイルが増えるだけといえます.
Doingリストの表示
C-c 3
を押すとDoingが表示されます.複数のバッファからDoingなタスクが集められてきて,Doingリストを構成します.基本は org-agenda のバッファと操作系は共通です.
- ツリーの移動(
C-n
/C-p
) - ツリーのプレビュー(
SPACE
) - ツリーへの移動(
TAB
) - ツリーのステータス変更(
C-c C-t
) - リストのリフレッシュ(
r
) - リストを閉じる(
q
)
C-c 3
によるDoingリストの呼び出しはいつでもできます.頭が飽和してきたら,すぐDoingリストに戻ってくるとよいでしょう.
Doingリストを利用したタスク処理フロー例
最後に,全体のワークフローの例を図示します.
このように拙作の org-tree-slide と組み合わせると,
- Doingリストですべきタスクを選択
- Narrowing でそのタスクに集中!
- ステータス変更(DONEなどに変更)
- またリストに戻る
というサイクルを直感的に実行できるようになります.お試しあれ!
万が一,途中で示した設定だけでうまく行かなかったら指摘してもらえると助かります m(_ _)m
まとめ
今年は「Doingリスト」のお話をしました.まだ改善点がありそうですが,似たような状況に陥るOrg-modeユーザにオススメです(ニッチ!)