(XCreatePixmap, XCreatePixmapFromBitmapData): Use Window
[emacs.git] / man / cal-xtra.texi
blobf6a4af0499b0797d8cd630d4961898c31b2b8d54
1 @c This is part of the Emacs manual.
2 @c Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
3 @c See file emacs.texi for copying conditions.
4 @c
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).
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
12   There are many customizations that you can use to make the calendar and
13 diary suit your personal tastes.
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
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
32 date as being a holiday.  Its value may be a single-character string
33 to insert next to the date, or a face name to use for displaying the
34 date.  Likewise, the variable @code{diary-entry-marker} specifies how
35 to mark a date that has diary entries.  The calendar creates faces
36 named @code{holiday-face} and @code{diary-face} for these purposes;
37 those symbols are the default values of these variables.
39 @vindex calendar-load-hook
40   The variable @code{calendar-load-hook} is a normal hook run when the
41 calendar package is first loaded (before actually starting to display
42 the calendar).
44 @vindex initial-calendar-window-hook
45   Starting the calendar runs the normal hook
46 @code{initial-calendar-window-hook}.  Recomputation of the calendar
47 display 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
50 @vindex today-visible-calendar-hook
51   The variable @code{today-visible-calendar-hook} is a normal hook run
52 after the calendar buffer has been prepared with the calendar when the
53 current date is visible in the window.  One use of this hook is to
54 replace today's date with asterisks; to do that, use the hook function
55 @code{calendar-star-date}.
57 @findex calendar-star-date
58 @example
59 (add-hook 'today-visible-calendar-hook 'calendar-star-date)
60 @end example
62 @noindent
63 Another standard hook function marks the current date, either by
64 changing its face or by adding an asterisk.  Here's how to use it:
66 @findex calendar-mark-today
67 @example
68 (add-hook 'today-visible-calendar-hook 'calendar-mark-today)
69 @end example
71 @noindent
72 @vindex calendar-today-marker
73 The variable @code{calendar-today-marker} specifies how to mark
74 today's date.  Its value should be a single-character string to insert
75 next to the date or a face name to use for displaying the date.  A
76 face named @code{calendar-today-face} is provided for this purpose;
77 that symbol is the default for this variable.
79 @vindex today-invisible-calendar-hook
80 @noindent
81   A similar normal hook, @code{today-invisible-calendar-hook} is run if
82 the current date is @emph{not} visible in the window.
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.
88 @node Holiday Customizing
89 @subsection Customizing the Holidays
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.
96 You can customize these lists of holidays to your own needs, adding or
97 deleting holidays.  The lists of holidays that Emacs uses are for
98 general holidays (@code{general-holidays}), local holidays
99 (@code{local-holidays}), Christian holidays (@code{christian-holidays}),
100 Hebrew (Jewish) holidays (@code{hebrew-holidays}), Islamic (Muslim)
101 holidays (@code{islamic-holidays}), and other holidays
102 (@code{other-holidays}).
104 @vindex general-holidays
105   The general holidays are, by default, holidays common throughout the
106 United States.  To eliminate these holidays, set @code{general-holidays}
107 to @code{nil}.
109 @vindex local-holidays
110   There are no default local holidays (but sites may supply some).  You
111 can set the variable @code{local-holidays} to any list of holidays, as
112 described below.
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
118 that it knows, only those commonly found in secular calendars.  For a
119 more extensive collection of religious holidays, you can set any (or
120 all) 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
123 eliminate the religious holidays, set any or all of the corresponding
124 variables @code{christian-holidays}, @code{hebrew-holidays}, and
125 @code{islamic-holidays} to @code{nil}.@refill
127 @vindex other-holidays
128   You can set the variable @code{other-holidays} to any list of
129 holidays.  This list, normally empty, is intended for individual use.
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
136 sometimes a list of holidays).
138   Here is a table of the possible kinds of holiday form.  Day numbers
139 and month numbers count starting from 1, but ``dayname'' numbers
140 count Sunday as 0.  The element @var{string} is always the
141 name of the holiday, as a string.
143 @table @code
144 @item (holiday-fixed @var{month} @var{day} @var{string})
145 A fixed date on the Gregorian calendar.
147 @item (holiday-float @var{month} @var{dayname} @var{k} @var{string})
148 The @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
150 from the end of the month.
152 @item (holiday-hebrew @var{month} @var{day} @var{string})
153 A fixed date on the Hebrew calendar.
155 @item (holiday-islamic @var{month} @var{day} @var{string})
156 A fixed date on the Islamic calendar.
158 @item (holiday-julian @var{month} @var{day} @var{string})
159 A fixed date on the Julian calendar.
161 @item (holiday-sexp @var{sexp} @var{string})
162 A date calculated by the Lisp expression @var{sexp}.  The expression
163 should use the variable @code{year} to compute and return the date of a
164 holiday, or @code{nil} if the holiday doesn't happen this year.  The
165 value of @var{sexp} must represent the date as a list of the form
166 @code{(@var{month} @var{day} @var{year})}.
168 @item (if @var{condition} @var{holiday-form})
169 A holiday that happens only if @var{condition} is true.
171 @item (@var{function} @r{[}@var{args}@r{]})
172 A list of dates calculated by the function @var{function}, called with
173 arguments @var{args}.
174 @end table
176   For example, suppose you want to add Bastille Day, celebrated in
177 France on July 14.  You can do this as follows:
179 @smallexample
180 (setq other-holidays '((holiday-fixed 7 14 "Bastille Day")))
181 @end smallexample
183 @noindent
184 The holiday form @code{(holiday-fixed 7 14 "Bastille Day")} specifies the
185 fourteenth day of the seventh month (July).
187   Many holidays occur on a specific day of the week, at a specific time
188 of month.  Here is a holiday form describing Hurricane Supplication Day,
189 celebrated in the Virgin Islands on the fourth Monday in August:
191 @smallexample
192 (holiday-float 8 1 4 "Hurricane Supplication Day")
193 @end smallexample
195 @noindent
196 Here the 8 specifies August, the 1 specifies Monday (Sunday is 0,
197 Tuesday is 2, and so on), and the 4 specifies the fourth occurrence in
198 the month (1 specifies the first occurrence, 2 the second occurrence,
199 @minus{}1 the last occurrence, @minus{}2 the second-to-last occurrence, and
200 so on).
202   You can specify holidays that occur on fixed days of the Hebrew,
203 Islamic, and Julian calendars too.  For example,
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
212 @noindent
213 adds the last day of Hanukkah (since the Hebrew months are numbered with
214 1 starting from Nisan), the Islamic feast celebrating Mohammed's
215 birthday (since the Islamic months are numbered from 1 starting with
216 Muharram), and Thomas Jefferson's birthday, which is 2 April 1743 on the
217 Julian calendar.
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
221 occur on the first Tuesday after the first Monday in November of years
222 divisible by 4:
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
233 @noindent
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
247   Some holidays just don't fit into any of these forms because special
248 calculations are involved in their determination.  In such cases you
249 must write a Lisp function to do the calculation.  To include eclipses,
250 for example, add @code{(eclipses)} to @code{other-holidays}
251 and write an Emacs Lisp function @code{eclipses} that returns a
252 (possibly empty) list of the relevant Gregorian dates among the range
253 visible in the calendar window, with descriptive strings, like this:
255 @smallexample
256 (((6 27 1991) "Lunar Eclipse") ((7 11 1991) "Solar Eclipse") ... )
257 @end smallexample
259 @node Date Display Format
260 @subsection Date Display Format
261 @vindex calendar-date-display-form
263   You can customize the manner of displaying dates in the diary, in mode
264 lines, and in messages by setting @code{calendar-date-display-form}.
265 This variable holds a list of expressions that can involve the variables
266 @code{month}, @code{day}, and @code{year}, which are all numbers in
267 string form, and @code{monthname} and @code{dayname}, which are both
268 alphabetic strings.  In the American style, the default value of this
269 list is as follows:
271 @smallexample
272 ((if dayname (concat dayname ", ")) monthname " " day ", " year)
273 @end smallexample
275 @noindent
276 while in the European style this value is the default:
278 @smallexample
279 ((if dayname (concat dayname ", ")) day " " monthname " " year)
280 @end smallexample
282 @noindent
283 The ISO standard date representation is this:
285 @smallexample
286 (year "-" month "-" day)
287 @end smallexample
289 @noindent
290 This specifies a typical American format:
292 @smallexample
293 (month "/" day "/" (substring year -2))
294 @end smallexample
296 @node Time Display Format
297 @subsection Time Display Format
298 @vindex calendar-time-display-form
300   The calendar and diary by default display times of day in the
301 conventional American style with the hours from 1 through 12, minutes,
302 and either @samp{am} or @samp{pm}.  If you prefer the European style,
303 also known in the US as military, in which the hours go from 00 to 23,
304 you can alter the variable @code{calendar-time-display-form}.  This
305 variable is a list of expressions that can involve the variables
306 @code{12-hours}, @code{24-hours}, and @code{minutes}, which are all
307 numbers in string form, and @code{am-pm} and @code{time-zone}, which are
308 both alphabetic strings.  The default value of
309 @code{calendar-time-display-form} is as follows:
311 @smallexample
312 (12-hours ":" minutes am-pm
313           (if time-zone " (") time-zone (if time-zone ")"))
314 @end smallexample
316 @noindent
317 Here is a value that provides European style times:
319 @smallexample
320 (24-hours ":" minutes
321           (if time-zone " (") time-zone (if time-zone ")"))
322 @end smallexample
324 @node Diary Customizing
325 @subsection Customizing the Diary
327 @vindex holidays-in-diary-buffer
328   Ordinarily, the mode line of the diary buffer window indicates any
329 holidays that fall on the date of the diary entries.  The process of
330 checking for holidays can take several seconds, so including holiday
331 information delays the display of the diary buffer noticeably.  If you'd
332 prefer to have a faster display of the diary buffer but without the
333 holiday information, set the variable @code{holidays-in-diary-buffer} to
334 @code{nil}.@refill
336 @vindex number-of-diary-entries
337   The variable @code{number-of-diary-entries} controls the number of
338 days of diary entries to be displayed at one time.  It affects the
339 initial display when @code{view-diary-entries-initially} is @code{t}, as
340 well as the command @kbd{M-x diary}.  For example, the default value is
341 1, which says to display only the current day's diary entries.  If the
342 value is 2, both the current day's and the next day's entries are
343 displayed.  The value can also be a vector of seven elements: for
344 example, if the value is @code{[0 2 2 2 2 4 1]} then no diary entries
345 appear on Sunday, the current date's and the next day's diary entries
346 appear Monday through Thursday, Friday through Monday's entries appear
347 on Friday, while on Saturday only that day's entries appear.
349 @vindex print-diary-entries-hook
350 @findex print-diary-entries
351   The variable @code{print-diary-entries-hook} is a normal hook run
352 after preparation of a temporary buffer containing just the diary
353 entries currently visible in the diary buffer.  (The other, irrelevant
354 diary entries are really absent from the temporary buffer; in the diary
355 buffer, they are merely hidden.)  The default value of this hook does
356 the printing with the command @code{lpr-buffer}.  If you want to use a
357 different command to do the printing, just change the value of this
358 hook.  Other uses might include, for example, rearranging the lines into
359 order by day and time.
361 @vindex diary-date-forms
362   You can customize the form of dates in your diary file, if neither the
363 standard American nor European styles suits your needs, by setting the
364 variable @code{diary-date-forms}.  This variable is a list of patterns
365 for recognizing a date.  Each date pattern is a list whose elements may
366 be regular expressions (@pxref{Regular Expressions,,, elisp, the Emacs
367 Lisp Reference Manual}) or the symbols @code{month}, @code{day},
368 @code{year}, @code{monthname}, and @code{dayname}.  All these elements
369 serve as patterns that match certain kinds of text in the diary file.
370 In order for the date pattern, as a whole, to match, all of its elements
371 must match consecutively.
373   A regular expression in a date pattern matches in its usual fashion,
374 using the standard syntax table altered so that @samp{*} is a word
375 constituent.
377   The symbols @code{month}, @code{day}, @code{year}, @code{monthname},
378 and @code{dayname} match the month number, day number, year number,
379 month name, and day name of the date being considered.  The symbols that
380 match numbers allow leading zeros; those that match names allow
381 three-letter abbreviations and capitalization.  All the symbols can
382 match @samp{*}; since @samp{*} in a diary entry means ``any day'', ``any
383 month'', and so on, it should match regardless of the date being
384 considered.
386   The default value of @code{diary-date-forms} in the American style is
387 this:
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
397   The date patterns in the list must be @emph{mutually exclusive} and
398 must not match any portion of the diary entry itself, just the date and
399 one character of whitespace.  If, to be mutually exclusive, the pattern
400 must match a portion of the diary entry text---beyond the whitespace
401 that ends the date---then the first element of the date pattern
402 @emph{must} be @code{backup}.  This causes the date recognizer to back
403 up to the beginning of the current word of the diary entry, after
404 finishing the match.  Even if you use @code{backup}, the date pattern
405 must absolutely not match more than a portion of the first word of the
406 diary entry.  The default value of @code{diary-date-forms} in the
407 European style is this list:
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
417 @noindent
418 Notice the use of @code{backup} in the third pattern, because it needs
419 to match part of a word beyond the date itself to distinguish it from
420 the fourth pattern.
422 @node Hebrew/Islamic Entries
423 @subsection Hebrew- and Islamic-Date Diary Entries
425   Your diary file can have entries based on Hebrew or Islamic dates, as
426 well as entries based on the world-standard Gregorian calendar.
427 However, because recognition of such entries is time-consuming and most
428 people don't use them, you must explicitly enable their use.  If you
429 want the diary to recognize Hebrew-date diary entries, for example,
430 you must do this:
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
441 @noindent
442 If you want Islamic-date entries, do this:
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
451   Hebrew- and Islamic-date diary entries have the same formats as
452 Gregorian-date diary entries, except that @samp{H} precedes a Hebrew
453 date and @samp{I} precedes an Islamic date.  Moreover, because the
454 Hebrew and Islamic month names are not uniquely specified by the first
455 three letters, you may not abbreviate them.  For example, a diary entry
456 for the Hebrew date Heshvan 25 could look like this:
458 @smallexample
459 HHeshvan 25 Happy Hebrew birthday!
460 @end smallexample
462 @noindent
463 and would appear in the diary for any date that corresponds to Heshvan 25
464 on the Hebrew calendar.  And here is an Islamic-date diary entry that matches
465 Dhu al-Qada 25:
467 @smallexample
468 IDhu al-Qada 25 Happy Islamic birthday!
469 @end smallexample
471   As with Gregorian-date diary entries, Hebrew- and Islamic-date entries
472 are nonmarking if they are preceded with an ampersand (@samp{&}).
474   Here is a table of commands used in the calendar to create diary entries
475 that match the selected date and other dates that are similar in the Hebrew
476 or Islamic calendar:
478 @table @kbd
479 @item i h d
480 Add a diary entry for the Hebrew date corresponding to the selected date
481 (@code{insert-hebrew-diary-entry}).
482 @item i h m
483 Add a diary entry for the day of the Hebrew month corresponding to the
484 selected date (@code{insert-monthly-hebrew-diary-entry}).  This diary
485 entry matches any date that has the same Hebrew day-within-month as the
486 selected date.
487 @item i h y
488 Add a diary entry for the day of the Hebrew year corresponding to the
489 selected date (@code{insert-yearly-hebrew-diary-entry}).  This diary
490 entry matches any date which has the same Hebrew month and day-within-month
491 as the selected date.
492 @item i i d
493 Add a diary entry for the Islamic date corresponding to the selected date
494 (@code{insert-islamic-diary-entry}).
495 @item i i m
496 Add a diary entry for the day of the Islamic month corresponding to the
497 selected date (@code{insert-monthly-islamic-diary-entry}).
498 @item i i y
499 Add a diary entry for the day of the Islamic year corresponding to the
500 selected date (@code{insert-yearly-islamic-diary-entry}).
501 @end table
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
510 diary entries: they apply to the date that point is on in the calendar
511 window, and what they do is insert just the date portion of a diary entry
512 at the end of your diary file.  You must then insert the rest of the
513 diary entry.
515 @node Fancy Diary Display
516 @subsection Fancy Diary Display
517 @vindex diary-display-hook
518 @findex simple-diary-display
520   Diary display works by preparing the diary buffer and then running the
521 hook @code{diary-display-hook}.  The default value of this hook
522 (@code{simple-diary-display}) hides the irrelevant diary entries and
523 then displays the buffer.  However, if you specify the hook as follows,
525 @cindex diary buffer
526 @findex fancy-diary-display
527 @example
528 (add-hook 'diary-display-hook 'fancy-diary-display)
529 @end example
531 @noindent
532 this enables fancy diary display.  It displays diary entries and
533 holidays by copying them into a special buffer that exists only for the
534 sake of display.  Copying to a separate buffer provides an opportunity
535 to change the displayed text to make it prettier---for example, to sort
536 the entries by the dates they apply to.
538   As with simple diary display, you can print a hard copy of the buffer
539 with @code{print-diary-entries}.  To print a hard copy of a day-by-day
540 diary 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
542 inclusion of the holidays slows down the display slightly; you can speed
543 things up by setting the variable @code{holidays-in-diary-buffer} to
544 @code{nil}.
546 @vindex diary-list-include-blanks
547   Ordinarily, the fancy diary buffer does not show days for which there are
548 no diary entries, even if that day is a holiday.  If you want such days to be
549 shown in the fancy diary buffer, set the variable
550 @code{diary-list-include-blanks} to @code{t}.@refill
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
555 time of day.  Here's how:
557 @findex sort-diary-entries
558 @example
559 (add-hook 'list-diary-entries-hook 'sort-diary-entries t)
560 @end example
562 @noindent
563 For each day, this sorts diary entries that begin with a recognizable
564 time of day according to their times.  Diary entries without times come
565 first within each day.
567   Fancy diary display also has the ability to process included diary
568 files.  This permits a group of people to share a diary file for events
569 that apply to all of them.  Lines in the diary file of this form:
571 @smallexample
572 #include "@var{filename}"
573 @end smallexample
575 @noindent
576 includes the diary entries from the file @var{filename} in the fancy
577 diary buffer.  The include mechanism is recursive, so that included files
578 can include other files, and so on; you must be careful not to have a
579 cycle of inclusions, of course.  Here is how to enable the include
580 facility:
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
591 The include mechanism works only with the fancy diary display, because
592 ordinary diary display shows the entries directly from your diary file.
594 @node Sexp Diary Entries
595 @subsection Sexp Entries and the Fancy Diary Display
596 @cindex sexp diary entries
598   Sexp diary entries allow you to do more than just have complicated
599 conditions under which a diary entry applies.  If you use the fancy
600 diary display, sexp entries can generate the text of the entry depending
601 on the date itself.  For example, an anniversary diary entry can insert
602 the number of years since the anniversary date into the text of the
603 diary entry.  Thus the @samp{%d} in this diary entry:
605 @findex diary-anniversary
606 @smallexample
607 %%(diary-anniversary 10 31 1948) Arthur's birthday (%d years old)
608 @end smallexample
610 @noindent
611 gets replaced by the age, so on October 31, 1990 the entry appears in
612 the fancy diary buffer like this:
614 @smallexample
615 Arthur's birthday (42 years old)
616 @end smallexample
618 @noindent
619 If the diary file instead contains this entry:
621 @smallexample
622 %%(diary-anniversary 10 31 1948) Arthur's %d%s birthday
623 @end smallexample
625 @noindent
626 the entry in the fancy diary buffer for October 31, 1990 appears like this:
628 @smallexample
629 Arthur's 42nd birthday
630 @end smallexample
632   Similarly, cyclic diary entries can interpolate the number of repetitions
633 that have occurred:
635 @findex diary-cyclic
636 @smallexample
637 %%(diary-cyclic 50 1 1 1990) Renew medication (%d%s time)
638 @end smallexample
640 @noindent
641 looks like this:
643 @smallexample
644 Renew medication (5th time)
645 @end smallexample
647 @noindent
648 in the fancy diary display on September 8, 1990.
650   There is an early reminder diary sexp that includes its entry in the
651 diary not only on the date of occurrence, but also on earlier dates.
652 For example, if you want a reminder a week before your anniversary, you
653 can use
655 @findex diary-remind
656 @smallexample
657 %%(diary-remind '(diary-anniversary 12 22 1968) 7) Ed's anniversary
658 @end smallexample
660 @noindent
661 and the fancy diary will show
662 @smallexample
663 Ed's anniversary
664 @end smallexample
665 @noindent
666 both on December 15 and on December 22.
668 @findex diary-date
669   The function @code{diary-date} applies to dates described by a month,
670 day, year combination, each of which can be an integer, a list of
671 integers, or @code{t}. The value @code{t} means all values.  For
672 example,
674 @smallexample
675 %%(diary-date '(10 11 12) 22 t) Rake leaves
676 @end smallexample
678 @noindent
679 causes the fancy diary to show
681 @smallexample
682 Rake leaves
683 @end smallexample
685 @noindent
686 on October 22, November 22, and December 22 of every year.
688 @findex diary-float
689   The function @code{diary-float} allows you to describe diary entries
690 that apply to dates like the third Friday of November, or the last
691 Tuesday in April.  The parameters are the @var{month}, @var{dayname},
692 and an index @var{n}. The entry appears on the @var{n}th @var{dayname}
693 of @var{month}, where @var{dayname}=0 means Sunday, 1 means Monday, and
694 so 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
696 month, or @code{t} to specify all months.  You can also use an optional
697 parameter @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
699 to 1 if @var{n} is positive and to the last day of @var{month} if
700 @var{n} is negative.  For example,
702 @smallexample
703 %%(diary-float t 1 -1) Pay rent
704 @end smallexample
706 @noindent
707 causes the fancy diary to show
709 @smallexample
710 Pay rent
711 @end smallexample
713 @noindent
714 on the last Monday of every month.
716   The generality of sexp diary entries lets you specify any diary
717 entry that you can describe algorithmically.  A sexp diary entry
718 contains an expression that computes whether the entry applies to any
719 given date.  If its value is non-@code{nil}, the entry applies to that
720 date; 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
723 calendar.
725   The sexp diary entry applies to a date when the expression's value
726 is non-@code{nil}, but some values have more specific meanings.  If
727 the value is a string, that string is a description of the event which
728 occurs on that date.  The value can also have the form
729 @code{(@var{mark} . @var{string})}; then @var{mark} specifies how to
730 mark the date in the calendar, and @var{string} is the description of
731 the event.  If @var{mark} is a single-character string, that character
732 appears next to the date in the calendar.  If @var{mark} is a face
733 name, the date is displayed in that face.  If @var{mark} is
734 @code{nil}, that specifies no particular highlighting for the date.
736   Suppose you get paid on the 21st of the month if it is a weekday, and
737 on the Friday before if the 21st is on a weekend.  Here is how to write
738 a sexp diary entry that matches those dates:
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
748   The following sexp diary entries take advantage of the ability (in the fancy
749 diary display) to concoct diary entries whose text varies based on the date:
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)
763 Make a diary entry for the local times of today's sunrise and sunset.
764 @item %%(diary-phases-of-moon)
765 Make a diary entry for the phases (quarters) of the moon.
766 @item %%(diary-day-of-year)
767 Make a diary entry with today's day number in the current year and the number
768 of days remaining in the current year.
769 @item %%(diary-iso-date)
770 Make a diary entry with today's equivalent ISO commercial date.
771 @item %%(diary-julian-date)
772 Make a diary entry with today's equivalent date on the Julian calendar.
773 @item %%(diary-astro-day-number)
774 Make a diary entry with today's equivalent astronomical (Julian) day number.
775 @item %%(diary-hebrew-date)
776 Make a diary entry with today's equivalent date on the Hebrew calendar.
777 @item %%(diary-islamic-date)
778 Make a diary entry with today's equivalent date on the Islamic calendar.
779 @item %%(diary-french-date)
780 Make a diary entry with today's equivalent date on the French Revolutionary
781 calendar.
782 @item %%(diary-mayan-date)
783 Make a diary entry with today's equivalent date on the Mayan calendar.
784 @end table
786 @noindent
787 Thus including the diary entry
789 @example
790 &%%(diary-hebrew-date)
791 @end example
793 @noindent
794 causes every day's diary display to contain the equivalent date on the
795 Hebrew calendar, if you are using the fancy diary display.  (With simple
796 diary display, the line @samp{&%%(diary-hebrew-date)} appears in the
797 diary for any date, but does nothing particularly useful.)
799   These functions can be used to construct sexp diary entries based on
800 the Hebrew calendar in certain standard ways:
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)
814 Make a diary entry that tells the occurrence and ritual announcement of each
815 new Hebrew month.
816 @item %%(diary-parasha)
817 Make a Saturday diary entry that tells the weekly synagogue scripture reading.
818 @item %%(diary-sabbath-candles)
819 Make a Friday diary entry that tells the @emph{local time} of Sabbath
820 candle lighting.
821 @item %%(diary-omer)
822 Make a diary entry that gives the omer count, when appropriate.
823 @item %%(diary-yahrzeit @var{month} @var{day} @var{year}) @var{name}
824 Make a diary entry marking the anniversary of a date of death.  The date
825 is the @emph{Gregorian} (civil) date of death.  The diary entry appears
826 on the proper Hebrew calendar anniversary and on the day before.  (In
827 the European style, the order of the parameters is changed to @var{day},
828 @var{month}, @var{year}.)
829 @end table
831   All the functions documented above take an optional argument
832 @var{mark} which specifies how to mark the date in the calendar display.
833 If one of these functions decides that it applies to a certain date,
834 it returns a value that contains @var{mark}.
836 @ignore
837    arch-tag: 52cb299f-fd1f-4616-bfe6-91b988669431
838 @end ignore