第182回 で紹介したTaskwarriorは、ターミナル上で動作する、BTSやチケットシステムに似たタスク管理ツールです。テキストベースのデータ構造とコマンドにより、非常に柔軟なカスタマイズが行えるのがポイントです。今回はそうした、Taskwarriorをより「使いこなす」ためのテクニックを紹介します。
Dropbox/Ubuntu Oneと連携する
Taskwarriorのようなタスク管理ツールを利用する場合、もっとも重要なのは「利用するためのコストを下げる」ことです。こうしたタスク管理を行うには、「 何か思いついたら即座にタスク登録、手持ちぶさたになったらタスク一覧の確認、一日の仕事の始めと終わりにタスクを確認……」と、とにかくこまめにタスクを確認する必要がありますから、確認のための操作はできるだけ手軽である必要があります。
一方で、Taskwarriorのデータディレクトリは、原則としてローカルシステムの~/.tash/に配置することが前提です。これは言い換えると、複数のマシンでTaskwarriorを使いたければ、データ同期を何らかの方法で行う必要がある、ということです[1] 。こうした作業は非常に面倒なので、早晩やらなくなることが予想されます。「 一日の仕事の始めにTaskwarriorでタスクを一覧する」という目標の危機です。
こうした問題に対しては、「 なんらかの方法でデータディレクトリを自動的に同期すればいい」というのが簡単な解です。データの自動同期となれば、DropboxやUbuntu Oneのようなオンラインストレージサービスの出番です。
しかしながら、Taskwarriorは原則として~/.task/にデータ領域があるので、このままではDropboxやUbuntu Oneの同期対象にすることができません。これらのストレージサービスでは、~/Dropboxや~/Ubuntu Oneといったディレクトリが同期対象となっているからです。このような場合、シンボリックリンクを作成してしまうことで対処できることがほとんどです[2] 。
データを自動的に同期したい場合、次のような操作を行いましょう。いずれもDropbox・Ubuntu Oneの同期のための初期設定は完了していることが前提です。
Dropboxの場合:
データ保存用ディレクトリを作成:
$ mkdir ~/Dropbox/taskwarrior
既存のデータを作成したディレクトリへ移動:
$ mv ~/.task ~/Dropbox/taskwarrior
シンボリックリンクの作成:
$ ln -s ~/Dropbox/taskwarrior/.task ./
Ubuntu Oneの場合:
データ保存用ディレクトリを作成:
$ mkdir ~/Ubuntu One/taskwarrior
既存のデータを作成したディレクトリへ移動:
$ mv ~/.task ~/Ubuntu One/taskwarrior
シンボリックリンクの作成:
$ ln -s ~/Ubuntu One/taskwarrior/.task ./
これにより、Taskwarriorのタスクアイテムが自動的にDropbox・Ubuntu One経由で同期されるようになります。設定も同期したい場合は、さらに次の操作を行ってください。
$ mv .taskrc .task/
$ ln -s .task/.taskrc ./
タスク一覧に色をつける
Taskwarriorはテキストベースのソフトウェアですが、出力される文字の配色をコントロールできるように、「 テーマ」ファイルが準備されています。
テーマの設定は、~/.taskrcを編集することで行えます。「 include ( テーマファイルのフルパス) 」 ( 「 例:include /usr/share/task/dark-blue-256.theme」 )という形で指定してください(図1 、図2 ) 。利用可能なテーマファイルは、Ubuntu標準のリポジトリから導入した場合は「/usr/share/task/」 、PPAから導入した場合は「/usr/share/doc/task/rc/」 、自分でコンパイルした場合は「/usr/local/share/doc/task/rc/」に存在する、拡張子「.theme」のファイルです。有効なテーマファイルを一覧するには、「 dpkg -L task | grep .theme」を実行してください。
図1 「 include /usr/share/task/dark-green-256.theme」を.taskrcに記述した状態の「task list」出力。
図2 「 include /usr/share/task/dark-blue-256.theme」を記述した状態での「task list」 。配色が変更されていることが分かる。
なお、テーマファイルはテキストベースで列挙した変数に値をセットする形式です。準備されたファイルが気に入らない場合、「 man 5 task-color」を参照してカスタマイズしてみてください。
タスクを整理する
タスクの分量が増えてくると、徐々に「そのままでは管理しきれない」状態に近づいていきます。Taskwarriorの機能を利用することで、タスクを様々な形で整理できます。
プライオリティを指定する
あらゆるタスクには、優先順位があります。たとえば「牛乳が切れているので買ってくる」と「ペットフードが切れているので買ってくる」であれば、たいていの場合は後者の方が重要でしょう。牛乳がなくてもそれなりに対処する方法はありますが、ペットの食事がないのは非常にかわいそうです(冷凍庫にある適当なものを刻んで出す、という対策はあるかもしれませんが……) 。
Taskwarriorでは、H/M/L(High/Middle/Low)の三段階でタスクに優先順位(Priority)をつけることができます。優先順位は、Hが高、Mが中、Lが低です。
操作は、すでに登録されているタスクの属性を変更するために「task 1 pri:H」( ID:1のタスクにプライオリティHをセット)とするか、タスクの登録時点から「task add pri:M ( 登録したいタスク) 」とする、というものです。
複数のタスクを一度に操作する場合は、「 task 1-3 pri:M」などとすることができます。この操作により、ID:1~3までの全タスクに、「 M」の優先順位がセットされます。
$ task 1-3 pri:M
Task 1 "買い物に出かける"
- priority will be set to 'M'.
Proceed with change? (Yes/no/All/quit) A
Modified 3 tasks.
優先度を設定しておけば、task listなどの表示時は、優先度が高いものほど上に表示されるようになり、また、デフォルトの配色テーマではより目立つ色が割り当てられるようになっています。また、「 task list pri:H」などといった操作で、優先度ごとに一覧することもできます。
これにより、「 start」や「done」などの操作を行った場合に、「 You have higher priority tasks.」などといったメッセージが出力されるようになります。このメッセージは、~/.taskrcファイル上で、「 nag=それより大事なタスクがあるんじゃない?」などとすることで任意に設定できます[3] 。
なお、この機能を利用する場合は、「 プライオリティ未指定のタスクを放置しない」ということを心がけるとよいでしょう。優先順位が指定されていないタスクの中に高プライオリティにすべきものが含まれていると、作業計画が無意味になってしまいます。「 task list pri:」を実行することで、プライオリティ未指定のタスクを一覧できます。「 task add "タスクに優先順位をつける(task list pri:)"」という形でタスクを登録しておき、常に目に入るようにしておくのもよいでしょう。
[3] .taskrcを直接設定するかわりに、「 task config nag "それより大事なタスクがあるんじゃない?"」と、「 task config」インターフェースから設定することもできます。
タスクの依存関係を定義する
タスクを管理していくにあたって、「 タスクの依存関係」が問題になることがあります。たとえば、「 買い物に出かける」「 財布を見つける」という二つのタスクがあったとします。この場合、「 買い物に出かける」ためには、それ以前に財布を見つける必要があります。
Taskwarriorでは、「 Dependencies」というパラメータを用いることで、こうした依存関係を管理できます。次のように操作します。
タスクを一覧する:
$ task list
ID Project Pri Due Active Age Description
1 21 secs 財布を見つける
2 16 secs 買い物に出かける
依存関係を指定する:
$ task 2 dep:1
これで、「 買い物に出かける(ID:2) 」というタスクの依存タスクとして、「 財布を見つける(ID:1) 」が設定されました。「 task list」を行うと、ID:2のタスクは別の色で表示されるようになります(図3 ) 。
図3 task list時に、「 ID:2」のタスクの色が変わっている。
何らかの依存関係で「後回し」にされているタスクを表示するには、「 task blocked」コマンドを用います(bで始まるコマンドは他にないので「task b」などと省略できます。図4 ) 。
図4 「 ブロック」されているタスクの一覧表示。
この状態で「財布を見つける」というタスクを完了(task done 1)させることで、この依存関係は終了します。また、「 task 2 dep:-1」とすることで、依存関係を削除することもできます。
なお、依存状態でも強制的な抑止力はありません。「 買い物に出かける」というタスクをstartしたり、doneで閉じたりしようとしても、「 Task 2 is blocked by: 1 財布を見つける」などといった警告が表示されるだけです。
タスクに注釈を行う
タスクとして登録した項目に、いわゆる「仕掛かり」を記録しておく必要が生じることがあります。たとえば、「 ○○というソフトウェアのバグを報告する」といったタスクは、「 本当にバグなのか調べる」「 既存のバグレポートがないか調べる」「 似たような他のソフトウェアではどうなっているか調べる」といった、複数の段階を経ることになります(より分りやすい例としては、「 財布を探す」パターンにおいて、「 机の下を探した」とか「タンスの中を探した」などというケースもありえます) 。
このような場合、細かくタスクを登録して依存関係を定義しても良いのですが、あまりにも細かくタスクを登録してしまうと、どうやっても管理できなくなってしまいます。こうした時に利用するのが「annotate」です。
以下のように、「 task annotate (対象ID) (コメント)」という形式で操作します。annnotateはDescriptionの下に並んで表示されます。タスクの細かな進捗をここに記載していくと便利でしょう。
$ task annotate 3 鞄の中にもない
Annotated 3 with '鞄の中にもない'.
$ task list
ID Project Pri Due Active Age Description
1 M * 1 hr 買い物に出かける
2 M 21 mins タスクに優先順位をつける(task list pri:)
3 44 secs 財布を見つける
8/15/2011 タンスの中
8/15/2011 机の下
8/15/2011 机の引き出し
8/15/2011 鞄の中にもない
3 tasks
タスクにプロジェクト名・タグをつける
Taskwarriorでは、タスクにプロジェクト名や「タグ」をつけて管理することもできます。
操作は優先順位などの場合と同じように、「 task 1 project:(プロジェクト名)」「 task 1 tag:(タグ名)」とするだけです。「 task projects」「 task tags」でそれまでに付けたプロジェクト名やタグを一覧することができますし、「 task list project:(プロジェクト名)」「 task list tag:(タグ名)」とすることで、プロジェクト名やタグを用いたフィルタも可能です。このフィルタは、前回紹介したバーンダウンチャートなどにも適用できます。
zsh上で利用する
Taskwarriorには、zsh用の補完設定も準備されています(注4) 。http://taskwarrior.org/wiki/1/Tab_Completion の記述を参考に、.zshrcに設定を記述してください(次の項の専用シェルの方が便利なため、ここでは詳しくは触れません) 。
なお、利用しているパッケージがPPAのものであれば、次の操作を行っておく必要があります。
$ cd /usr/share/doc/task/scripts/zsh/
$ sudo gunzip _task.gz
専用シェルとして起動する
zshの設定を工夫することで、通常のtask shellの上位版のように使うこともできます。.zshrc内で、次のエイリアスを定義してください。
alias taskshell='ZDOTDIR=~/.task zsh'
さらに、~/.task/.zshrcとして以下の記述を準備します。あとはzsh上で「taskshell」コマンドを実行してください。「 task shell」に近い操作性で、かつ、補完も提供されるシェルが展開されます(図5 ) 。
fpath=($fpath
/usr/share/doc/task/scripts/zsh
/usr/local/share/doc/task/scripts/zsh
/usr/share/zsh/functions/Completion/Unix
)
autoload -Uz compinit && compinit
bindkey '^i' menu-expand-or-complete
bindkey '^[^i' reverse-menu-complete
bindkey '^[i' expand-or-complete
zstyle ':completion:*' group-name
zstyle ':completion:*' verbose yes
zstyle ':completion:*:descriptions' format '%U%B%d%b%u'
PROMPT="task> "
autoload colors
zstyle ':completion:*:*:task:*:arguments' list-colors "=(#b) #([^-]#)*=$color[cyan]=$color[bold];$color[blue]"
zstyle ':completion:*:*:task:*:default' list-colors "=(#b) #([^-]#)*=$color[cyan]=$color[green]"
zstyle ':completion:*:*:task:*:values' list-colors "=(#b) #([^-]#)*=$color[cyan]=$color[bold];$color[red]"
zstyle ':completion:*:*:task:*:commands' list-colors "=(#b) #([^-]#)*=$color[cyan]=$color[yellow]"
alias ed='task edit'
alias ls="task ls"
alias rm="task rm"
alias quit='exit'
for i in active add all annotate append blocked calendar color completed config delete denotate diagnostics done duplicate edit export export.csv export.ical export.yaml ghistory ghistory.annual help history history.annual import info list log long ls merge minimal newest next oldest overdue prepend projects pull push recurring shell show start stats stop summary tags timesheet unblocked undo version waiting; do alias $i="task $i"; done
図5 zshベースのtaskshellコマンド。