invitation to org-agenda
Table of Contents
Last modified: 20241031T1143+0900
emacsに標準装備されているorg-modeは、emacsでアウトラインモードを実現するツールですが、それだけでなく、予定やプロジェクトの管理、TeXやhtmlへのエクスポートなど、テキストを扱う人にとって便利な非常に多くの機能が備わっています。
1. org-agendaとは
org-agendaは、org-modeに備わっているスケジュールを表示し管理する一群の機能です。
2. org-agenda-file
検索対象とするファイルは、この変数の中にリストで指定します。ディレクトリ名で終わっている場合は、その下のすべてのorgファイルが対象となります。たとえば、
(setq org-agenda-file '("~/org/work/" "~/org/home/" "~/org/2022agenda.org"))
は、 ~/org/work/
と ~/org/home/
以下のすべてのorgファイル、それに加えて、 ~/org/2022agenda.org
というファイルを対象にします。
cf. 11.1 Agenda Files (The Org Manualから)
3. 表示
検索されたスケジュールやTODOを表示するためには、以下のemacsのコマンドを打ち込みます。
M-x org-agenda
標準で、これは C-c a
に割り当てられています。 Press key for an agenda command:
というウインドウが表示されるので、そこで a
を押すと、カレンダーのような一覧表示が現れます。これは C-c a a
と入力しても同じです。
3.1. 単純な予定
org-agenda-fileに含まれるファイルの中で、特定のヘッダの下に日付を書くと、org-agendaはそれを探し出して、 C-c a a
で表示してくれます。確定していないスケジュールの扱い方は、未定の予定で提案します。
たとえば、
* フェスに行く <2022-11-06 Sun 17:00>
と書いておくと、 C-c a a
のカレンダー表示の中に、その予定が表示されます。
3.2. 締切
* フェスの申込をする DEADLINE: <2022-10-30 Sun 17:00>
このように、日付の前に DEADLINE:
を付けると、それは締切と解釈され、標準では2週間前から警告メッセージが出ます。
* 連休の計画 DEADLINE: <2022-4-30 -2m>
このように日付のあとに明示的に警告期間を指定することもできます。この場合には、2ヶ月前からメッセージが出ます。
3.3. スケジュール
* フェスに行く服を買いに行く SCHEDULED: <2022-11-05 Sat 13:00>
org-agendaのタスク管理で優れていることのひとつは、あるタスクについて、締切とスケジュールの二つを指定できることです。とくに、「スケジュールを決める」という点が重要です。たんに締切を意識するだけでなく、その他の仕事との関係で、いつそれをするかを考えることで、計画的なタスク管理が実現します。
たとえば、11月5日が締切だけれども、その頃は忙しいので二日前の3日に申込をする計画を立てた場合には、次のように書いておきます。
* フェスの申込をする SCHEDULED: <2023-11-03 Fri> DEADLINE: <2023-11-05 Sun>
スケジュールに警告期間を指定した場合には、スケジュールした日が過ぎた後に、何日間、そのスケジュールを表示するかを指定したことになります。
* フェスの申込をする SCHEDULED: <2023-11-01 -3d>
こうすると、スケジュールした日が過ぎても、その後3日間は、「忘れてないか?」と言っているかのように表示が出ます。 cf. 8.3 Deadlines and Scheduling
4. 入力
4.1. 日付入力のショートカット
これらの日付を手作業で入力するのは面倒ですし、誤入力も起きやすいので、このための特別なコマンドが用意されています。
C-c . | org-time-stamp | カレンダーを表示して、カーソルがある日付を入力する |
C-c C-s | org-schedule | "SCHEDULED:"という文字列を挿入し、カレンダーを表示する |
C-c C-d | org-deadline | "DEADLINE:"という文字列を挿入し、カレンダーを表示する |
cf. 8.3.1 Inserting deadlines or schedules
いずれも、emacs標準装備のcalendarが別ウインドウに表示されるので、目当ての日にカーソルを移動させてリターンを押すことで、その日付が入力できます。
4.2. calendarとの連携
このように、org-agendaは、emacs標準装備のcalendarと連携しています。単純な日付入力以外にも、以下のような便利な機能があります。
- C-c <
- calendarバッファで特定の日にポイント(カーソル)を移動させておいて、orgバッファでこのキーを叩くと、その日付が入力されます。
- C-c >
- 逆に、orgバッファのタイムスタンプでこのキーを叩くと、calendarのその日に移動します。
カレンダーを見ながら、日付にカーソルを移動させ、その日の予定をagendaファイルに入力することもできます。その場合には以下の手順で設定を行います。
変数 org-agenda-diary-file
に、orgファイルを設定する。
(setq org-agenda-diary-file "~/path/to/agenda.org")
このファイルを org-agenda-files
に含める。
(setq org-agenda-files "~/path/to/agenda-directory/" "~/path/to/agenda.org")
カレンダーバッファで特定の日にポイント(カーソル)を移動させ、 i
を入力。diary entryのプロンプトが出るのでそこに予定を記入。このとき、時刻やTODOキーワードも指定できる。
このようにして入力したエントリーは、入力した日ではなく、予定された日の時系列(time-tree)で記録されるので、重複チェックに適しています。
cf. 11.5 Commands in the Agenda Buffer#Calendar commands
iPhoneでorg-agenda viewが使えるbeorgが、この方法で入力した時刻表示(ヘッダに時刻を含める)に対応していないので、beorgを使う人は、下にある :time-prompt
キーワードを使う方式がいいでしょう。
5. org-capture
このような入力には、通常は org-capture
を使います。テンプレートを準備して、 C-c c
で呼び出し、 C-c C-c
で記録します。説明するのはたいへんなので、詳細はマニュアルを見てください。"org-capture template" でググると、多くのサンプルがあります。
Cf. 10.1 Capture
5.1. :time-promptを便利に使う
通常、agendaファイルには、入力した順番に項目が並ぶことになりますが、これだと、ある予定や〆切を、何度も入力してしまうなど、重複のチェックが少しやりにくいです。(agenda viewで確かめればいいだけですが。)しかし org-capture
のオプションを使えば、calendarを見ながら、入力順ではなく、予定や〆切の日付順に、agendaファイルに蓄積することができます。
(setq org-capture-templates '( ( "e" "Event" entry (file+olp+datetree "") "* TODO %?\n%T" :time-prompt t :empty-lines 1 ) ) )
:time-prompt
propertyを t
にすることで、このエントリーは、calendarで指定した日のdatetreeに記録されます。また、テンプレートの中にある %T
要素によって、その出来事の日付が入力されます。
org-capture
の機能は豊富なので、その他にもさまざまな工夫ができます。
6. 長いファイル名はcategoryを指定しよう
Agenda Viewでは、下のように、左端に、その予定が格納されているファイル名が表示されますが、これは実は、 category
が指定されていないときのデフォルトです。このファイル名が長くなると(denoteのファイルに予定を書き込んだときなど)以下のように表示が乱れるので、そのような場合には category
を指定しましょう。
20240507T103751--tuesday-7-may-2024-1037__journal: 9:00 ┄┄┄┄┄ TODO 某封筒の投函 class: 10:45-12:15 TODO (5) Usemi 12:00 ┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ class: 13:00-14:30 TODO (5) P100 14:00 ┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ agenda: 15:00 ┄┄┄┄┄ TODO 委員会 16:00 ┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ agenda: 18:00 ┄┄┄┄┄ TODO 某会議 18:00 ┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ 20:00 ┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
指定のしかたは二種類あります。
- ファイル自体に指定する
ファイルの先頭あたりに以下のように指定します。
#+category: journal
こうすると、そのファイル全体で、categoryがjournalになります。 しかし、ある特定の予定だけ、categoryを変更したいこともあるでしょう。その場合には次の方法があります。
- header単位に指定する
* task ** get milk :properties: :category: journal :end:
このように指定すると、get milk というヘッダの中だけ、categoryがjournalになります。特別に重要なものを、特別なcategory名で表示させたい場合にも使えるでしょう。このようなpropertyの指定には、 C-c C-x p
というショートカットが便利です。
このようにして、categoryを指定すると、以下のようにスッキリします。(ブラウザのフォントによってはスッキリ見えないようですが)
journal: 9:00 ┄┄┄┄┄ TODO 某封筒の投函 class: 10:45-12:15 TODO (5) Usemi 12:00 ┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ class: 13:00-14:30 TODO (5) P100 14:00 ┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ agenda: 15:00 ┄┄┄┄┄ TODO 委員会 16:00 ┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ agenda: 18:00 ┄┄┄┄┄ TODO 某会議 18:00 ┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ 20:00 ┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
7. 未定の予定
スケジュールの中には、「はっきりした日程は決まっていないけれども忘れてはならない重要なもの」というやっかいなジャンルがあります。手書きの手帳だと、表紙の裏に付箋を貼っておいたりしますが、デジタルではなかなか扱いにくい。しかしorg-agendaでは、このような「漠然としたスケジュール」も忘れないようにすることができます。
これを実現するには、次のようにします。
- org-captureで作成するスケジュールの中に、「未定の予定」という分類を作り、特定のタグ(たとえば
:unfixed:
)を付ける。 - 通常のorg-agenda表示の下に、「未定の予定」を表示するように
org-agenda-custom-commands
を設定する。 - emacs起動時に、「未定の予定」を含んだorg-agendaを表示するようにする。
これでもう、日程が未定だから後回しにしていた重要案件が急に浮上してドキッとすることがなくなります。
7.1. 未定の予定をキャプチャーする
(setq org-capture-templates '( ( "u" "[U]nfixed TODO" entry (file "") "* TODO %? :unfixed:\n%i\n%a" :empty-lines 1 ) ) )
7.2. org-agenda表示をカスタマイズする
(setq org-agenda-custom-commands '(("A" "my Agenda view" ((agenda "") (tags "unfixed")))))
7.3. init.el からcustom-commandを呼び出す
(org-agenda nil "A")