Add 2007 to copyright years.
[bpt/emacs.git] / man / cal-xtra.texi
CommitLineData
6f585e44 1@c This is part of the Emacs manual.
4e6835db 2@c Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
6f585e44
EZ
3@c See file emacs.texi for copying conditions.
4@c
c5184807
EZ
5@c This file is included either in emacs-xtra.texi (when producing the
6@c printed version) or in the main Emacs manual (for the on-line version).
7
8@c Moved here from the Emacs Lisp Reference Manual, 2005-03-26.
9@node Advanced Calendar/Diary Usage
10@section Customizing the Calendar and Diary
11
12 There are many customizations that you can use to make the calendar and
13diary suit your personal tastes.
14
15@menu
16* Calendar Customizing:: Defaults you can set.
17* Holiday Customizing:: Defining your own holidays.
18* Date Display Format:: Changing the format.
19* Time Display Format:: Changing the format.
20* Diary Customizing:: Defaults you can set.
21* Hebrew/Islamic Entries:: How to obtain them.
22* Fancy Diary Display:: Enhancing the diary display, sorting entries,
23 using included diary files.
24* Sexp Diary Entries:: Fancy things you can do.
25@end menu
26
27@node Calendar Customizing
28@subsection Customizing the Calendar
29@vindex calendar-holiday-marker
30@vindex diary-entry-marker
31 The variable @code{calendar-holiday-marker} specifies how to mark a
32date as being a holiday. Its value may be a single-character string
33to insert next to the date, or a face name to use for displaying the
34date. Likewise, the variable @code{diary-entry-marker} specifies how
35to mark a date that has diary entries. The calendar creates faces
36named @code{holiday-face} and @code{diary-face} for these purposes;
37those symbols are the default values of these variables.
38
39@vindex calendar-load-hook
40 The variable @code{calendar-load-hook} is a normal hook run when the
41calendar package is first loaded (before actually starting to display
42the calendar).
43
44@vindex initial-calendar-window-hook
45 Starting the calendar runs the normal hook
46@code{initial-calendar-window-hook}. Recomputation of the calendar
47display does not run this hook. But if you leave the calendar with the
48@kbd{q} command and reenter it, the hook runs again.@refill
49
50@vindex today-visible-calendar-hook
51 The variable @code{today-visible-calendar-hook} is a normal hook run
52after the calendar buffer has been prepared with the calendar when the
53current date is visible in the window. One use of this hook is to
54replace today's date with asterisks; to do that, use the hook function
55@code{calendar-star-date}.
56
57@findex calendar-star-date
58@example
59(add-hook 'today-visible-calendar-hook 'calendar-star-date)
60@end example
61
62@noindent
63Another standard hook function marks the current date, either by
64changing its face or by adding an asterisk. Here's how to use it:
65
66@findex calendar-mark-today
67@example
68(add-hook 'today-visible-calendar-hook 'calendar-mark-today)
69@end example
70
71@noindent
72@vindex calendar-today-marker
73The variable @code{calendar-today-marker} specifies how to mark
74today's date. Its value should be a single-character string to insert
75next to the date or a face name to use for displaying the date. A
76face named @code{calendar-today-face} is provided for this purpose;
77that symbol is the default for this variable.
78
79@vindex today-invisible-calendar-hook
80@noindent
81 A similar normal hook, @code{today-invisible-calendar-hook} is run if
82the current date is @emph{not} visible in the window.
83
84@vindex calendar-move-hook
85 Each of the calendar cursor motion commands runs the hook
86@code{calendar-move-hook} after it moves the cursor.
87
88@node Holiday Customizing
89@subsection Customizing the Holidays
90
91@vindex calendar-holidays
92@vindex christian-holidays
93@vindex hebrew-holidays
94@vindex islamic-holidays
95 Emacs knows about holidays defined by entries on one of several lists.
96You can customize these lists of holidays to your own needs, adding or
97deleting holidays. The lists of holidays that Emacs uses are for
98general holidays (@code{general-holidays}), local holidays
99(@code{local-holidays}), Christian holidays (@code{christian-holidays}),
100Hebrew (Jewish) holidays (@code{hebrew-holidays}), Islamic (Muslim)
101holidays (@code{islamic-holidays}), and other holidays
102(@code{other-holidays}).
103
104@vindex general-holidays
105 The general holidays are, by default, holidays common throughout the
106United States. To eliminate these holidays, set @code{general-holidays}
107to @code{nil}.
108
109@vindex local-holidays
110 There are no default local holidays (but sites may supply some). You
111can set the variable @code{local-holidays} to any list of holidays, as
112described below.
113
114@vindex all-christian-calendar-holidays
115@vindex all-hebrew-calendar-holidays
116@vindex all-islamic-calendar-holidays
117 By default, Emacs does not include all the holidays of the religions
118that it knows, only those commonly found in secular calendars. For a
119more extensive collection of religious holidays, you can set any (or
120all) of the variables @code{all-christian-calendar-holidays},
121@code{all-hebrew-calendar-holidays}, or
122@code{all-islamic-calendar-holidays} to @code{t}. If you want to
123eliminate the religious holidays, set any or all of the corresponding
124variables @code{christian-holidays}, @code{hebrew-holidays}, and
125@code{islamic-holidays} to @code{nil}.@refill
126
127@vindex other-holidays
128 You can set the variable @code{other-holidays} to any list of
129holidays. This list, normally empty, is intended for individual use.
130
131@cindex holiday forms
132 Each of the lists (@code{general-holidays}, @code{local-holidays},
133@code{christian-holidays}, @code{hebrew-holidays},
134@code{islamic-holidays}, and @code{other-holidays}) is a list of
135@dfn{holiday forms}, each holiday form describing a holiday (or
136sometimes a list of holidays).
137
138 Here is a table of the possible kinds of holiday form. Day numbers
139and month numbers count starting from 1, but ``dayname'' numbers
140count Sunday as 0. The element @var{string} is always the
141name of the holiday, as a string.
142
143@table @code
144@item (holiday-fixed @var{month} @var{day} @var{string})
145A fixed date on the Gregorian calendar.
146
147@item (holiday-float @var{month} @var{dayname} @var{k} @var{string})
148The @var{k}th @var{dayname} in @var{month} on the Gregorian calendar
149(@var{dayname}=0 for Sunday, and so on); negative @var{k} means count back
150from the end of the month.
151
152@item (holiday-hebrew @var{month} @var{day} @var{string})
153A fixed date on the Hebrew calendar.
154
155@item (holiday-islamic @var{month} @var{day} @var{string})
156A fixed date on the Islamic calendar.
157
158@item (holiday-julian @var{month} @var{day} @var{string})
159A fixed date on the Julian calendar.
160
161@item (holiday-sexp @var{sexp} @var{string})
162A date calculated by the Lisp expression @var{sexp}. The expression
163should use the variable @code{year} to compute and return the date of a
164holiday, or @code{nil} if the holiday doesn't happen this year. The
165value of @var{sexp} must represent the date as a list of the form
166@code{(@var{month} @var{day} @var{year})}.
167
168@item (if @var{condition} @var{holiday-form})
169A holiday that happens only if @var{condition} is true.
170
171@item (@var{function} @r{[}@var{args}@r{]})
172A list of dates calculated by the function @var{function}, called with
173arguments @var{args}.
174@end table
175
176 For example, suppose you want to add Bastille Day, celebrated in
177France on July 14. You can do this as follows:
178
179@smallexample
180(setq other-holidays '((holiday-fixed 7 14 "Bastille Day")))
181@end smallexample
182
183@noindent
184The holiday form @code{(holiday-fixed 7 14 "Bastille Day")} specifies the
185fourteenth day of the seventh month (July).
186
187 Many holidays occur on a specific day of the week, at a specific time
188of month. Here is a holiday form describing Hurricane Supplication Day,
189celebrated in the Virgin Islands on the fourth Monday in August:
190
191@smallexample
192(holiday-float 8 1 4 "Hurricane Supplication Day")
193@end smallexample
194
195@noindent
196Here the 8 specifies August, the 1 specifies Monday (Sunday is 0,
197Tuesday is 2, and so on), and the 4 specifies the fourth occurrence in
198the month (1 specifies the first occurrence, 2 the second occurrence,
199@minus{}1 the last occurrence, @minus{}2 the second-to-last occurrence, and
200so on).
201
202 You can specify holidays that occur on fixed days of the Hebrew,
203Islamic, and Julian calendars too. For example,
204
205@smallexample
206(setq other-holidays
207 '((holiday-hebrew 10 2 "Last day of Hanukkah")
208 (holiday-islamic 3 12 "Mohammed's Birthday")
209 (holiday-julian 4 2 "Jefferson's Birthday")))
210@end smallexample
211
212@noindent
213adds the last day of Hanukkah (since the Hebrew months are numbered with
2141 starting from Nisan), the Islamic feast celebrating Mohammed's
215birthday (since the Islamic months are numbered from 1 starting with
216Muharram), and Thomas Jefferson's birthday, which is 2 April 1743 on the
217Julian calendar.
218
219 To include a holiday conditionally, use either Emacs Lisp's @code{if} or the
220@code{holiday-sexp} form. For example, American presidential elections
221occur on the first Tuesday after the first Monday in November of years
222divisible by 4:
223
224@smallexample
225(holiday-sexp '(if (= 0 (% year 4))
226 (calendar-gregorian-from-absolute
227 (1+ (calendar-dayname-on-or-before
228 1 (+ 6 (calendar-absolute-from-gregorian
229 (list 11 1 year)))))))
230 "US Presidential Election")
231@end smallexample
232
233@noindent
234or
235
236@smallexample
237(if (= 0 (% displayed-year 4))
238 (fixed 11
239 (extract-calendar-day
240 (calendar-gregorian-from-absolute
241 (1+ (calendar-dayname-on-or-before
242 1 (+ 6 (calendar-absolute-from-gregorian
243 (list 11 1 displayed-year)))))))
244 "US Presidential Election"))
245@end smallexample
246
247 Some holidays just don't fit into any of these forms because special
248calculations are involved in their determination. In such cases you
249must write a Lisp function to do the calculation. To include eclipses,
250for example, add @code{(eclipses)} to @code{other-holidays}
251and write an Emacs Lisp function @code{eclipses} that returns a
252(possibly empty) list of the relevant Gregorian dates among the range
253visible in the calendar window, with descriptive strings, like this:
254
255@smallexample
256(((6 27 1991) "Lunar Eclipse") ((7 11 1991) "Solar Eclipse") ... )
257@end smallexample
258
259@node Date Display Format
260@subsection Date Display Format
261@vindex calendar-date-display-form
262
263 You can customize the manner of displaying dates in the diary, in mode
264lines, and in messages by setting @code{calendar-date-display-form}.
265This variable holds a list of expressions that can involve the variables
266@code{month}, @code{day}, and @code{year}, which are all numbers in
267string form, and @code{monthname} and @code{dayname}, which are both
268alphabetic strings. In the American style, the default value of this
269list is as follows:
270
271@smallexample
272((if dayname (concat dayname ", ")) monthname " " day ", " year)
273@end smallexample
274
275@noindent
276while in the European style this value is the default:
277
278@smallexample
279((if dayname (concat dayname ", ")) day " " monthname " " year)
280@end smallexample
281
282@noindent
283The ISO standard date representation is this:
284
285@smallexample
286(year "-" month "-" day)
287@end smallexample
288
289@noindent
290This specifies a typical American format:
291
292@smallexample
293(month "/" day "/" (substring year -2))
294@end smallexample
295
296@node Time Display Format
297@subsection Time Display Format
298@vindex calendar-time-display-form
299
300 The calendar and diary by default display times of day in the
301conventional American style with the hours from 1 through 12, minutes,
302and either @samp{am} or @samp{pm}. If you prefer the European style,
303also known in the US as military, in which the hours go from 00 to 23,
304you can alter the variable @code{calendar-time-display-form}. This
305variable is a list of expressions that can involve the variables
306@code{12-hours}, @code{24-hours}, and @code{minutes}, which are all
307numbers in string form, and @code{am-pm} and @code{time-zone}, which are
308both alphabetic strings. The default value of
309@code{calendar-time-display-form} is as follows:
310
311@smallexample
312(12-hours ":" minutes am-pm
313 (if time-zone " (") time-zone (if time-zone ")"))
314@end smallexample
315
316@noindent
317Here is a value that provides European style times:
318
319@smallexample
320(24-hours ":" minutes
321 (if time-zone " (") time-zone (if time-zone ")"))
322@end smallexample
323
324@node Diary Customizing
325@subsection Customizing the Diary
326
327@vindex holidays-in-diary-buffer
328 Ordinarily, the mode line of the diary buffer window indicates any
329holidays that fall on the date of the diary entries. The process of
330checking for holidays can take several seconds, so including holiday
331information delays the display of the diary buffer noticeably. If you'd
332prefer to have a faster display of the diary buffer but without the
333holiday information, set the variable @code{holidays-in-diary-buffer} to
334@code{nil}.@refill
335
336@vindex number-of-diary-entries
337 The variable @code{number-of-diary-entries} controls the number of
338days of diary entries to be displayed at one time. It affects the
339initial display when @code{view-diary-entries-initially} is @code{t}, as
340well as the command @kbd{M-x diary}. For example, the default value is
3411, which says to display only the current day's diary entries. If the
342value is 2, both the current day's and the next day's entries are
343displayed. The value can also be a vector of seven elements: for
344example, if the value is @code{[0 2 2 2 2 4 1]} then no diary entries
345appear on Sunday, the current date's and the next day's diary entries
346appear Monday through Thursday, Friday through Monday's entries appear
347on Friday, while on Saturday only that day's entries appear.
348
349@vindex print-diary-entries-hook
350@findex print-diary-entries
351 The variable @code{print-diary-entries-hook} is a normal hook run
352after preparation of a temporary buffer containing just the diary
353entries currently visible in the diary buffer. (The other, irrelevant
354diary entries are really absent from the temporary buffer; in the diary
355buffer, they are merely hidden.) The default value of this hook does
356the printing with the command @code{lpr-buffer}. If you want to use a
357different command to do the printing, just change the value of this
358hook. Other uses might include, for example, rearranging the lines into
359order by day and time.
360
361@vindex diary-date-forms
362 You can customize the form of dates in your diary file, if neither the
363standard American nor European styles suits your needs, by setting the
364variable @code{diary-date-forms}. This variable is a list of patterns
365for recognizing a date. Each date pattern is a list whose elements may
366be regular expressions (@pxref{Regular Expressions,,, elisp, the Emacs
367Lisp Reference Manual}) or the symbols @code{month}, @code{day},
368@code{year}, @code{monthname}, and @code{dayname}. All these elements
369serve as patterns that match certain kinds of text in the diary file.
370In order for the date pattern, as a whole, to match, all of its elements
371must match consecutively.
372
373 A regular expression in a date pattern matches in its usual fashion,
374using the standard syntax table altered so that @samp{*} is a word
375constituent.
376
377 The symbols @code{month}, @code{day}, @code{year}, @code{monthname},
378and @code{dayname} match the month number, day number, year number,
379month name, and day name of the date being considered. The symbols that
380match numbers allow leading zeros; those that match names allow
381three-letter abbreviations and capitalization. All the symbols can
382match @samp{*}; since @samp{*} in a diary entry means ``any day'', ``any
383month'', and so on, it should match regardless of the date being
384considered.
385
386 The default value of @code{diary-date-forms} in the American style is
387this:
388
389@example
390((month "/" day "[^/0-9]")
391 (month "/" day "/" year "[^0-9]")
392 (monthname " *" day "[^,0-9]")
393 (monthname " *" day ", *" year "[^0-9]")
394 (dayname "\\W"))
395@end example
396
397 The date patterns in the list must be @emph{mutually exclusive} and
398must not match any portion of the diary entry itself, just the date and
399one character of whitespace. If, to be mutually exclusive, the pattern
400must match a portion of the diary entry text---beyond the whitespace
401that ends the date---then the first element of the date pattern
402@emph{must} be @code{backup}. This causes the date recognizer to back
403up to the beginning of the current word of the diary entry, after
404finishing the match. Even if you use @code{backup}, the date pattern
405must absolutely not match more than a portion of the first word of the
406diary entry. The default value of @code{diary-date-forms} in the
407European style is this list:
408
409@example
410((day "/" month "[^/0-9]")
411 (day "/" month "/" year "[^0-9]")
412 (backup day " *" monthname "\\W+\\<[^*0-9]")
413 (day " *" monthname " *" year "[^0-9]")
414 (dayname "\\W"))
415@end example
416
417@noindent
418Notice the use of @code{backup} in the third pattern, because it needs
419to match part of a word beyond the date itself to distinguish it from
420the fourth pattern.
421
422@node Hebrew/Islamic Entries
423@subsection Hebrew- and Islamic-Date Diary Entries
424
425 Your diary file can have entries based on Hebrew or Islamic dates, as
426well as entries based on the world-standard Gregorian calendar.
427However, because recognition of such entries is time-consuming and most
428people don't use them, you must explicitly enable their use. If you
429want the diary to recognize Hebrew-date diary entries, for example,
430you must do this:
431
432@vindex nongregorian-diary-listing-hook
433@vindex nongregorian-diary-marking-hook
434@findex list-hebrew-diary-entries
435@findex mark-hebrew-diary-entries
436@smallexample
437(add-hook 'nongregorian-diary-listing-hook 'list-hebrew-diary-entries)
438(add-hook 'nongregorian-diary-marking-hook 'mark-hebrew-diary-entries)
439@end smallexample
440
441@noindent
442If you want Islamic-date entries, do this:
443
444@findex list-islamic-diary-entries
445@findex mark-islamic-diary-entries
446@smallexample
447(add-hook 'nongregorian-diary-listing-hook 'list-islamic-diary-entries)
448(add-hook 'nongregorian-diary-marking-hook 'mark-islamic-diary-entries)
449@end smallexample
450
451 Hebrew- and Islamic-date diary entries have the same formats as
452Gregorian-date diary entries, except that @samp{H} precedes a Hebrew
453date and @samp{I} precedes an Islamic date. Moreover, because the
454Hebrew and Islamic month names are not uniquely specified by the first
455three letters, you may not abbreviate them. For example, a diary entry
456for the Hebrew date Heshvan 25 could look like this:
457
458@smallexample
459HHeshvan 25 Happy Hebrew birthday!
460@end smallexample
461
462@noindent
463and would appear in the diary for any date that corresponds to Heshvan 25
464on the Hebrew calendar. And here is an Islamic-date diary entry that matches
465Dhu al-Qada 25:
466
467@smallexample
468IDhu al-Qada 25 Happy Islamic birthday!
469@end smallexample
470
471 As with Gregorian-date diary entries, Hebrew- and Islamic-date entries
472are nonmarking if they are preceded with an ampersand (@samp{&}).
473
474 Here is a table of commands used in the calendar to create diary entries
475that match the selected date and other dates that are similar in the Hebrew
476or Islamic calendar:
477
478@table @kbd
479@item i h d
480Add a diary entry for the Hebrew date corresponding to the selected date
481(@code{insert-hebrew-diary-entry}).
482@item i h m
483Add a diary entry for the day of the Hebrew month corresponding to the
484selected date (@code{insert-monthly-hebrew-diary-entry}). This diary
485entry matches any date that has the same Hebrew day-within-month as the
486selected date.
487@item i h y
488Add a diary entry for the day of the Hebrew year corresponding to the
489selected date (@code{insert-yearly-hebrew-diary-entry}). This diary
490entry matches any date which has the same Hebrew month and day-within-month
491as the selected date.
492@item i i d
493Add a diary entry for the Islamic date corresponding to the selected date
494(@code{insert-islamic-diary-entry}).
495@item i i m
496Add a diary entry for the day of the Islamic month corresponding to the
497selected date (@code{insert-monthly-islamic-diary-entry}).
498@item i i y
499Add a diary entry for the day of the Islamic year corresponding to the
500selected date (@code{insert-yearly-islamic-diary-entry}).
501@end table
502
503@findex insert-hebrew-diary-entry
504@findex insert-monthly-hebrew-diary-entry
505@findex insert-yearly-hebrew-diary-entry
506@findex insert-islamic-diary-entry
507@findex insert-monthly-islamic-diary-entry
508@findex insert-yearly-islamic-diary-entry
509 These commands work much like the corresponding commands for ordinary
510diary entries: they apply to the date that point is on in the calendar
511window, and what they do is insert just the date portion of a diary entry
512at the end of your diary file. You must then insert the rest of the
513diary entry.
514
515@node Fancy Diary Display
516@subsection Fancy Diary Display
517@vindex diary-display-hook
518@findex simple-diary-display
519
520 Diary display works by preparing the diary buffer and then running the
521hook @code{diary-display-hook}. The default value of this hook
522(@code{simple-diary-display}) hides the irrelevant diary entries and
523then displays the buffer. However, if you specify the hook as follows,
524
525@cindex diary buffer
526@findex fancy-diary-display
527@example
528(add-hook 'diary-display-hook 'fancy-diary-display)
529@end example
530
531@noindent
532this enables fancy diary display. It displays diary entries and
533holidays by copying them into a special buffer that exists only for the
534sake of display. Copying to a separate buffer provides an opportunity
535to change the displayed text to make it prettier---for example, to sort
536the entries by the dates they apply to.
537
538 As with simple diary display, you can print a hard copy of the buffer
539with @code{print-diary-entries}. To print a hard copy of a day-by-day
540diary for a week, position point on Sunday of that week, type
541@kbd{7 d}, and then do @kbd{M-x print-diary-entries}. As usual, the
542inclusion of the holidays slows down the display slightly; you can speed
543things up by setting the variable @code{holidays-in-diary-buffer} to
544@code{nil}.
545
546@vindex diary-list-include-blanks
547 Ordinarily, the fancy diary buffer does not show days for which there are
548no diary entries, even if that day is a holiday. If you want such days to be
549shown in the fancy diary buffer, set the variable
550@code{diary-list-include-blanks} to @code{t}.@refill
551
552@cindex sorting diary entries
553 If you use the fancy diary display, you can use the normal hook
554@code{list-diary-entries-hook} to sort each day's diary entries by their
555time of day. Here's how:
556
557@findex sort-diary-entries
558@example
559(add-hook 'list-diary-entries-hook 'sort-diary-entries t)
560@end example
561
562@noindent
563For each day, this sorts diary entries that begin with a recognizable
564time of day according to their times. Diary entries without times come
565first within each day.
566
567 Fancy diary display also has the ability to process included diary
568files. This permits a group of people to share a diary file for events
569that apply to all of them. Lines in the diary file of this form:
570
571@smallexample
572#include "@var{filename}"
573@end smallexample
574
575@noindent
576includes the diary entries from the file @var{filename} in the fancy
577diary buffer. The include mechanism is recursive, so that included files
578can include other files, and so on; you must be careful not to have a
579cycle of inclusions, of course. Here is how to enable the include
580facility:
581
582@vindex list-diary-entries-hook
583@vindex mark-diary-entries-hook
584@findex include-other-diary-files
585@findex mark-included-diary-files
586@smallexample
587(add-hook 'list-diary-entries-hook 'include-other-diary-files)
588(add-hook 'mark-diary-entries-hook 'mark-included-diary-files)
589@end smallexample
590
591The include mechanism works only with the fancy diary display, because
592ordinary diary display shows the entries directly from your diary file.
593
594@node Sexp Diary Entries
595@subsection Sexp Entries and the Fancy Diary Display
596@cindex sexp diary entries
597
598 Sexp diary entries allow you to do more than just have complicated
599conditions under which a diary entry applies. If you use the fancy
600diary display, sexp entries can generate the text of the entry depending
601on the date itself. For example, an anniversary diary entry can insert
602the number of years since the anniversary date into the text of the
603diary entry. Thus the @samp{%d} in this dairy entry:
604
605@findex diary-anniversary
606@smallexample
607%%(diary-anniversary 10 31 1948) Arthur's birthday (%d years old)
608@end smallexample
609
610@noindent
611gets replaced by the age, so on October 31, 1990 the entry appears in
612the fancy diary buffer like this:
613
614@smallexample
615Arthur's birthday (42 years old)
616@end smallexample
617
618@noindent
619If the diary file instead contains this entry:
620
621@smallexample
622%%(diary-anniversary 10 31 1948) Arthur's %d%s birthday
623@end smallexample
624
625@noindent
626the entry in the fancy diary buffer for October 31, 1990 appears like this:
627
628@smallexample
629Arthur's 42nd birthday
630@end smallexample
631
632 Similarly, cyclic diary entries can interpolate the number of repetitions
633that have occurred:
634
635@findex diary-cyclic
636@smallexample
637%%(diary-cyclic 50 1 1 1990) Renew medication (%d%s time)
638@end smallexample
639
640@noindent
641looks like this:
642
643@smallexample
644Renew medication (5th time)
645@end smallexample
646
647@noindent
648in the fancy diary display on September 8, 1990.
649
650 There is an early reminder diary sexp that includes its entry in the
651diary not only on the date of occurrence, but also on earlier dates.
652For example, if you want a reminder a week before your anniversary, you
653can use
654
655@findex diary-remind
656@smallexample
657%%(diary-remind '(diary-anniversary 12 22 1968) 7) Ed's anniversary
658@end smallexample
659
660@noindent
661and the fancy diary will show
662@smallexample
663Ed's anniversary
664@end smallexample
665@noindent
666both on December 15 and on December 22.
667
668@findex diary-date
669 The function @code{diary-date} applies to dates described by a month,
670day, year combination, each of which can be an integer, a list of
671integers, or @code{t}. The value @code{t} means all values. For
672example,
673
674@smallexample
675%%(diary-date '(10 11 12) 22 t) Rake leaves
676@end smallexample
677
678@noindent
679causes the fancy diary to show
680
681@smallexample
682Rake leaves
683@end smallexample
684
685@noindent
686on October 22, November 22, and December 22 of every year.
687
688@findex diary-float
689 The function @code{diary-float} allows you to describe diary entries
690that apply to dates like the third Friday of November, or the last
691Tuesday in April. The parameters are the @var{month}, @var{dayname},
692and an index @var{n}. The entry appears on the @var{n}th @var{dayname}
693of @var{month}, where @var{dayname}=0 means Sunday, 1 means Monday, and
694so on. If @var{n} is negative it counts backward from the end of
695@var{month}. The value of @var{month} can be a list of months, a single
696month, or @code{t} to specify all months. You can also use an optional
697parameter @var{day} to specify the @var{n}th @var{dayname} of
698@var{month} on or after/before @var{day}; the value of @var{day} defaults
699to 1 if @var{n} is positive and to the last day of @var{month} if
700@var{n} is negative. For example,
701
702@smallexample
703%%(diary-float t 1 -1) Pay rent
704@end smallexample
705
706@noindent
707causes the fancy diary to show
708
709@smallexample
710Pay rent
711@end smallexample
712
713@noindent
714on the last Monday of every month.
715
716 The generality of sexp diary entries lets you specify any diary
717entry that you can describe algorithmically. A sexp diary entry
718contains an expression that computes whether the entry applies to any
719given date. If its value is non-@code{nil}, the entry applies to that
720date; otherwise, it does not. The expression can use the variable
721@code{date} to find the date being considered; its value is a list
722(@var{month} @var{day} @var{year}) that refers to the Gregorian
723calendar.
724
725 The sexp diary entry applies to a date when the expression's value
726is non-@code{nil}, but some values have more specific meanings. If
727the value is a string, that string is a description of the event which
728occurs on that date. The value can also have the form
729@code{(@var{mark} . @var{string})}; then @var{mark} specifies how to
730mark the date in the calendar, and @var{string} is the description of
731the event. If @var{mark} is a single-character string, that character
732appears next to the date in the calendar. If @var{mark} is a face
733name, the date is displayed in that face. If @var{mark} is
734@code{nil}, that specifies no particular highlighting for the date.
735
736 Suppose you get paid on the 21st of the month if it is a weekday, and
737on the Friday before if the 21st is on a weekend. Here is how to write
738a sexp diary entry that matches those dates:
739
740@smallexample
741&%%(let ((dayname (calendar-day-of-week date))
742 (day (car (cdr date))))
743 (or (and (= day 21) (memq dayname '(1 2 3 4 5)))
744 (and (memq day '(19 20)) (= dayname 5)))
745 ) Pay check deposited
746@end smallexample
747
748 The following sexp diary entries take advantage of the ability (in the fancy
749diary display) to concoct diary entries whose text varies based on the date:
750
751@findex diary-sunrise-sunset
752@findex diary-phases-of-moon
753@findex diary-day-of-year
754@findex diary-iso-date
755@findex diary-julian-date
756@findex diary-astro-day-number
757@findex diary-hebrew-date
758@findex diary-islamic-date
759@findex diary-french-date
760@findex diary-mayan-date
761@table @code
762@item %%(diary-sunrise-sunset)
763Make a diary entry for the local times of today's sunrise and sunset.
764@item %%(diary-phases-of-moon)
765Make a diary entry for the phases (quarters) of the moon.
766@item %%(diary-day-of-year)
767Make a diary entry with today's day number in the current year and the number
768of days remaining in the current year.
769@item %%(diary-iso-date)
770Make a diary entry with today's equivalent ISO commercial date.
771@item %%(diary-julian-date)
772Make a diary entry with today's equivalent date on the Julian calendar.
773@item %%(diary-astro-day-number)
774Make a diary entry with today's equivalent astronomical (Julian) day number.
775@item %%(diary-hebrew-date)
776Make a diary entry with today's equivalent date on the Hebrew calendar.
777@item %%(diary-islamic-date)
778Make a diary entry with today's equivalent date on the Islamic calendar.
779@item %%(diary-french-date)
780Make a diary entry with today's equivalent date on the French Revolutionary
781calendar.
782@item %%(diary-mayan-date)
783Make a diary entry with today's equivalent date on the Mayan calendar.
784@end table
785
786@noindent
787Thus including the diary entry
788
789@example
790&%%(diary-hebrew-date)
791@end example
792
793@noindent
794causes every day's diary display to contain the equivalent date on the
795Hebrew calendar, if you are using the fancy diary display. (With simple
796diary display, the line @samp{&%%(diary-hebrew-date)} appears in the
797diary for any date, but does nothing particularly useful.)
798
799 These functions can be used to construct sexp diary entries based on
800the Hebrew calendar in certain standard ways:
801
802@cindex rosh hodesh
803@findex diary-rosh-hodesh
804@cindex parasha, weekly
805@findex diary-parasha
806@cindex candle lighting times
807@findex diary-sabbath-candles
808@cindex omer count
809@findex diary-omer
810@cindex yahrzeits
811@findex diary-yahrzeit
812@table @code
813@item %%(diary-rosh-hodesh)
814Make a diary entry that tells the occurrence and ritual announcement of each
815new Hebrew month.
816@item %%(diary-parasha)
817Make a Saturday diary entry that tells the weekly synagogue scripture reading.
818@item %%(diary-sabbath-candles)
819Make a Friday diary entry that tells the @emph{local time} of Sabbath
820candle lighting.
821@item %%(diary-omer)
822Make a diary entry that gives the omer count, when appropriate.
823@item %%(diary-yahrzeit @var{month} @var{day} @var{year}) @var{name}
824Make a diary entry marking the anniversary of a date of death. The date
825is the @emph{Gregorian} (civil) date of death. The diary entry appears
826on the proper Hebrew calendar anniversary and on the day before. (In
827the European style, the order of the parameters is changed to @var{day},
828@var{month}, @var{year}.)
829@end table
830
831 All the functions documented above take an optional argument
832@var{mark} which specifies how to mark the date in the calendar display.
833If one of these functions decides that it applies to a certain date,
834it returns a value that contains @var{mark}.
14831d20
MB
835
836@ignore
837 arch-tag: 52cb299f-fd1f-4616-bfe6-91b988669431
838@end ignore