♨️

emacs org-modeで独自実装を組み合わせてタスクシュート風タスク管理を行う

に公開

はじめに

タスク管理が苦手すぎて、タスクシュート協会の「先送りせずにすぐやる人に変わる
100日チャレンジ」というものに参加しました。 https://blog.taskchute.cloud/tcc-100-days/

幸いにも講師の方からは好きなツールを使って良いと伺っていましたので、emacs内に自作システムを構築していきました。
本記事では、emacsでタスクシュートを行う自作システム(もちろん非公式)を紹介します。

emacsであることの良さ

私は、コーディングや文書作成にemacsを使うので、タスク管理もemacs内で完結していると助かります。
その他、タスクやノートをローカルのテキストファイル(org)に保存できるというのも、emacsの内にタスク管理を構築したメリットだと個人的には思っています。

クラウドでないので仕事の情報を書き込めるとか、テキストファイルなので意図しない挙動が起こりにくいとか、テキストなのでAIに入れやすいとか、org形式は階層ごとの折り畳みがデフォルトでできる、そのあたりがemacsのメリットです。

公式ツールの存在

ただ、そのようなこだわりがない人は、タスクシュート協会の方々のノウハウがつまった公式のもの: TCC2やnotionテンプレート、タスクシュート手帳などを使う方が良いと思われます。

以下のタスクシュートに関する記述は私の理解に基づきますので、不正確な内容も含まれる可能性があることにご注意ください

タスクの登録

まず、タスクシュートでは朝その日のタスクを直感でプランしていきます。

毎朝その日に行うタスクを全部書いても良いのですが、
それだと大変なので毎日行うようなタスクはルーチンとしてファイルに書いておきます。
(このルーチンファイルは肥大化しないように、実態に合わせて適宜メンテナンスします。)

それで、ルーチンタスクを表示してから、そこから削ったり、今日やることを追加していきます。
気分が乗らないとか忙しい日はルーチンタスクから消して良いです。

emacsでのやり方は、まず、M-x org-capture または C-c cでorg-captureを実行します。

この画面でdを押します。


そうすると次のようなbufferが生成されます。

ここから今日やることを追加・削除します。

Capture bufferを見ても分かるように、
階層1のitemに日付、階層2のitemにタスク関連とセクションが書いてあります。
タスク関連の下には、タスクの振り返りのメモや、明日やっておきたいなと思うことをメモします。

タスクシュートではいつかやるメモはやめた方が良いと言われています。未来に期待しすぎるとパンクしたり明日にはまた事情が変わるためです。なので、明日やることをあまり詰め込んで書かない方が良いです。自分は明日の家事をどこやる、とかを忘れないようにメモしています。

セクションは4時間間隔くらいで区切っておいて、その下の階層のitemにセクションごとのタスクを記載します。

このルーチンファイルは適当な場所に置いておき、org-captureで呼び出します。

私の場合は、~/.emacs.d/assets/org-templates/routine.orgに置いています。

C-c C-cでCapture bufferを終了すると、タスクが ~/org/tasks.org
の先頭に追加されます。

このように毎日一歩ずつタスクを記録していきます。 [4/9]等その日の達成率が分かります。

ここまでに関連したorg-captureの設定は以下です。

(leaf org-capture
    :config
    (setq org-directory "~/org")
    (setq org-daily-tasks-file (format "%s/tasks.org" org-directory))
    (global-set-key (kbd "\C-cc") 'org-capture)
    :custom
    (org-capture-templates .
    '(("d" "daily TODO" entry (file org-daily-tasks-file) "%[~/.emacs.d/assets/org-templates/routine.org]" :prepend t))))

また、routine.orgは以下のようなものを使っています。

* %<%Y/%m/%d (%a)> [/]
:PROPERTIES:
:COOKIE_DATA: todo recursive
:END:
#+BEGIN: columnview :hlines 3
#+END:
** タスク関連
*** タスク振り返り
%<%Y/%m/%d (%a)> %(let ((start-date "2025-01-11")
                        (today (format-time-string "%Y-%m-%d")))
                      (format "%d日目の振り返り"
                              (days-between-dates start-date today)))

タスク: , 実行: , 先送り: 

*** 明日のタスク案

** セクション1 5:00-8:00
*** TODO 朝食
:LOGBOOK:
:END:

*** TODO ジョギング
:PROPERTIES:
:Effort:   35
:END:
:LOGBOOK:
:END:



** セクション2 8:00-12:00
*** TODO タスク書き出し
:LOGBOOK:
:END:

** セクション3 12:00-16:00
%(if (or (member (calendar-day-of-week (calendar-current-date)) '(0 6))
         (calendar-check-holidays (calendar-current-date)))
     "*** TODO 作り置きを作る")

(以下省略)

【補足】org-agendaを使わない理由

最初org-agendaを使った仕組みを考えていましたが、毎日自分でタスクを書き出すタスクシュートとは合わないと思って使っていません。

異なるファイルに書いたTODOを集約するorg-agendaとは逆の発想です。
こちらの方がタスクシュート的なタスクマネジメントはやりやすかったです。

タスクの記録

タスクシュートでは、タスクに手を付けたら終わっていなくても完了とします。
タスクを終わらせることよりも、毎日少しずつ手をつけることに注力し、タスクを安定して進めたり、早めの着手で他人からのフィードバックをもらいやすくすることを狙っています。

では、emacsでの動きは以下です。
作成したタスクは、column-viewを使うと見やすくなります。 M-x column-view
または C-c C-x C-c を実行すると以下のような表形式の見た目になります。
最初はきれいに見えないかもしれないですが、Shift-Tabを何回か押していると、以下の画像のようにcolumn-viewだけが残った状態にすることができます。
(columnは独自に設定しており、それについては後のorg-columns-default-formatで設定しています)

ここからタスクを実行して終了すると以下のような画面になります。
41行目のタスクが完了して、時間が表示されています。

C-c C-x C-iでタスクを開始し、C-c C-tでタスクを終了します。
この過程でタスクの開始・終了時間が記されます。
反映されない場合はgを押すと、反映されたりします。

タグ(proj列)や見積もり時間(estim列)はeを押して修正できます。

一つ残念なのは、column-viewだと各列の値は編集できても、itemを消したり追加したり、場所を移動することができないことです。
(もしやり方をご存知でしたら教えてください)
タスクを追加したり、削除したり、異なるセクションに移動させるときは、
一度 q を押してcolumn-viewを解除する必要があることに注意してください。

ここまでに関連したemacs設定は以下です。

(leaf revita
  :el-get "yamanogotoshi/revita"
  :require t
  :hook
  (kill-emacs-hook . revita-save-project-file-alist)
  (org-after-todo-state-change-hook . revita-org-add-logbook-if-missing)
  (org-clock-in-hook . revita-org-update-start-time)
  (org-clock-out-hook . revita-org-update-end-time)
  :bind
  ("C-c t" . (lambda () 
               (interactive)
               (find-file "~/org/tasks.org")))
  ("C-c o" . revita-open-project-file)
  ("C-c p" . revita-insert-project-link)
  :setq
  (org-columns-default-format . "%5TODO(state) %10TAGS(proj) %25ITEM(task) %Effort(estim){:} %CLOCKSUM(clock) %START_TIME(start) %END_TIME(end)"))

ここで自作パッケージrevita.elが出てきます。
https://github.com/yamanogotoshi/revita で公開しています。

org-columns-default-formatで、このカラムを設定しています。
また、:hookでいろいろ設定していますが、これによりcolumn-viewでタスクの開始・終了時刻を計測できるようにしています。
また、:bindでは

  • C-c t で ~/org/tasks.orgにすぐに飛べるようにしています。
  • C-c o, C-c p はタグに紐付いたプロジェクトノートの設定で次の章で説明します。

ちなみに、revita.elはrevitalizeという単語由来です。
サウナで整うを英単語を調べたらrevitalizeが出てきて、タスクを整えるという気持ちでつけました。

プロジェクトノートとの連携

ちょっとしたメモは各itemに書いても良いです。これは表形式のcolumn-viewでも該当itemの畳み込みを解除してできます。この表形式でも見れるし、アウトライナーとしても使えるのがorg-modeの良いところです

ただ、一連のプロジェクトについては、情報を一箇所にまとめた方が便利です。
そのため、この自作emacsシステムでは、itemのタグに紐付いたorgファイルに飛べるようにしています。
各itemにカーソルを当てて、 C-c o (revita-open-project-file)
をすると、そのタグに紐づくプロジェクトノートに飛べます。

【補足】org-agendaのように、タスクリストから、プロジェクトノートに飛べるようにする機能をrevita.elで実現しました。

以下のように対応したプロジェクトノートに飛んでそこに情報を集約させます。
ただし、時間の記録はtasks.orgで行います。

C-c o でプロジェクトノートに飛んでファイルを編集し、C-c tでtasks.orgに戻っています。

プロジェクトノートはどのように書いても良いですが、自分は

* memo
* log
* task

の3つの大項目を作り、その下に情報を書いていっています。memoは固定の情報、taskはこれからやる予定のこと、logには終わったtaskを移します。

タグとプロジェクトノートの関係は、以下のようにcustom-set-variablesに保存されるようにしています。 以下のalistにないタグのファイルを開くときに、revita.elがファイルへのパスを聞いて、このalistに追加してくれます。また、ファイルやディレクトリが無い場合は自動で作るようにしています。

(custom-set-variables
 '(revita-project-file-alist
   '(("生活" . "~/work/2025/生活/生活.org")
     ("aider" . "~/work/2025/aider/aider.org")
     ("leetcode" . "~/work/2025/leetcode/leetcode.org")
     ("emacs" . "~/work/2025/emacs/emacs.org")
     ("revita" . "~/work/2025/revita/revita.org"))))

そのため、もしこの関係を変える必要がある場合は、 M-x customize-variable
Return revita-project-file-alist で編集してください。

また、一度タグとファイルの関係が作られたら、item以外にカーソルがあっても C-c o でプロジェクトファイルに飛べます。これも便利ポイントだと思います。

C-c p (revita-insert-project-link) でそのitem内にプロジェクトノートへのリンクを明示的に貼れますが、使ってない機能なのでそのうち消すかもしれません。

最後に

タスクシュート考案者の大橋さんがjMatsuzaki氏のラジオで、いろんな人のタスクシュートを見たいとおっしゃっていたので、公開しても大丈夫かとは思っています。

タスクシュートの触りを学んだだけですが、タスクを心地よいと感じられる適度な量をプランして実行するというのは、生活の満足度や質が上がると感じました。

まず、家事を前よりコツコツやれるようになったのと、長期的なプロジェクトにも取り組めるようになってきました。
例えば、このemacsでの自作タスクシュートシステムの構築や、kaggleへの参加など。

仕事への適用はプライベートへの適用よりも難しいと感じましたが、タスクの核心に少しでも手を付けたらタスクを完了とするタスクシュートの考え方で進められているものもあります。

本記事でのemacsでのタスク管理方法については、https://horimisli.me/entry/journaling-2023/
この記事の方やタスクシュートの講師の方、偉大な先人に感謝です。

本記事でのやり方について、もっと良いやり方があればぜひご提案ください。

以上です。お読みいただきありがとうございました。

追記

emacs-jp slackで紹介したら take 氏に以下を紹介してもらえました。
https://qiita.com/takaxp/items/a5a3383d7358c58240d0
heading(この記事でitemと書いた)に対して、org speed commandで楽に操作できるみたいです。

Discussion