Sexp形式の日記エントリでは、単に複雑な条件を設定して適用させる以上のことが可能です。日記ファイル内では、Sexpエントリの前に diary-sexp-entry-symbol(デフォルトは ‘%%’)を記述する必要があります。高度な日記表示機能を利用すれば、Sexpエントリによって日付そのものに応じたテキストを生成できます。
例えば、記念日の日記エントリでは、記念日からの経過年数をエントリの本文に挿入できます。したがって、この日記エントリ内の ‘%d’ は:
%%(diary-anniversary 10 31 1948) Arthur's birthday (%d years old)
年齢に置き換えられるため、1990年10月31日のエントリはファンシーダイアリーバッファに次のように表示されます:
Arthur's birthday (42 years old)
代わりに日記ファイルに次のようなエントリが含まれている場合:
%%(diary-anniversary 10 31 1948) Arthur's %d%s birthday
1990年10月31日のファンシーダイアリーバッファのエントリは、次のように表示されます:
Arthur's 42nd birthday
同様に、循環的な日記のエントリから、発生した繰り返し回数を補間することができます:
%%(diary-cyclic 50 1 1 2012) Renew medication (%d%s time)
こんな感じです:
Renew medication (5th time)
2012年9月7日の華やかな日記表示にて。
日記の記載日だけでなく、それより前の日付にもエントリーが含まれる「早期リマインダー日記」機能があります。例えば、記念日の1週間前にリマインダーを受け取りたい場合は、以下を使用できます。
%%(diary-remind '(diary-anniversary 12 22 1968) 7) Ed's anniversary
また、凝った日記には、12月15日と12月22日の両日とも‘Ed's anniversary’と表示されます。
関数 diary-date
は、月・日・年の組み合わせで表される日付に適用されます。各要素は、整数、整数のリスト、または t(すべての値を意味する)のいずれかとなります。例えば、
%%(diary-date '(10 11 12) 22 t) Rake leaves
凝った日記を表示させる
Rake leaves
毎年10月22日、11月22日、12月22日。
関数 diary-float
を使用すると、11月の第3金曜日や4月の最終火曜日といった日付に該当する日記エントリを記述できます。パラメータは month、dayname、およびインデックス n です。エントリは、month の初日から n 番目の dayname に表示されます。ここで dayname=0 は日曜日、1 は月曜日を意味し、以降も同様です。n
が負の値の場合、month の末尾から逆順にカウントされます。month の値には、月のリスト、単一の月、またはすべての月を指定する t を指定できます。また、オプションパラメータ day
を使用して、month の day 以降または以前の
n 番目の dayname
を指定することも可能です。day の値は、n
が正の場合はデフォルトで 1 となり、n が負の場合は month の最終日となります。例えば、
%%(diary-float t 1 -1) Pay rent
凝った日記を表示させる
Pay rent
毎月最終月曜日に。
sexpダイアリーエントリの汎用性により、アルゴリズム的に記述可能なあらゆるダイアリーエントリを指定できます。sexpダイアリーエントリには、そのエントリが任意の日付に適用されるかどうかを判定する式が含まれています。その値がnil以外であれば、そのエントリはその日付に適用され、そうでなければ適用されません。この式では、対象とする日付を求めるために変数dateを使用できます。その値は、グレゴリオ暦を参照するリスト(month day year)です。
sexpの日記エントリは、式の値がnon-nilである日付に適用されますが、値によってはより具体的な意味を持つ場合があります。値が文字列の場合、その文字列はその日付に発生するイベントの説明となります。また、値は(mark . string)という形式をとることもあり、その場合、markはカレンダー上での日付の表示方法を指定し、stringはイベントの説明となります。markが1文字の文字列である場合、その文字がカレンダーの日付の横に表示されます。markがフェイス名である場合、日付はそのフェイスで表示されます。markがnilである場合、日付に対する特別なハイライトは指定されません。
毎月21日が平日ならその日に、21日が週末ならその前の金曜日に給料が支払われるとします。これらの日付に合わせたsexp日記のエントリーの書き方は以下の通りです。
&%%(let ((dayname (calendar-day-of-week date))
(day (cadr date)))
(or (and (= day 21) (memq dayname '(1 2 3 4 5)))
(and (memq day '(19 20)) (= dayname 5)))
) Pay check deposited
以下のsexp日記のエントリでは、(凝った日記表示機能にある)日付に応じて本文が変化するエントリを作成できる機能を活用しています:
%%(diary-sunrise-sunset)今日の現地の日の出・日の入り時刻を日記に記録してください。
%%(diary-lunar-phases)月の満ち欠け(四半期)について日記を書きなさい。
%%(diary-day-of-year)今年の日付と、今年残りの日数を記載した日記のエントリを作成してください。
%%(diary-iso-date)本日のISO商用日付に相当する日付で、日記のエントリを作成してください。
%%(diary-julian-date)本日のユリウス暦相当日を日記に記入してください。
%%(diary-astro-day-number)本日の天文暦(ユリウス日)に相当する日付を日記に記入してください。
%%(diary-bahai-date)本日のバハーイー暦の日付で日記を書いてください。
%%(diary-chinese-date)本日の中国暦の日付を添えて、日記を書いてください。
%%(diary-coptic-date)本日のコプト暦に相当する日付で、日記のエントリを作成してください。
%%(diary-ethiopic-date)本日のエチオピア暦に相当する日付を日記に記入してください。
%%(diary-french-date)フランス革命暦における本日に相当する日付で、日記を書きなさい。
%%(diary-hebrew-date)本日のヘブライ暦の日付を添えて、日記を書いてください。
%%(diary-islamic-date)本日のイスラム暦に相当する日付を添えて、日記を書いてください。
%%(diary-mayan-date)今日のマヤ暦に相当する日付を日記に記入してください。
%%(diary-persian-date)本日のペルシア暦に相当する日付を添えて、日記を書いてください。
例えば、日記の記述を含める
&%%(diary-hebrew-date)
ファンシー日記表示を使用している場合、日々の日記表示にヘブライ暦の対応する日付が含まれるようになります。(シンプル日記表示では、どの日付においてもリテラル文字列「&%%(diary-hebrew-date)」が日記に表示されます。)
この関数は、特定の標準的なヘブライ語 sexp 日記エントリの作成に使用されてきました:
%%(diary-hebrew-rosh-hodesh)ヘブライ暦の新しい各月の到来と儀式の告知を記した日記の一節を作成してください。
%%(diary-hebrew-parasha)週ごとのシナゴーグの聖書朗読箇所を記した、土曜日の日記を作成してください。
%%(diary-hebrew-sabbath-candles)安息日のろうそく点灯の現地時間を記した金曜日の日記を作成してください。
%%(diary-hebrew-omer)適宜、オメル数を記載した日記のエントリを作成してください。
%%(diary-hebrew-yahrzeit month
day year) name死亡日の記念日を記した日記のエントリを作成してください。日付はグレゴリオ(公暦)の死亡日とします。日記のエントリは、該当するヘブライ暦の記念日およびその前日に表示されます。(パラメータの順序は暦の日付形式によって異なります。例えば、欧州形式では day、month、year の順となります。)
%%(diary-hebrew-birthday month
day year)ヘブライ暦の誕生日の日記を書いてください。
上記で説明したすべての関数は、カレンダー表示における日付のマーク方法を指定するオプション引数 mark を受け取ります。これらの関数のいずれかが特定の日付に適用可能と判断した場合、前述の通り mark を含む値を返します。