タスク管理メソッド todo.txt が面白そう

todo.txt というタスク管理メソッドがあるそうです。何とテキストファイル一つだけで運用するらしいです。ネタではなく、実用的にも使いやすいらしいです。ツールも色々ありますし、GitHub で公開してるのも多いですし、何かと刺激になりそうで……と、気になったので調べてみました。

# 本記事について
todo.txt について調べたことと私の雑感について雑多にまとめています。todo.txt を使用するための具体的手順やツールの導入方法などは取り上げていません。概要や概念の説明だと思っていただければ。

# 対象読者
- 良いタスク管理方法が見つからない方
- Todo リストは試したことがあるけど挫折したという方
- タスク管理はしているが、todo.txt は知らない方
- テキストファイル一つでどうやってタスク管理するの？と興味が湧く方
- タスク管理メソッドを実現するツールを作ってみたい方

# todo.txt とは
タスク管理メソッドの一つ。米 Lifehacker の [Gina Trapani](https://github.com/ginatrapani) 氏が考案した。いわゆる Todo リストの一種だが、`todo.txt` というテキストファイル一つのみで運用するためシンプルで、軽くて、管理もしやすいのが特徴。

テキストエディタを使って手で編集しても良いが、ツールも多数存在する。コマンドラインツールからスマホアプリまで様々。 [Other Todo.txt Projects ・ ginatrapani/todo.txt-cli Wiki](https://github.com/ginatrapani/todo.txt-cli/wiki/Other-Todo.txt-Projects) や [Todo.txt: Future-proof task tracking in a file you control](http://todotxt.com/) が詳しい（英語）。

## 5行でイメージを掴む
- `todo.txt` というテキストファイル一つのみで運用
- 1行に1つの Todo を書く
- Todo は所定フォーマットで書く
- 人間でも読みやすく書きやすい
- ツールでより簡単に、効率的に、効果的に使うことも可能

# 重要なコンセプト
todo.txt を使う上で避けて通れないコンセプトについて。

## 優先度
文字通り Todo の優先度。優先度の高い Todo は優先的に対応するべきなので、todo.txt では優先度の記入を積極的に推奨する。

## プロジェクト
Todo に付与する分類項目（ラベルやらカテゴリやらと呼ばれるもの）。これを付けておけば、後から「指定した項目の付いた Todo のみ取り出す」なんてことが簡単に行える。

実際は「プロジェクト」という名前のとおり、自分が抱える仕事の単位で付けることが多い。

## コンテキスト
Todo に付与する補足情報。具体的には「どこで行うか」「何を用いて行うか」「誰に対して行うか」といった補足情報のこと。これもプロジェクトと同様、付けておけば、後から特定コンテキストの Todo を簡単に取り出せる。

# Todo のフォーマット
Todo のフォーマットについて。

## 基本的なフォーマット

```
1 2-- 3--------- 4--------- 5---------------
x (A) YYYY-MM-DD YYYY-MM-DD TODO DESCRIPTION
```

- (1) 完了マーク
  - 完了なら `x` (小文字のエックス)を記入する
- (2) 優先度
  - `()` の中にアルファベット大文字を1文字記入する
  - `A` が最も優先度が高く、 `Z` が最も低い（A-Zだと多すぎるのでA-Eなど絞ってもよい）
- (3) 完了日
  - この Todo を完了した日付を記入する
  - 省略してもよい
- (4) 追加日
  - この Todo を追加した日付を記入する
  - 省略してもよい
- (5) Todo 内容
  - Todo の内容を記述する
  - 補足情報として以下を書いてもよい
      - プロジェクトは `+ProjectName` と書く
      - コンテキストは `@ContextName` と書く

## 省略可否について
(5) は記入必須（というか書かないと何の Todo かわからない）。

(1)-(4) は省略してもよい。その際スペースは入れずに詰める。

例: 完了マークを省略した場合の正しい書き方

```
(A) YYYY-MM-DD YYYY-MM-DD ティッシュ箱を買う   ← OK
  (A) YYYY-MM-DD YYYY-MM-DD ティッシュ箱を買う ← NG
```

※なおツールによっては、あえては詰めないタイプのものもあるかもしれない（主にツールが保存する内部データの形式など）。

## 完了日なの？追加日なの？
日付フィールドが一つしか書かれていない場合、それが完了日なのか追加日なのかがわからない。

これを解決するには **完了マークの有無** を見る。マークがあれば完了日。マークがなければ追加日。

以下に例を挙げる。

- `(A) 2017-07-12 ティッシュ箱を買う` の正しい読み方
  - :o: この Todo は 2017/07/12 に追加された（まだ完了してない）
  - :x: この Todo は 2017/07/12 に完了した
- `x (A) 2017-07-12 ティッシュ箱を買う` の正しい読み方
  - :o: この Todo は 2017/07/12 に完了した
  - :x: この Todo は 2017/07/12 に追加された（まだ完了してない）

# 記入例
Todo の記入例をいくつか挙げる。

## 最も単純な Todo
- `先方にお礼の電話をする`

最も単純な Todo。

## 優先度

- `(A) 先方にお礼の電話をする`

優先度を追加した例。この Todo は最高優先度であるとわかる。`(A)` と書いておけば、たとえ Todo がたくさん並んでいても、最高優先度の Todo を簡単に見つけることができる。

## プロジェクトとコンテキスト

- `先方にお礼の電話をする @phone`

コンテキスト `@phone` を追加した例。この Todo は電話を使用する Todo だとわかる（あとで `@phone` で検索することで「電話を使用する Todo」を簡単に探せる）。

- `+HogeProj 先方にお礼の電話をする`

プロジェクト `+HogeProj` を追加した例。この Todo は「Hogeプロジェクト」に関する Todo だとわかる（`+HogeProj` で検索すれば「Hoege プロジェクトに関する Todo」を簡単に洗い出せる）。

- `先方にお礼の電話をする @phone +HogeProj`

コンテキストとプロジェクトを混ぜた例。何個混ぜてもいいし、どこに記入してもいい。ただし記入方法は統一した方が 、Todo リスト全体の統一性が取れて見易くなる。

## 追加日

- `2017-07-14 先方にお礼の電話をする`

追加日を追加した例。この Todo は 2017/07/14 に追加されたものだとわかる。

## 完了日と完了マーク

- `x 先方にお礼の電話をする`

先頭に完了マークを付けた例。この Todo は既に完了したのだとわかる。

- `x 2017-07-14 先方にお礼の電話をする`

完了日も書いた例。この Todo は 2017/07/14 に完了したのだとわかる。「2017/07/14 に追加した Todo を完了した」という意味 **ではない** ことに注意。

- `x 2017-07-14 2017-07-14 先方にお礼の電話をする`

完了日と追加日を書いた例。この Todo は 2017/07/14 に追加され、その日のうちに完了したのだとわかる。

## 複雑な Todo

- `(A) 2017-07-14 先方にお礼の電話をする @phone +HogeProj`

この Todo は 2017/07/14 に追加されたもので、優先度は非常に高くて、Hogeプロジェクトに関するもので、かつ電話を使うものだとわかる。

- `x (A) 2017-07-16 2017-07-14 先方にお礼の電話をする @phone +HogeProj`

上記 Todo を 2017/07/16 に完了させたのだとわかる。

# どんなツールが存在する？
[Todo.txt: Future-proof task tracking in a file you control](http://todotxt.com/) の内容を中心に、色んな観点でまとめてみる。

## プラットフォーム
- デスクトップアプリ
- Web アプリ
- プラグイン・アドオン
  - Vim
  - Sublime Text
  - Thunderbird
  - Google Chrome
- モバイル
  - Android
  - Windows Phone
- 開発者用ツール
  - todo.txt パース用ライブラリ

## UI
- CLI(コマンドラインツール)
- GUI

## todo.txt の保存先
- ツールのインストールディレクトリ
- 任意のディレクトリ
- Dropbox
- HTML5 Local Storage

# Q&A
主に個人的に疑問に思ったこととその対処方法（調べたこともあれば自分自身に言い聞かせたこともある）を、Q&A 形式で列挙した。

## Q: 完了日や追加日は書かないといけませんか？
別に書かなくても構いませんが、書いておけば以下のメリットがあります。

- **ソートした時に日付順でキレイに並んでくれるので見易い**
- いつ追加したのかがわかる
- いつ完了したのかがわかる
- 追加してから完了するまでの日数がわかる

## Q: ソートさせるとはどういうことですか？
todo.txt に対して行単位で昇順あるいは降順に並び替えるということです。Todo のフォーマットが適切に定めてあれば、並び替えるだけで見易く並んでくれます。

例を挙げます。以下のような todo.txt があったとします。

```
x (A) とても重要なTodo
(B) 割重要なTodo
優先度未記入だけど別に優先度は高くないTodo
```

これを昇順で並び替えても、

```
(B) 割重要なTodo
x (A) とても重要なTodo
優先度未記入だけど別に優先度は高くないTodo
```

となってしまい、並び順に意味が見られず見辛いです。上記はたった3件ですが、実際に運用すると何十件、何百件にもなります。それだけの Todo がでたらめに並んでいたら、もはや見る気も失せるでしょう。

では次に、書き方を少し工夫して、**未記入部分にはスペースを入れる** というルールで運用してみます。冒頭の例は以下のようになります。

```
x (A) とても重要なTodo
  (B) 割重要なTodo
      優先度未記入だけど別に優先度は高くないTodo
```

これをソートすると、以下のようになります。

```
      優先度未記入だけど別に優先度は高くないTodo
  (B) 割重要なTodo
x (A) とても重要なTodo
```

これなら **未完了の Todo が上に来る** ので見易いと思います。（実際は優先度未記入のTodoが更に上に来ちゃってますが、それは「いいから優先度を記入しろ」という合図だ、と捉えるなどすればわかりやすいでしょう）。

## Q: どのツールもいまいち馴染めないのですが……
まずツールとして CLI と GUI があります。CLI が馴染めなかった方は GUI ツールを、GUI が馴染めなかった方は CLI ツールを使ってみましょう。

それでもダメなら、使い慣れたテキストエディタで **todo.txt を直接編集する** やり方はいかがでしょうか。

もっとも直接編集だと日付入力、ソート（各行を並び替えて見易く表示する）、完了記入など各種操作が面倒ですが、そこはエディタの機能を活用するなり、スクリプトを自製して呼び出すようにするなり、工夫次第でどうにでもなります。特に後者はプログラミングスキルがないと難しいでしょうが、できる方なら楽しいトライアルになるのではないでしょうか。

## Q: プロジェクトやコンテキストとして何を書けば良いのですか？
**自分にとって** ごく自然に、素早く入力できる言葉を選ぶとよいでしょう。無理にプロジェクトやコンテキストの一覧をひねり出したところで、どうせ形骸化するか、いちいち入力する度に一覧から選択肢を探してコピペするのが面倒くさくて結局やめちゃう、なんてことなりかねません。

そもそも無理に書く必要もありません。

## Q: todo.txt フォーマットの厳密な仕様（たとえばRFCみたいなもの）はないのですか？
公式仕様は [The Todo.txt Format ・ ginatrapani/todo.txt-cli Wiki](https://github.com/ginatrapani/todo.txt-cli/wiki/The-Todo.txt-Format) ですが、そこまで厳密ではありません。というより、ある程度自由に書くことが想定されています。

たとえば以下の二つは、どちらも同じ Todo を表現しています。

- `先方にお礼の電話をする`
- `(A) 2017-07-14 先方にお礼の電話をする @phone +HogeProj`

todo.txt を直接編集する場合は上のシンプルな書き方を使うこともあるでしょう。逆に、ツールが実際に todo.txt に書き込むフォーマットとなると、下のように全情報を盛り込む（かつ未入力部分はスペースで空けるなど）ことになるでしょう。

## Q: todo.txt の行数が増えて見通しが悪くなりました。何か良い方法はありますか？
- 消化した Todo を別ファイルに待避する
- 区切り用の Todo を設ける
  - 例: Todo 内容として `--------------------------------` を書いた行
- プロジェクトやコンテキストの記入位置を決める
  - 例: プロジェクトは Todo 内容の先頭に書く
  - こうすれば先頭付近にプロジェクトが並ぶので、全体を読む時にプロジェクト基点で Todo を探しやすい

# おわりに
todo.txt というタスク管理メソッドについて、勉強したことをまとめてみました。何かの参考になれば幸いです。

# 参考
- [ginatrapani/todo.txt-cli](https://github.com/ginatrapani/todo.txt-cli)
- [The Todo.txt Format ・ ginatrapani/todo.txt-cli Wiki](https://github.com/ginatrapani/todo.txt-cli/wiki/The-Todo.txt-Format)
- [タスク管理メソッド「Todo.txt」について勉強してみた | 豆腐メンタルは崩れない](https://wbtmiu.herokuapp.com/2014/09/21/oWpZGaCLPI/)
- [どのツールもしっくりこない人へ、『Todo.txt』によるタスクマネジメントのススメ | ライフハッカー［日本版］](https://www.lifehacker.jp/2011/02/110128todo_txt.html)
- [シンプルなタスク管理アプリ「Todo.txt」はクールで使いやすい - Kaos Chronicle.com](http://kaoschronicle.com/post-861)