TechFULの中の人

TechFULスタッフ・エンジニアによる技術ブログ。IT関連のことやTechFULコーディングバトルの超難問の深掘り・解説などを紹介

コマンドラインでTODO管理【Taskwarrior】

TechFUL でアルバイトをしている中村です。

TODO を管理するためのツールは数多くの種類があります。
人それぞれに TODO 管理ツールの好みがあるでしょう。
本記事ではコマンドラインで TODO 管理ができる Taskwarrior を紹介します。

Taskwarriorのデモ
Taskwarriorのデモ (タスク内容はあくまでも例です)

Taskwarrior の概要

Taskwarrior はコマンドラインで TODO リストを管理するためのフリーのオープンソースソフトウェアです。 公式サイト (https://taskwarrior.org/) では以下のように説明されています:

Taskwarrior is Free and Open Source Software that manages your TODO list from the command line. It is flexible, fast, and unobtrusive. It does its job then gets out of your way.

Taskwarrior は Linux または Mac OS で動作します。 Windows の場合は WSL 上で使用できます。

なお Taskwarrior は2021年8月現在も GitHub で活発に開発が続けられており、スター数は 2k にのぼっています。

github.com

Taskwarrior でできること

Taskwarrior を使うと以下のようなことができます (具体的な使い方は後述) :

  • TODO の追加・更新・削除・検索
  • TODO のメタ情報の設定
    • 期限
    • 優先度
    • タグ
    • プロジェクト (タスクが属するカテゴリのようなもの)
  • 繰り返しタスクの設定 (毎週月曜日など)
  • バーンダウンチャートやタスクの消化率等の統計情報の表示

Taskwarrior のみではできないこと

Taskwarrior 単体では以下のようなことはできません:

  • 期日が迫ったら通知を送る
  • GTDポモドーロテクニックといった特定のワークフローに従ったタスク管理
  • GUI や TUI での操作
  • GitHubGoogle カレンダーといった外部サービスとの連携

上述の事項は Taskwarrior を利用した別のツールによって実現できるかもしれません。 そのようなツールの一覧は https://taskwarrior.org/tools/ で確認できます。

使い方

インストール

前述のように Taskwarrior は Linux または Mac OS で動作します (Windows の場合は WSL で動作するでしょう)。

各種 OS・ディストリビューション 別のインストールコマンドは https://taskwarrior.org/download/ から確認できます。

Ubuntu では下記のコマンドでインストールできます:

sudo apt-get install taskwarrior

私は Arch Linux を使用しているので下記のコマンドでインストールしました:

sudo pacman -S task

Taskwarrior のコマンドは task です (Ubuntu と Arch Linux で確認)。
以降の説明では Taskwarrior のバージョンは 2.5.3 であるものとします。

$ task --version
2.5.3

簡単な使用例

タスクの情報はデフォルトで ~/.task/ ディレクトリに保存されるので、 task コマンドでカレントディレクトリを気にする必要はありません。

タスクの追加は task add で行います。 追加の引数 due: で期限の設定も可能です。

$ task add 読書
$ task add 期末レポート due:today
$ task add 勉強会資料の作成 due:2021-09-06

※ ↑入力したタスクはあくまでも例です。

未消化タスクの一覧は task lstask list 、または task で可能です。 listls に比べて表示される情報の量が多いです。他にも task longtask info などがあります。

task ls の結果
task ls の結果

task list の結果
task list の結果

ID はタスクを一意に識別する整数値、Age はタスクを作成してからの経過時間、 Descriptionコマンドラインで入力したタスクの説明、Urg は緊急度 (Urgency) です。 締め切りが近いタスクは緊急度 Urg が高く計算され、赤く表示されていますね。

期末レポート課題を完了したら、ID の指定とともに done です。

task 2 done

完了したタスクは普通の一覧では表示されません。 task completedtask all などで完了したタスクを確認できます。

done したあとの task ls の結果
done したあとの task ls の結果

task completed の結果
task completed の結果

1日ごとの消化済みタスク数・未消化タスク数は burndown.daily で表示できます。
週ごとなら burndown.weekly 、月ごとなら burndown.monthly です。

task burndown.daily の結果
task burndown.daily の結果 (先ほどの例とは別で、普段の私が使っている様子です)

summary を使えば完了率を表示できます。 ghistory.{daily|weekly|monthly} もタスク消化の履歴の可視化に役立つかもしれません。

task summary と task ghistory.daily の結果
task summary と task ghistory.daily の結果

もう少し詳しい使い方

task コマンドの書式

完全な詳細については task の man ページや 公式サイトのドキュメント を 参照してください。

task コマンドの書式は下記のようになっています (参考: https://taskwarrior.org/docs/syntax.html )。

task [<filter>] [<command>] [<modifications>|<miscellaneous>]

上記の書式において、 [] で囲まれた部分は非必須の項目です。
非必須の項目を全て省略して task のみを実行すると、デフォルトでは task next を実行します。 task next は Taskwarrior が算出した緊急度 Urg が大きい方から順にテーブル形式で表示します。

task

task のデフォルトコマンドは ~/.taskrc で上書きできます (詳細は man 5 taskrc) 。

<modifications> の例

<modifications> はタスクのメタ情報を変更するための引数です。
例えば先ほどの task add 期末レポート due:today では due:today<modifications> に該当します。

<modifications> を指定する例をいくつか示します:

# 新規タスクに 'techful' タグ と 'shojin' タグを指定する場合
task add TechFUL PROの問題を解く +techful +shojin
 
# 新規タスクを hobby プロジェクトに属させる場合
task add if式の構文解析 project:hobby
task add if式の構文解析 proj:hobby    # 'pro' まで省略可
 
# 新規タスクの優先度を Medium に設定する場合 (優先度は L,M,H が選択可)
task add Neovim組み込みのLSPクライアントへ移行 priority:M
task add Neovim組み込みのLSPクライアントへ移行 pri:M  # 'pri' まで省略可
 
# 既存の ID=3 のタスクの締め切りを1日遅らせ、優先度を Low に更新する場合
task 3 modify due:due+1day priority:L

プロジェクトとタグの違いについてですが、タスクをプロジェクトで分類すると task summary コマンドはプロジェクトごとの完了率を表示してくれます。 そのようなコマンドの恩恵を享受するにはタグよりもプロジェクトで分類するほうがいいと思います。

個人的には Taskwarrior の CLI という手軽さが魅力に感じているので、タグ付けや優先度付けのような煩わしいことはしていません。 締め切りとプロジェクトは設定しています。

<filter> の例

<filter> はタスクを絞り込むための引数です。 例えば task 2 done では 2<filter> に該当します (ID=2 で絞り込む)。

<filter> を指定する例をいくつか示します:

# 'techful' タグがついたタスクのみを task のデフォルトコマンドで表示
task +techful
 
# ID=1,2,...10 と ID=99 のタスクについて list コマンドで表示
task 1-10 99 list
 
# hobbyプロジェクトに属する かつ 'nvim タグがついてないタスクを一括で完了
task proj:hobby -nvim done

その他の操作

タスクを完了するのではなく削除したい場合は delete を使えばよいです。

task 1 delete

タスクを開始して 現在進行状態 (active) にするには start を、開始したタスクを中断するには stop を使えばよいです。 また、task active コマンドで active 状態のタスクのみを表示できます。

task 1 strt
task active
task 1 stop

先ほどの <modifications> でも少し触れましたが、タスクを編集するには modify が使えます。

# ID=1 のタスクの文章を xxxx に変更し、締め切りを1週間早める
task 1 modify xxxx due:due-1week
 
# ID=1 のタスクの文章の全ての xx を yy に置換する
task 1 modify /xx/yy/g

日付の指定は ISO-8601 形式や yyyy-mm-ddHH:MM のほか、 todaytomorrow, friday, august といった文字列での指定や +12h30m (+12時間30分) や -1w (-1週間) といった演算も可能です。
task calc コマンドで演算結果を確認することができます。

# today は今日の00:00:00になる
$ task calc today
2021-08-31T00:00:00
 
# 今日の23:59:59
$ task calc today+1d-1s
2021-08-30T23:59:59
 
# 今日以降で最も近い金曜日
$ task calc fri
2021-09-03T00:00:00

おわりに

私はいくつかのタスク管理ツールを試したことがありますが、ほとんどが三日坊主に終わってしまいました。
Taskwarrior は個人的には GUI よりも手軽に感じ、お気に入りになりました。

TODO 管理ツールに限らず、CLI が好きな人もいれば GUI が好きな人もいるでしょう。
本記事が TODO 管理ツールを選択する上での参考になれば幸いです。

参考文献