org-agendaで繰り返す予定をどう扱うか
Table of Contents
Last modified: 20240502T2119+0900
1. 繰り返す予定の設定方法
一週間ごと、一ヶ月ごとなど、繰り返す予定を指定するには、日付のあとに、 +1w
, ++1w
, .+1w
などの指定をする。たとえば、
* 2022年1月3日に始まりその後一週間ごとに繰り返すタスク <2022-01-03 Mon +1w>
日付のあとにある +1w
で、毎週の繰り返しであることを指定している。二週間ごとなら +2w
とする。 w
以外には、 y
, m
, d
, h
が使え、それぞれ、年、月、日、時間に対応する。たとえば +1y
は一年ごとなので、誕生日などの記念日に使える。
+
, ++
, .+
の部分は、 C-c C-t
でそのタスクを DONE
にしたときに、次の予定日を算定する方法を指定する。これには三種類ある。
+1w
- 家賃タイプ。機械的に、予定されていた日の一週間後に設定される(その一週間後の日付が過去であったとしても)。家賃の支払いなど、忘れたからと言って無くなったりしない予定に使う。
* 家賃を払う
DEADLINE <2022-01-15 Sat +1m>
1月15日に家賃を支払うのに、遅れて2月20日に入金したとすると、次の〆切は、(過去である)2月15日に設定される。2月分を払っていないんだから当たり前である。
++1w
- ジムタイプ。次の予定は必ず未来になる。ジムの予定など、行かなかった日は忘れて、次に行く日を忘れないようにしたい場合。
* ジムに行く
SCHEDULED <2022-01-15 17:00 Sat ++3d>
この例では、1月20日にジムに行くと、行かなかった日のことは忘れて、次は1月21日に設定される。
.+1w
- 床屋タイプ。繰り返す日付や曜日が決まっているわけではなく、前回から一定の間隔をあけることが重要であるタイプ。ズレたら、ズレた日から起算し直す。
* 床屋に行く
SCHEDULED <2022-01-15 17:00 Sat .+1m>
この例では、1月20日に床屋に行くと、そこから起算して、次は一ヶ月後の2月20日に設定される。
毎週の授業のリマインダを作成する場合には、過去は無視していいので、 ++1w
で指定するとよい。
* 哲学特殊研究I <2023-04-07 9:00-10:30 Fri ++1w>
2. ログを記録する
授業を終えると、進度や内容、課題などについてメモを取っておく必要があるが、org-agendaだと、終了した授業を t
または C-c C-t
で DONE
にしたときに、ログを記録するウインドウを表示させることができる。そのためには、もとになるagendaファイルの冒頭に、
#+startup:lognotedone
と書いておく。この場合はファイル毎の指定となる。あるいは、 ~/.emacs.d/init.el
などの設定ファイルに、
(setq org-log-done 'note)
などと書いて変数 org-log-done
に note
という値をセットする。この場合には、ログをノートに記録することが、すべてのagendaファイルでデフォルトとなる。
3. 夏休み、冬休み、学祭などの処理
しかし学期には休みの期間があるので、このままでは夏休み中も授業の予定が表示される。これを処理するためにはいくつかの方法があるが、最後の方法がもっとも柔軟で使いやすい。
3.1. calendar
org-modeは、emacsのcalendarで用いられる日付処理表現(sexp)をそのまま読むことができるので、これを使って一定の条件を満たす日付の予定だけを表示させることができる。
cf. 31.13.10 Sexp Entries and the Fancy Diary Display
たとえば、
* 哲学特殊演習I 10:45-12:15 :class: <%%(and (= 1 (calendar-day-of-week date))(diary-block 10 1 2022 11 17 2022))>
(= 1 (calendar-day-of-week date))
の部分は、その曜日が1、つまり月曜日であるという条件で、 (diary-block 10 1 2022 11 17 2022)
の部分は、「2022年10月1日から2022年11月17日まで」という条件。この二つが冒頭にある and
で評価され、この場合、どちらも当てはまる場合に予定が表示される。
問題点は、iPhoneのorg-agendaアプリであるbeorgでは(この記事執筆時点では)この表記法に対応していないこと。出先で予定を確認するときに不便。
3.2. org-class
org-modeが独自に準備しているsexpもあり、同様のことが以下のように書ける。
* 哲学特殊演習I 10:45-12:15 :class: <%%(org-class 2022 10 1 2022 11 17 1)>
これも、beorgが対応していない。
3.3. org-clone-subtree-with-time-shift
以下のページで、この問題の解決策が提示されていた。
UOMF: Recurring Events with Org Mode
sexpを使う方法は美しいが、学年歴といった不規則な要素が入るものを機械的に扱うのはどうしても無理がある。 考え方は、org-modeに準備されている以下の命令を使って、学期中のpotentialな講義日を自動的に生成し、あとは手作業で休暇や休講になる部分を削除する。原始的だが、もっとも実用的な方法。
M-x org-clone-subtree-with-time-shift
予定の内容を書いているヘッダ部分にカーソルを置いて、このコマンドを打ち込む。すると、それをあと何回繰り返すかを聞いてくるので、学期はじめならたとえば祝日休講なども含めて 17
と入力する。次に、繰り返す間隔を聞いてくるので、毎週の講義なら +1w
と入力する。すると自動的に日付が計算されて、17回のタスクが生成される。
この長所は、毎週独立したエントリーになるので、その回についての個別の情報(たとえば「○○君の発表」「○○学会のため休講」「中間試験」など)を書いておくことができる。終了後の授業記録も直観的でわかりやすい。
まとめると、
- コピーのもとになるエントリーを作る。(NNNは、置換用の任意の文字列)
* 哲学特殊演習I 第NNN回 :class: <2022-10-01 10:45>
- 1週間シフトさせながら、所定回数のコピーを作成する。
M-x org-clone-subtree-with-time-shift
- 休暇、学園祭、などで講義がない日を削除する。
- 全部の講義を選択した状態で、正規表現置換を行う。その際、
NNN
を\#
で置換すると連番が入る。ただし、0から始まるので、最初の講義の前に、一つNNN
を書いて、最初の講義が1回目になるように調整する。