カレンダーの日付に基づくエントリに加え、ダイアリーファイルには記念日などの定期的なイベント用のsexpエントリを含めることができます。これらのエントリは、Emacsがダイアリーファイルをスキャンする際に評価するLisp式(sexp)に基づいています。sexpエントリには日付の代わりに‘%%’が含まれ、その後に括弧で始まり括弧で終わる必要があるLisp式が続きます。このLisp式によって、そのエントリがどの日付に適用されるかが決定されます。
カレンダーモードでは、よく使われる特定のsexpエントリを挿入するためのコマンドが用意されています:
選択した日付(diary-insert-anniversary-entry)の記念日日記エントリを追加します。
現在のリージョン (diary-insert-block-entry)
のブロック日記エントリを追加します。
日付 (diary-insert-cyclic-entry)
から始まる循環日記エントリを追加します。
特定の日付の記念日に該当する日記エントリを作成したい場合は、ポイントをその日付に移動し、i a
(diary-insert-anniversary-entry)
コマンドを使用してください。これにより、日記ファイルの末尾が別のウィンドウに表示され、記念日の説明文が挿入されます。その後、日記エントリの残りの部分を入力できます。エントリは以下のようになります。
%%(diary-anniversary 10 31 1988) Arthur's birthday
このエントリは1988年以降の任意の年の10月31日に適用されます。‘10 31 1988’で日付を指定します。(欧州式またはISO形式のカレンダーを使用している場合、月・日・年の入力順序が異なります。)この式で開始年が必要な理由は、高度なカレンダー機能がこれを用いて経過年数を算出できるためです。
ブロック形式の日記エントリは、指定した連続する日付範囲に適用されます。以下は、2012年6月24日から2012年7月10日までのすべての日付に適用されるブロック形式の日記エントリです。
%%(diary-block 6 24 2012 7 10 2012) Vacation
「6 24 2012」は開始日を、「7 10 2012」は終了日を示します。(なお、欧州式またはISO形式のカレンダーを使用している場合は、月・日・年の入力順が異なります。)
ブロックエントリを挿入するには、範囲の開始日と終了日の2つの日付にポイントとマークを置き、i b
(diary-insert-block-entry)
と入力します。このコマンドを実行すると、ダイアリーファイルの末尾が別のウィンドウに表示され、ブロックの説明が挿入されます。その後、ダイアリーエントリを入力できます。
周期的な日記エントリは、一定の日数間隔で繰り返されます。作成するには、開始日を選択し、i c (diary-insert-cyclic-entry)
コマンドを使用します。このコマンドは間隔の長さの入力を求め、その後、次のような形式でエントリを挿入します:
%%(diary-cyclic 50 3 1 2012) Renew medication
この項目は2012年3月1日およびそれ以降の50日ごとの日付に適用されます。‘3 1 2012’は開始日を指定します。(欧州式またはISO形式のカレンダーを使用している場合、月・日・年の入力順序が異なります。)
これら3つのコマンドはいずれも日記エントリにマークを付けます。マークを付けないエントリを挿入するには、コマンドにプレフィックス引数を指定してください。例えば、C-u i a はマークを付けない記念日の日記エントリを作成します。
カレンダーでsexp日記のエントリにマークを付ける際は、カレンダーウィンドウに表示されるすべての日付を個別に確認する必要があるため、時間がかかる場合があります。そのため、可能な限りsexp日記のエントリをマークなし(‘&’)にしておくのが得策です。
もう一つの高度な形式のsexpエントリであるフローティングダイアリーエントリは、日、週、月単位で指定されたオフセットによって、定期的に発生するイベントを規定します。これは、cronユーティリティによって解釈されるcrontabエントリに相当します。以下は、11月の第4木曜日に適用される、マークなしのフローティングダイアリーエントリです。
&%%(diary-float 11 4 4) American Thanksgiving
「11」は11月(11番目の月)を、「4」は木曜日(日曜日を0とする週の4日目)を、そして2つ目の「4」は第4木曜日(1は「第1」、2は「第2」、-2は「最後から2番目」、といった具合)をそれぞれ指定します。月は単一の月、または複数の月のリストを指定できます。したがって、上記の「11」を「'(1 2
3)」に変更すれば、そのエントリを1月、2月、3月の最終木曜日に適用させることができます。月がtの場合、そのエントリは1年のすべての月に適用されます。
%%(diary-offset '(diary-float t 3 4) 2) Monthly committee meeting
この項目は、毎月第3木曜日の後の土曜日に適用されます。「2」は、sexp '(diary-float t 3 4) が t
と評価される日から何日後かを指定します。これは、例えば、第3木曜日に開催される毎月の会議の2日後に組織の委員会会議がある場合や、異なるタイムゾーンで設定されたオンライン会議に出席するため日付にずれが生じる場合などに便利です。
標準的な sexp ダイアリーエントリはそれぞれ、カレンダーにエントリをマークする際に使用する顔の名前または1文字の文字列を指定するオプションパラメータを受け付けます。一般的に、sexp ダイアリーエントリは任意の計算を行い、適用タイミングを判定できます。Sexp エントリと Fancy Diary 表示を参照してください。