Emacsが認識しているデフォルトの祝日を列挙した変数がいくつかあります。具体的には、holiday-general-holidays、holiday-local-holidays、holiday-solar-holidays、holiday-bahai-holidays、holiday-christian-holidays、holiday-hebrew-holidays、holiday-islamic-holidays、holiday-oriental-holidays、およびholiday-other-holidaysです。名称は自明なはずです。例えば、holiday-solar-holidaysには太陽や月に関連する祝日が列挙されています。
これらの祝日リストは、以下に説明する方法で祝日を削除または追加することで、ニーズに合わせてカスタマイズできます。いずれかを nil に設定すると、関連する祝日は表示されなくなります。
general holidays は、デフォルトでは米国全土で共通して適用される祝日です。これに対し、holiday-local-holidays と holiday-other-holidays
はともにデフォルトでは空となっています。これらは、それぞれシステム全体の設定および個人利用を目的としています。
デフォルトでは、Emacsは認識している宗教の祝日をすべて含めるわけではなく、世俗的な暦で一般的に見られるもののみを含めます。より広範な宗教的祝日の一覧を表示するには、変数
calendar-bahai-all-holidays-flag、calendar-christian-all-holidays-flag、calendar-hebrew-all-holidays-flag、または calendar-islamic-all-holidays-flag のいずれか(あるいはすべて)を t に設定してください。
各祝日変数は祝日形式のリストであり、各形式は1つの祝日(または場合によっては複数の祝日のリスト)を記述します。以下に、考えられる祝日形式の種類をまとめた表を示します。日番号と月番号は1から数えますが、dayname番号では日曜日を0として数えます。引数stringは常に、文字列としての祝日の説明となります。
(holiday-fixed month day string)グレゴリオ暦上の固定された日付。
(holiday-float month dayname k string&optional day) グレゴリオ暦の日付 month, day の後または前にある k 番目の dayname (dayname=0 は日曜日、以下同様)。負の k は、月末から遡って数えることを意味します。オプションの day は、k が正の場合はデフォルトで 1 となり、それ以外の場合は month の最終日となります。
(holiday-chinese month day string)中国暦の固定された日付。
(holiday-hebrew month day string)ヘブライ暦の固定日。
(holiday-islamic month day string)イスラム暦の固定された日付。
(holiday-julian month day string)ユリウス暦の固定日付。
(holiday-sexp sexp string)Lisp式 sexp によって算出される日付。この式では変数 year を用いて祝日の日付を計算し、リスト (month day year) の形式で返すものとする。ただし、その祝日が今年は当たらない場合は nil とする。
(if condition holiday-form)condition が真の場合にのみ発生する休日。
(function [args])引数 args を指定して呼び出された関数 function によって計算された日付の一覧。
例えば、フランスで7月14日(すなわち7月14日)に祝われる革命記念日を追加したいとします。次のように行うことができます。
(setq holiday-other-holidays '((holiday-fixed 7 14 "Bastille Day")))
多くの祝日は、特定の曜日や月の特定の日に設けられています。以下は、バージン諸島で7月の第4月曜日に祝われる「ハリケーン祈願の日」について記した祝日フォームです。
(holiday-float 7 1 4 "Hurricane Supplication Day")
ここで、7は7月を、1は月曜日を(日曜日は0、火曜日は2、以下同様)、4は月内の4回目を表します(1は1回目、2は2回目、−1は最後の回、−2は最後から2回目、以下同様)。
グレゴリオ暦、中国暦、ヘブライ暦、イスラム暦、ユリウス暦の固定日にあたる祝日も指定できます。例えば、
(setq holiday-other-holidays
'((holiday-hebrew 10 2 "Last day of Hanukkah")
(holiday-islamic 3 12 "Mohammed's Birthday")
(holiday-julian 4 2 "Jefferson's Birthday")))
ハヌカーの最終日(ヘブライ暦の月はニサン月から1として数えられるため)、ムハンマドの生誕を祝うイスラム教の祝祭(イスラム暦の月はムハッラム月から1として数えられるため)、そしてユリウス暦で1743年4月2日にあたるトーマス・ジェファーソンの誕生日が追加される。
祝日を条件付きで含めるには、Emacs Lispのifまたはholiday-sexp形式のいずれかを使用してください。例えば、アメリカ大統領選挙は、4で割り切れる年の11月最初の月曜日の後の最初の火曜日に行われます:
(holiday-sexp '(if (zerop (% year 4))
(calendar-gregorian-from-absolute
(1+ (calendar-dayname-on-or-before
1 (+ 6 (calendar-absolute-from-gregorian
(list 11 1 year)))))))
"US Presidential Election")
または
(if (zerop (% displayed-year 4))
(holiday-fixed 11
(calendar-extract-day
(calendar-gregorian-from-absolute
(1+ (calendar-dayname-on-or-before
1 (+ 6 (calendar-absolute-from-gregorian
(list 11 1 displayed-year)))))))
"US Presidential Election"))
祝日の中には、決定に特別な計算が伴うため、これらのいずれの形式にも当てはまらないものがあります。そのような場合は、計算を行うためのLisp関数を記述する必要があります。例えば、食を含めるには、holiday-other-holidays に (eclipses)
を加え、カレンダーウィンドウで表示されている範囲内の該当するグレゴリオ暦の日付を、説明用の文字列とともに(空の場合もあり)リストとして返すEmacs
Lisp関数 eclipses を次のように記述します。
(((6 4 2012) "Lunar Eclipse") ((11 13 2012) "Solar Eclipse") ... )