UP | HOME

invitation to org-agenda

Table of Contents

Last modified: 20240628T1229+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のその日に移動します。

cf. 8.2 Creating Timestamps

カレンダーを見ながら、日付にカーソルを移動させ、その日の予定を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 の機能は豊富なので、その他にもさまざまな工夫ができます。

cf. 10.1.3.1 Template elements

6. 長いファイル名はcategoryを指定しよう

Agenda Viewでは、下のように、左端に、その予定が格納されているファイル名が表示されますが、これは実は、 category が指定されていないときのデフォルトです。このファイル名が長くなると(denoteのファイルに予定を書き込んだときなど)以下のように表示が乱れるので、そのような場合には category を指定しましょう。

Cf. 11.4.1 Categories

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 というショートカットが便利です。

Cf. 7.1 Property Syntax

このようにして、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 ┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄

Author: Yoshinori Ueeda

Created: 2024-06-28 Fri 12:29

Validate