コンテンツへスキップ

モーレツ! Org mode 教室 その5: TODOを管理する

もくじ

TODOの管理

Org modeには、強力なTODO管理機能が備わっている。

なんでアウトライン・プロセッサにTODO管理機能が付いてんだ、という疑問は当然あると思うが、確かにやるべきことというのは大体書き仕事をしているときに思いつくもので、そういう意味では文章執筆支援が本業のOrg modeにTODO機能があるというのはそんなにおかしくはない。実際、非常に便利である。

TODOを書くのは簡単で、とにかく見出しに続けて TODO と内容を書けばよい。

* TODO ゴミを出す

手でTODOと書いてもよいが、見出しの上で C-c C-t と打つと自動的に挿入される。さらに、何度か C-c C-t と打つとTODOとDONE(済み)、そしてただの見出しという風に切り替わるはずである。 S-右/左矢印 も基本的に同じ。

さらに S-上/下矢印 を押すと [#B] のような文字列が挿入される。これはTODOの優先度で、標準がBというわけである。もう一度押すとAやCに切り替わる。例によって S-M-RET で次行にTODO見出しが追加され、 M-上/下矢印 で行の順番が入れ替えられる。

* TODO [#A] 便所を掃除する
* TODO [#B] ゴミを出す

キーワードの追加

TODOの状態が、TODOとDONEだけなのが寂しいという人もいるかもしれない。例えばGTDの信奉者だと、Someday/MaybeやWaiting Forに相当する状態が欲しいという人もいるだろうが、そうした場合は

(setq org-todo-keywords
  '((sequence "TODO" "SOMEDAY" "WAITING" "|" "DONE")))

などと org-todo-keywords にキーワードを指定することで増やすことができる。 で、 C-c C-t を打つごとに次々と状態が切り替わる…のは良いのだが、キーワードが増えるといちいち一つずつ切り替えるのもめんどくさい。その場合は、

(setq org-todo-keywords
  '((sequence "TODO(t)" "SOMEDAY(s)" "WAITING(w)" "|" "DONE(d)")))

などと、キーワードの後に半角丸かっことショートカット文字を追加してやると、 C-c C-t と打てば、メニューが出てきてその文字を打つだけでキーワードが指定できるようになる。文字は好きに選べるので、例えばDONEに d ではなく x を当ててもいいわけだ。 | は装飾で、縦棒の右と左で色が変わる。好きなところに入れればよい。

私は装飾だと思っていたのだが、実は縦棒には実質的な意味があった!あとでまた触れる。

TODOの追加

さらに、メモの要領で思いついたTODOをすぐ保存できると便利である。その1で取り上げたOrg-captureを用いて、

; Org-captureのテンプレート(メニュー)の設定
(setq org-capture-templates
      '(("t" "Todo" entry (file+headline "~/ownCloud/Org/gtd.org" "INBOX")
     "* TODO %?\n %i\n %a")
    ("n" "Note" entry (file+headline "~/ownCloud/Org/notes.org" "Notes")
     "* %?\nEntered on %U\n %i\n %a")
    ))

のように書けば、 いつでもどこでも C-c c を押せばメニューが出現し、t を押せばTODO見出しが出てくる。で、書いたら C-c C-c ですぐ保存、やめたければ C-c C-k で破棄されるのである。

このセッティングだと、gtd.orgというファイルの * INBOX という見出しの下に ** TODO 借金を返す と言った感じで保存される。私はTODOはgtd.org、メモはnotes.orgと分けているが(refileできるのでファイルというかサブツリー間の移動はどのみち簡単)、別に分けなくてもよい。また、gtd.orgとかINBOXというのは私がGTDごっこをしているからで、名前はなんでもよい。

プロジェクト管理

プロジェクト管理というか、複数の小仕事からなる大仕事というのもあるが、Org modeはこれもうまくハンドルできる。

* TODO 世界を制服する [33%]
** DONE 日本を制服する
** TODO アメリカを制服する
** TODO 中国を制服する

といった具合に、TODOを入れ子にすることが出来るのである。 その3で出てきたチェックボックス同様、最上位のTODO見出し、これが実質的にプロジェクト名になるわけだが、ここに [/][%] と書いておけば、完了したTODOの数やパーセントも計算してくれる。

基本的にはこれで十分だと思うが、こだわるならばもう少し細かくコントロールすることもできる。

例えば、

* TODO 世界を制服する [0%]
** TODO 志を高く持つ
** TODO 世界各地を制服する
*** DONE 日本を制服する
*** TODO アメリカを制服する
*** TODO 中国を制服する

のように、子TODO(この場合、世界各地を制服する)の下にさらに孫TODO(例えば、日本を制服する)がある場合、デフォルトでは孫TODOを一つ潰しても全体の達成数や達成率にカウントされないのだが(だからこの例の場合0%)、

* TODO 世界を制服する [20%]
:PROPERTIES:
:COOKIE_DATA: todo recursive
:END:
** TODO 志を高く持つ
** TODO 世界各地を制服する
*** DONE 日本を制服する
*** TODO アメリカを制服する
*** TODO 中国を制服する

のように指定すると、子TODOが一つも終わっていないので0%、ではなく、子も孫もひっくるめて全部で5つのTODOのうち1つ終わったから20%終了、となる。

Org modeには見出しツリーの挙動を細かく変えられるプロパティという仕組みがあり、 :PROPERTIES::END: で囲った中でいろいろ指定できるのだが(詳しくは The Org Manual: Properties and columnsを参照)、 :COOKIE_DATA: というプロパティに todo recursive と指定してやると、孫TODOもカウントしてくれるようになるのである。

* TODO 世界を制服する [33%]
** DONE 日本を制服する
** TODO アメリカを制服する
** TODO 中国を制服する

最初の例に戻って、この場合デフォルトでは、日本以外を制服しなくてもとりあえず世界制服をDONEにすることが出来てしまうのだが、~/.emacs.d/init.el に

(setq org-enforce-todo-dependencies t)

と書いておけば、子TODOを全部クリアしないと親TODOをDONEに変えられなくなる。どうしても変えたい場合は C-u C-u C-u C-c C-t とすれば変えられる。好みにもよるだろうが、有効にしておくと良い機能である。

また、上から順にTODOをこなすことを強制したいのであれば、

* TODO 世界を制服する [20%]
:PROPERTIES:
:ORDERED: t
:END:   
** DONE 志を高く持つ
** TODO 超兵器を開発する
** TODO 日本を制服する
** TODO アメリカを制服する
** TODO 中国を制服する

などと指定してやると、超兵器を開発しない限り日本の制服以下をDONEにできないようになる。プロパティの :ORDERED: を t にすると、上から順にこなしていかなければならなくなるわけだ。

タイムスタンプの基本

Org modeでは、 C-c . を打つと簡単にタイムスタンプを挿入して時間を記録することができる。 今日の日付ならそのままEnterだし、カレンダーが出てくるので、他の日付を入れたければ S-矢印 で移動して好きな日付でEnterを打てば、<2018-08-27 月> といった感じに挿入される。タイムスタンプの上で C-c . を打つと編集できるし、うっかり編集しておかしくなった場合は、 C-c C-c を打てば自動的に修正される。

期日や締切、あるいは習慣のような繰り返されるTODOなど、タイムスタンプ機能は時間の流れを考慮に入れたスケジュール管理で最も活躍するのだが、そのあたりに関してはOrg-agendaの紹介をする際に譲り、今回の話に必要なものに絞ると、重要なのはTODOの終了日時の記録法である、~/.emacs.d/init.elに

(setq org-log-done 'time)

と指定すると、TODOをDONEにした際に、

* DONE ゴミを出す
  CLOSED: [2018-08-27 月 00:18]

などと終わった時刻が自動的に記録される。

で、実はこれとさっきの縦棒が絡んでくるのである。たとえば

(setq org-todo-keywords
  '((sequence "TODO(t)" "SOMEDAY(s)" "WAITING(w)" "|" "DONE(d)" "CANCELED(c@)")))

のようにすると、TODO、SOMEDAY、WAITINGはただキーワードが切り替わるというだけだが、DONEとCANCELEDは、DONE扱いといいますか、これらのキーワードに切り替えるとCLOSEDのタイムスタンプが自動的に挿入されるのである。すなわち、TODOには大別してOPEN状態とCLOSE状態があり、縦棒は、左がOPEN状態とみなされるキーワード、右がCLOSE状態とみなされるキーワードを分けていたのだった。

なお、CANCELEDのショートカットが (c@)になっているが、このように@をつけると、メモと同じ要領でそのキーワードにした理由を書くことができるようになる。

GTDぽい運用

GTDというのはGetting Things Doneの略で、まあ仕事術のようなものです(15分で分かるGTD – 仕事を成し遂げる技術の実用的ガイド)。Org modeが好きな人にはGTDが好きな人も多いようで、「Org mode GTD」などで検索すると佃煮にするほど多くのページが出てくる。

私の運用はGTDごっこというか、ごくシンプルなもので、

  1. TODOを思いついたらとりあえず C-c c t で記録する。Orgディレクトリのgtd.orgの * INBOX という見出しの下に保存される。

  2. 一日の終わりにでもgtd.orgを見返し、 複数のTODOをまとめてプロジェクトにしたり、C-c C-t で、他人のアクションを待っているTODOはWAITINGに、当面やるつもりはないがそのうちやりたいことはSOMEDAYに変えておく。

  3. あらかじめ gtd.orgに* Projects* Waiting* Someday という見出しを作っておき、それぞれrefileする。 一つずつ C-c C-w で=refileしてもよいし、TODOやらWAITINGやらSOMEDAYやら大量の見出しが入り混じっているのであれば、M-x org-sort でtodo[o]rderのoを選ぶと、たぶんキーワードごとに並べ替えられるので、あとはカット&ペーストで一度に移してやればよいと思う。

といった具合である。こうするとgtd.orgは、おそらく


* Inbox
** DONE ゴミを出す
   CLOSED: [2018-08-27 月 00:15]
** TODO 花に水をやる

* Projects
** TODO 本を書く [33%]
*** DONE 第1章を書く 
*** TODO 第2章を書く 
*** TODO 第3章を書く 

* Waiting
** WAITING 原稿の件を佐藤さんに連絡 ←これは佐藤さんからの連絡を待っているということ
   <2018-08-27 月> ←こちらから連絡した日時をタイムスタンプで記録しておくと便利

* Someday
** SOMEDAY 世界を制服する
*** TODO 超兵器を開発する
*** TODO 日本を制服する
*** TODO その他を制服する

こんな感じになるんじゃないでしょうかねえ。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください