自分専用のtodo管理ツールを書いた

最近、プライベートでの開発したいことや勉強したいことが増えてきたので、それらを管理するツールを書いた。

naoty/todo

使い方

$ todo add Go言語を勉強する
$ todo add todo管理ツールを書く
$ todo add ブログ記事を書く
$ todo list
[] 001: Go言語を勉強する
[] 002: todo管理ツールを書く
[] 003: ブログ記事を書く
$ todo done 1
$ todo done 2
[x] 001: Go言語を勉強する
[x] 002: todo管理ツールを書く
[] 003: ブログ記事を書く
$ todo clear
$ todo list
[] 001: ブログ記事を書く

その他、todoの削除や移動などができる(詳細はGitHubのページを参照)。個人的に便利だと思っている機能がtodoをmarkdownのtask list形式で出力する機能だ。

$ todo list -m
- [x] Go言語を勉強する
- [x] todo管理ツールを書く
- [] ブログ記事を書く

これを使ってQiita:Teamの日報に今日やったこと、やれなかったことを簡単にコピペできる。一日の作業フローはこうだ。

  1. todo listで残タスクを確認する。
  2. 適宜todo addでタスクを追加したり、todo moveで順番を入れ替えて優先度を調整する。
  3. 完了したらtodo doneでタスクを完了させる。
  4. 一日の終わりにtodo list -mで作業内容を出力してQiita:Teamにコピペして、感想などを付け加えて日報として公開する。
  5. todo clearで完了したタスクを消去する。

tips

  • todoはLTSV形式のファイルとして保存され、ファイルのパスはTODO_PATHという環境変数で指定できる(デフォルトはHOME)。なので、環境変数でDropbox内のパスを指定すれば簡単にtodoを同期できる。
  • zimbatm/direnvを使うと、プロジェクトルートにcdしたときにTODO_PATHを書き換えられるのでプロジェクトのスコープのtodoを別に管理できる。

実装

最近はGoが気に入っているので、コマンドラインツールを作るときはすべてGoで書いている。CLIを作る際のフレームワークはいくつかあるようだが、一番Starが多そうだったcodegangsta/cliを使っている。標準の出力とmarkdown形式の出力の切り替えを実装する際にinterfaceを使ってみた。ファイルの入出力にはioutilパッケージが手っ取り早かった。ファイルの扱いを通じてio.Writerインターフェイスについても理解が深まった。

done

$ todo done 1