UP | HOME

org-agendaで繰り返す予定をどう扱うか

Table of Contents

Last modified: 20221030T1708+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
家賃タイプ。機械的に、予定されていた日の一週間後に設定される。家賃の支払いなど、忘れたからと言って無くなったりしない予定に使う。
++1w
ジムタイプ。過去が帳消しになる。ジムの予定など、行かなかった日は忘れて、次に行く日を忘れないようにしたい場合。
.+1w
床屋タイプ。繰り返す日付や曜日が決まっているわけではなく、前回から一定の間隔をあけることが重要であるタイプ。ズレたら、ズレた日から起算し直す。

この方法を使うと、毎週の授業の予定を簡単に作成できる。決まった曜日だが過去は無視していいので、 ++w で指定する。

* 哲学特殊研究I
 <2023-04-07 9:00-10:30 Fri ++w>  

cf. 8.3.2 Repeated tasks

2. ログを記録する

授業を終えると、進度や内容、課題などについてメモを取っておく必要があるが、org-agendaだと、終了した授業を t または C-c C-tDONE にしたときに、ログを記録するウインドウを表示させることができる。そのためには、もとになるagendaファイルの冒頭に、

#+startup:lognotedone

と書いておく。この場合はファイル毎の指定となる。あるいは、 ~/.emacs.d/init.el などの設定ファイルに、

(setq org-log-done 'note)

などと書いて変数 org-log-donenote という値をセットする。この場合には、ログをノートに記録することが、すべてのagendaファイルでデフォルトとなる。

cf. 5.3.1 Closing items

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)>

cf. 17. Appointments/Diary

これも、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回のタスクが生成される。

この長所は、毎週独立したエントリーになるので、その回についての個別の情報(たとえば「○○君の発表」「○○学会のため休講」「中間試験」など)を書いておくことができる。終了後の授業記録も直観的でわかりやすい。


Author: Yoshinori Ueeda

Created: 2022-10-30 Sun 17:08

Validate