(printchar, strout): Use FRAME_PTR, not struct frame *.
[emacs.git] / lispref / calendar.texi
blobc23090bff4d5ce888d9b154c922691ebe34a2d4d
1 @c -*-texinfo-*-
2 @c This is part of the GNU Emacs Lisp Reference Manual.
3 @c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. 
4 @c See the file elisp.texi for copying conditions.
5 @node Calendar, Tips, Display, Top
6 @chapter Customizing the Calendar and Diary
8   There are many customizations that you can use to make the calendar and
9 diary suit your personal tastes.
11 @menu
12 * Calendar Customizing::   Defaults you can set.
13 * Holiday Customizing::    Defining your own holidays.
14 * Date Display Format::    Changing the format.
15 * Time Display Format::    Changing the format.
16 * Daylight Savings::       Changing the default.
17 * Diary Customizing::      Defaults you can set.
18 * Hebrew/Islamic Entries:: How to obtain them.
19 * Fancy Diary Display::    Enhancing the diary display, sorting entries.
20 * Included Diary Files::   Sharing a common diary file.
21 * Sexp Diary Entries::     Fancy things you can do.
22 * Appt Customizing::       Customizing appointment reminders.
23 @end menu
25 @node Calendar Customizing
26 @section Customizing the Calendar
27 @vindex view-diary-entries-initially
29   If you set the variable @code{view-diary-entries-initially} to
30 @code{t}, calling up the calendar automatically displays the diary
31 entries for the current date as well.  The diary dates appear only if
32 the current date is visible.  If you add both of the following lines to
33 your @file{.emacs} file:@refill
35 @example
36 (setq view-diary-entries-initially t)
37 (calendar)
38 @end example
40 @noindent
41 they display both the calendar and diary windows whenever you start Emacs.
43 @vindex view-calendar-holidays-initially
44   Similarly, if you set the variable
45 @code{view-calendar-holidays-initially} to @code{t}, entering the
46 calendar automatically displays a list of holidays for the current three
47 month period.  The holiday list appears in a separate window.@refill
49 @vindex mark-diary-entries-in-calendar
50   You can set the variable @code{mark-diary-entries-in-calendar} to @code{t}
51 in order to place a plus sign (@samp{+}) beside any dates with diary entries.
52 Whenever the calendar window is displayed or redisplayed, the diary entries
53 are automatically marked for holidays.
55 @vindex mark-holidays-in-calendar
56   Similarly, setting the variable @code{mark-holidays-in-calendar} to
57 @code{t} places an asterisk (@samp{*}) after all holiday dates visible
58 in the calendar window.
60 @vindex calendar-load-hook
61   There are many customizations that you can make with the hooks
62 provided.  For example, the variable @code{calendar-load-hook}, whose
63 default value is @code{nil}, is a normal hook run when the calendar
64 package is first loaded (before actually starting to display the
65 calendar).
67 @vindex initial-calendar-window-hook
68   The variable @code{initial-calendar-window-hook}, whose default value
69 is @code{nil}, is a normal hook run the first time the calendar window
70 is displayed.  The function is invoked only when you first enter
71 Calendar mode, not when you redisplay an existing Calendar window.  But
72 if you leave the calendar with the @kbd{q} command and reenter it, the
73 hook runs again.@refill
75 @vindex today-visible-calendar-hook
76   The variable @code{today-visible-calendar-hook}, whose default value
77 is @code{nil}, is a normal hook run after the calendar buffer has been
78 prepared with the calendar when the current date is visible in the
79 window.  One use of this hook is to replace today's date with asterisks;
80 a function @code{calendar-star-date} is included for this purpose.  In
81 your @file{.emacs} file, put:@refill
83 @findex calendar-star-date
84 @example
85 (setq today-visible-calendar-hook 'calendar-star-date)
86 @end example
88 @noindent
89 Another standard hook function adds asterisks around the current date.
90 Here's how to use it:
92 @findex calendar-mark-today
93 @example
94 (setq today-visible-calendar-hook 'calendar-mark-today)
95 @end example
97 @vindex today-invisible-calendar-hook
98 @noindent
99   A corresponding variable, @code{today-invisible-calendar-hook}, whose
100 default value is @code{nil}, is a normal hook run after the calendar
101 buffer text has been prepared, if the current date is @emph{not} visible
102 in the window.@refill
104 @node Holiday Customizing
105 @section Customizing the Holidays
107 @vindex calendar-holidays
108 @vindex christian-holidays
109 @vindex hebrew-holidays
110 @vindex islamic-holidays
111   Emacs knows about holidays defined by entries on one of several lists.
112 You can customize theses lists of holidays to your own needs, adding
113 holidays or deleting lists of holidays.  The lists of holidays that
114 Emacs uses are for general holidays (@code{general-holidays}), local
115 holidays (@code{local-holidays}), Christian holidays
116 (@code{christian-holidays}), Hebrew (Jewish) holidays
117 (@code{hebrew-holidays}), Islamic (Moslem) holidays
118 (@code{islamic-holidays}), and other holidays (@code{other-holidays}).
120 @vindex general-holidays
121   The general holidays are, by default, holidays common throughout the
122 United States.  To eliminate these holidays, set @code{general-holidays}
123 to @code{nil}.
125 @vindex local-holidays
126   There are no default local holidays (but sites may supply some).  You
127 can set the variable @code{local-holidays} to any list of holidays, as
128 described below.
130 @vindex all-christian-calendar-holidays
131 @vindex all-hebrew-calendar-holidays
132 @vindex all-islamic-calendar-holidays
133   By default, Emacs does not consider all the holidays of these
134 religions, only those commonly found in secular calendars.  For a more
135 extensive collection of religious holidays, you can set any (or all) of
136 the variables @code{all-christian-calendar-holidays},
137 @code{all-hebrew-calendar-holidays}, or
138 @code{all-islamic-calendar-holidays} to @code{t}.  If you want to
139 eliminate the religious holidays, set any or all of the corresponding
140 variables @code{christian-holidays}, @code{hebrew-holidays}, and
141 @code{islamic-holidays} to @code{nil}.@refill
143 @vindex other-holidays
144   You can set the variable @code{other-holidays} to any list of
145 holidays.  This list, normally empty, is intended for your use.
147 @cindex holiday forms
148   Each of the lists (@code{general-holidays}, @code{local-holidays},
149 @code{christian-holidays}, @code{hebrew-holidays},
150 @code{islamic-holidays}, and @code{other-holidays}) is a list of
151 @dfn{holiday forms}, each holiday form describing a holiday (or
152 sometimes a list of holidays).  Holiday forms may have the following
153 formats:
155 @table @code
156 @item (holiday-fixed @var{month} @var{day} @var{string})
157 A fixed date on the Gregorian calendar.  @var{month} and @var{day} are
158 numbers, @var{string} is the name of the holiday.
160 @item (holiday-float @var{month} @var{dayname} @var{k} @var{string})
161 The @var{k}th @var{dayname} in @var{month} on the Gregorian calendar
162 (@var{dayname}=0 for Sunday, and so on); negative @var{k} means count back
163 from the end of the month.  @var{string} is the name of the holiday.
165 @item (holiday-hebrew @var{month} @var{day} @var{string})
166 A fixed date on the Hebrew calendar.  @var{month} and @var{day} are
167 numbers, @var{string} is the name of the holiday.
169 @item (holiday-islamic @var{month} @var{day} @var{string})
170 A fixed date on the Islamic calendar.  @var{month} and @var{day} are
171 numbers, @var{string} is the name of the holiday.
173 @item (holiday-julian @var{month} @var{day} @var{string})
174 A fixed date on the Julian calendar.  @var{month} and @var{day} are
175 numbers, @var{string} is the name of the holiday.
177 @item (holiday-sexp @var{sexp} @var{string})
178 @var{sexp} is a Lisp expression that should use the variable @code{year}
179 to compute the date of a holiday, or @code{nil} if the holiday doesn't
180 happen this year.  The value represents the date as a list of the form
181 @code{(@var{month} @var{day} @var{year})}.  @var{string} is the name of
182 the holiday.
184 @item (if @var{boolean} @var{holiday-form} &optional @var{holiday-form})
185 A choice between two holidays based on the value of @var{boolean}.
187 @item (@var{function} &optional @var{args})
188 Dates requiring special computation; @var{args}, if any, are passed in
189 a list to the function @code{calendar-holiday-function-@var{function}}.
190 @end table
192   For example, suppose you want to add Bastille Day, celebrated in
193 France on July 14.  You can do this by adding the following line
194 to your @file{.emacs} file:
196 @smallexample
197 (setq other-holidays '((holiday-fixed 7 14 "Bastille Day")))
198 @end smallexample
200 @noindent
201 The holiday form @code{(holiday-fixed 7 14 "Bastille Day")} specifies the
202 fourteenth day of the seventh month (July).
204   Many holidays occur on a specific day of the week, at a specific time
205 of month.  Here is a holiday form describing Hurricane Supplication Day,
206 celebrated in the Virgin Islands on the fourth Monday in August:
208 @smallexample
209 (holiday-float 8 1 4 "Hurricane Supplication Day")
210 @end smallexample
212 @noindent
213 Here the 8 specifies August, the 1 specifies Monday (Sunday is 0,
214 Tuesday is 2, and so on), and the 4 specifies the fourth occurrence in
215 the month (1 specifies the first occurrence, 2 the second occurrence,
216 @minus{}1 the last occurrence, @minus{}2 the second-to-last occurrence, and
217 so on).
219   You can specify holidays that occur on fixed days of the Hebrew,
220 Islamic, and Julian calendars too.  For example,
222 @smallexample
223 (setq other-holidays
224       '((holiday-hebrew 10 2 "Last day of Hanukkah")
225         (holiday-islamic 3 12 "Mohammed's Birthday")
226         (holiday-julian 4 2 "Jefferson's Birthday")))
227 @end smallexample
229 @noindent
230 adds the last day of Hanukkah (since the Hebrew months are numbered with
231 1 starting from Nisan), the Islamic feast celebrating Mohammed's
232 birthday (since the Islamic months are numbered from 1 starting with
233 Muharram), and Thomas Jefferson's birthday, which is 2 April 1743 on the
234 Julian calendar.
236   To include a holiday conditionally, use either the @samp{if} or the
237 @samp{sexp} form.  For example, American presidential elections occur on
238 the first Tuesday after the first Monday in November of years divisible
239 by 4:
241 @smallexample
242 (holiday-sexp (if (= 0 (% year 4))
243                    (calendar-gregorian-from-absolute
244                  (1+ (calendar-dayname-on-or-before
245                        1 (+ 6 (calendar-absolute-from-gregorian
246                                 (list 11 1 year))))))
247               "US Presidential Election"))
248 @end smallexample
250 @noindent
253 @smallexample
254 (if (= 0 (% displayed-year 4))
255     (fixed 11
256            (extract-calendar-day
257              (calendar-gregorian-from-absolute
258                (1+ (calendar-dayname-on-or-before
259                      1 (+ 6 (calendar-absolute-from-gregorian
260                               (list 11 1 displayed-year)))))))
261            "US Presidential Election"))
262 @end smallexample
264   Some holidays just don't fit into any of these forms because special
265 calculations are involved in their determination.  In such cases you
266 must write a Lisp function to do the calculation.  To include
267 eclipses of the sun, for example, add @code{(eclipses)} to
268 @code{other-holidays} and write an Emacs Lisp function
269 @code{eclipses} that returns a (possibly
270 empty) list of the relevant Gregorian dates among the
271 range visible in the calendar window, with descriptive strings, like
272 this:
274 @smallexample
275 (((6 27 1991) "Lunar Eclipse") ((7 11 1991) "Solar Eclipse") ... )
276 @end smallexample
278 @node Date Display Format
279 @section Date Display Format
280 @vindex calendar-date-display-form
282   You can customize the manner of displaying dates in the diary,
283 in mode lines, and in messages by setting
284 @code{calendar-date-display-form}.  This variable is a list of
285 expressions that can involve the variables @code{month}, @code{day}, and
286 @code{year}, all numbers in string form, and @code{monthname} and
287 @code{dayname}, both alphabetic strings.  In the American style, the
288 default value of this list is as follows:
290 @smallexample
291 ((if dayname (concat dayname ", ")) monthname " " day ", " year)
292 @end smallexample
294 @noindent
295 while in the European style this value is the default:
297 @smallexample
298 ((if dayname (concat dayname ", ")) day " " monthname " " year)
299 @end smallexample
301 The ISO standard date representation is this:
303 @smallexample
304 (year "-" month "-" day)
305 @end smallexample
307 @noindent
308 This specifies a typical American format:
310 @smallexample
311 (month "/" day "/" (substring year -2))
312 @end smallexample
314 @node Time Display Format
315 @section Time Display Format
316 @vindex calendar-time-display-form
318   In the calendar, diary, and related buffers, Emacs displays times of
319 day in the conventional American style with the hours from 1 through 12,
320 minutes, and either @samp{am} or @samp{pm}.  If you prefer the
321 ``military'' (European) style of writing times---in which the hours go
322 from 00 to 23---you can alter the variable
323 @code{calendar-time-display-form}.  This variable is a list of
324 expressions that can involve the variables @code{12-hours},
325 @code{24-hours}, and @code{minutes}, all numbers in string form, and
326 @code{am-pm} and @code{time-zone}, both alphabetic strings.  The default
327 definition of @code{calendar-time-display-form} is as follows:
329 @smallexample
330 (12-hours ":" minutes am-pm
331           (if time-zone " (") time-zone (if time-zone ")"))
332 @end smallexample
334   Setting @code{calendar-time-display-form} to
336 @smallexample
337 (24-hours ":" minutes
338           (if time-zone " (") time-zone (if time-zone ")"))
339 @end smallexample
341 @noindent
342 gives military-style times like @samp{21:07 (UT)} if time zone names are
343 defined, and times like @samp{21:07} if they are not.
345 @node Daylight Savings
346 @section Daylight Savings Time
347 @cindex daylight savings time
349   Emacs understands the difference between standard time and daylight
350 savings time---the times given for sunrise, sunset, solstices,
351 equinoxes, and the phases of the moon take that into account.  The rules
352 for daylight savings time vary from place to place and have also varied
353 historically from year to year.  To do the job properly, Emacs needs to
354 know which rules to use.
356   Some operating systems keep track of the rules that apply to the place
357 where you are; on these systems, Emacs gets the information it needs
358 from the system automatically.  If some or all of this information is
359 missing, Emacs fills in the gaps with the rules currently used in
360 Cambridge, Massachusetts.  If the default choice of rules is not
361 appropriate for your location, you can tell Emacs the rules to use by
362 setting certain variables.
364 @vindex calendar-daylight-savings-starts
365 @vindex calendar-daylight-savings-ends
366   These variables are @code{calendar-daylight-savings-starts} together
367 with @code{calendar-daylight-savings-ends}.  Their values should be Lisp
368 expressions that refer to the variable @code{year}, and evaluate to the
369 Gregorian date on which daylight savings time starts or (respectively)
370 ends, in the form of a list @code{(@var{month} @var{day} @var{year})}.
371 The values should be @code{nil} if your area does not use daylight
372 savings time.
374   Emacs uses these expressions to determine the starting date of
375 daylight savings time for the holiday list and for correcting times of
376 day in the solar and lunar calculations.
378   The values for Cambridge, Massachusetts are as follows:
380 @example
381 @group
382 (calendar-nth-named-day 1 0 4 year)
383 (calendar-nth-named-day -1 0 10 year)
384 @end group
385 @end example
387 @noindent
388 i.e., the first 0th day (Sunday) of the fourth month (April) in
389 the year specified by @code{year}, and the last Sunday of the tenth month
390 (October) of that year.  If daylight savings time were
391 changed to start on October 1, you would set
392 @code{calendar-daylight-savings-starts} to this:
394 @example
395 (list 10 1 year)
396 @end example
398   For a more complex example, suppose daylight savings time begins on
399 the first of Nisan on the Hebrew calendar.  You would set
400 @code{calendar-daylight-savings-starts} as follows:
402 @example
403 (calendar-gregorian-from-absolute
404   (calendar-absolute-from-hebrew
405     (list 1 1 (+ year 3760))))
406 @end example
408 @noindent
409 because Nisan is the first month in the Hebrew calendar and the Hebrew
410 year differs from the Gregorian year by 3760 at Nisan.
412   If there is no daylight savings time at your location, or if you want
413 all times in standard time, set @code{calendar-daylight-savings-starts}
414 and @code{calendar-daylight-savings-ends} to @code{nil}.
416 @vindex calendar-daylight-time-offset
417   This variable specifies the difference between daylight savings time and
418 standard time, measured in minutes.  The value for Cambridge is 60.
420 @vindex calendar-daylight-savings-starts-time
421 @vindex calendar-daylight-savings-ends-time
422   These variables specify is the number of minutes after midnight local time
423 when the transition to and from daylight savings time should occur.  For
424 Cambridge, both variables' values are 120.
426 @node Diary Customizing
427 @section Customizing the Diary
429 @vindex holidays-in-diary-buffer
430   Ordinarily, the mode line of the diary buffer window indicates any
431 holidays that fall on the date of the diary entries.  The process of
432 checking for holidays can take several seconds, so including holiday
433 information delays the display of the diary buffer noticeably.  If you'd
434 prefer to have a faster display of the diary buffer but without the
435 holiday information, set the variable @code{holidays-in-diary-buffer} to
436 @code{nil}.@refill
438 @vindex number-of-diary-entries
439   The variable @code{number-of-diary-entries} controls the number of
440 days of diary entries to be displayed at one time.  It affects the
441 initial display when @code{view-diary-entries-initially} is @code{t}, as
442 well as the command @kbd{M-x diary}.  For example, the default value is
443 1, which says to display only the current day's diary entries.  If the
444 value is 2, both the current day's and the next day's entries are
445 displayed.  The value can also be a vector of seven elements: if the
446 value is @code{[0 2 2 2 2 4 1]} then no diary entries appear on Sunday,
447 the current date's and the next day's diary entries appear Monday
448 through Thursday, Friday through Monday's entries appear on Friday,
449 while on Saturday only that day's entries appear.
451 @vindex print-diary-entries-hook
452 @findex print-diary-entries
453   The variable @code{print-diary-entries-hook} is a normal hook run
454 after preparation of a temporary buffer containing just the diary
455 entries currently visible in the diary buffer.  (The other, irrelevant
456 diary entries are really absent from the temporary buffer; in the diary
457 buffer, they are merely hidden.)  The default value of this hook does
458 the printing with the command @code{lpr-buffer}.  If you want to use a
459 different command to do the printing, just change the value of this
460 hook.  Other uses might include, for example, rearranging the lines into
461 order by day and time.
463 @vindex diary-date-forms
464   You can customize the form of dates in your diary file, if neither the
465 standard American nor European styles suits your needs, by setting the
466 variable @code{diary-date-forms}.  This variable is a list of forms of
467 dates recognized in the diary file.  Each form is a list of regular
468 expressions (@pxref{Regular Expressions}) and the variables
469 @code{month}, @code{day}, @code{year}, @code{monthname}, and
470 @code{dayname}.  The variable @code{monthname} matches the name of the
471 month, capitalized or not, or its three-letter abbreviation, followed by
472 a period or not; it matches @samp{*}.  Similarly, @code{dayname} matches
473 the name of the day, capitalized or not, or its three-letter
474 abbreviation, followed by a period or not.  The variables @code{month},
475 @code{day}, and @code{year} match those numerical values, preceded by
476 arbitrarily many zeros; they also match @samp{*}.  The default value of
477 @code{diary-date-forms} in the American style is
479 @example
480 ((month "/" day "[^/0-9]")
481  (month "/" day "/" year "[^0-9]")
482  (monthname " *" day "[^,0-9]")
483  (monthname " *" day ", *" year "[^0-9]")
484  (dayname "\\W"))
485 @end example
487 @noindent
488 Emacs matches of the diary entries with the date forms is done with the
489 standard syntax table from Fundamental mode (@pxref{Syntax Tables}), but
490 with the @samp{*} changed so that it is a word constituent.
492   The forms on the list must be @emph{mutually exclusive} and must not
493 match any portion of the diary entry itself, just the date.  If, to be
494 mutually exclusive, the pattern must match a portion of the diary entry
495 itself, the first element of the form @emph{must} be @code{backup}.
496 This causes the date recognizer to back up to the beginning of the
497 current word of the diary entry.  Even if you use @code{backup}, the
498 form must absolutely not match more than a portion of the first word of
499 the diary entry.  The default value of @code{diary-date-forms} in the
500 European style is this list:
502 @example
503 ((day "/" month "[^/0-9]")
504  (day "/" month "/" year "[^0-9]")
505  (backup day " *" monthname "\\W+\\<[^*0-9]")
506  (day " *" monthname " *" year "[^0-9]")
507  (dayname "\\W"))
508 @end example
510 @noindent
511 Notice the use of @code{backup} in the middle form because part of the
512 diary entry must be matched to distinguish this form from the following one.
514 @node Hebrew/Islamic Entries
515 @section Hebrew- and Islamic-Date Diary Entries
517   Your diary file can have entries based on Hebrew or Islamic dates, as
518 well as entries based on our usual Gregorian calendar.  However, because
519 the processing of such entries is time-consuming and most people don't
520 need them, you must customize the processing of your diary file to
521 specify that you want such entries recognized.  If you want Hebrew-date
522 diary entries, for example, you must include these lines in your
523 @file{.emacs} file:
525 @vindex nongregorian-diary-listing-hook
526 @vindex nongregorian-diary-marking-hook
527 @findex list-hebrew-diary-entries
528 @findex mark-hebrew-diary-entries
529 @smallexample
530 (setq nongregorian-diary-listing-hook 'list-hebrew-diary-entries)
531 (setq nongregorian-diary-marking-hook 'mark-hebrew-diary-entries)
532 @end smallexample
534 @noindent
535 If you want Islamic-date entries, include these lines in your
536 @file{.emacs} file:
538 @findex list-islamic-diary-entries
539 @findex mark-islamic-diary-entries
540 @smallexample
541 (setq nongregorian-diary-listing-hook 'list-islamic-diary-entries)
542 (setq nongregorian-diary-marking-hook 'mark-islamic-diary-entries)
543 @end smallexample
545 @noindent
546 If you want both Hebrew- and Islamic-date entries, include these lines:
548 @smallexample
549 (setq nongregorian-diary-listing-hook
550       '(list-hebrew-diary-entries list-islamic-diary-entries))
551 (setq nongregorian-diary-marking-hook
552       '(mark-hebrew-diary-entries mark-islamic-diary-entries))
553 @end smallexample
555   Hebrew- and Islamic-date diary entries have the same formats as
556 Gregorian-date diary entries, except that the date must be preceded with
557 an @samp{H} for Hebrew dates and an @samp{I} for Islamic dates.
558 Moreover, because the Hebrew and Islamic month names are not uniquely
559 specified by the first three letters, you may not abbreviate them.  For
560 example, a diary entry for the Hebrew date Heshvan 25 could look like
562 @smallexample
563 HHeshvan 25 Happy Hebrew birthday!
564 @end smallexample
566 @noindent
567 and would appear in the diary for any date that corresponds to Heshvan 25
568 on the Hebrew calendar.  Similarly, an Islamic-date diary entry might be
570 @smallexample
571 IDhu al-Qada 25 Happy Islamic birthday!
572 @end smallexample
574 @noindent
575 and would appear in the diary for any date that corresponds to Dhu al-Qada 25
576 on the Islamic calendar.
578   As with Gregorian-date diary entries, Hebrew- and Islamic-date entries
579 are nonmarking if they are preceded with an ampersand (@samp{&}).
581   There are commands to help you in making Hebrew- and Islamic-date
582 entries to your diary:
584 @table @kbd
585 @item i h d
586 Add a diary entry for the Hebrew date corresponding to the selected date
587 (@code{insert-hebrew-diary-entry}).
588 @item i h m
589 Add a diary entry for the day of the Hebrew month corresponding to the
590 selected date (@code{insert-monthly-hebrew-diary-entry}).
591 @item i h y
592 Add a diary entry for the day of the Hebrew year corresponding to the
593 selected date (@code{insert-yearly-hebrew-diary-entry}).
594 @item i i d
595 Add a diary entry for the Islamic date corresponding to the selected date
596 (@code{insert-islamic-diary-entry}).
597 @item i i m
598 Add a diary entry for the day of the Islamic month corresponding to the
599 selected date (@code{insert-monthly-islamic-diary-entry}).
600 @item i i y
601 Add a diary entry for the day of the Islamic year corresponding to the
602 selected date (@code{insert-yearly-islamic-diary-entry}).
603 @end table
605 @findex insert-hebrew-diary-entry
606 @findex insert-monthly-hebrew-diary-entry
607 @findex insert-yearly-hebrew-diary-entry
608 @findex insert-islamic-diary-entry
609 @findex insert-monthly-islamic-diary-entry
610 @findex insert-yearly-islamic-diary-entry
611   These commands work exactly like the corresponding commands for ordinary
612 diary entries: Move point to a date in the calendar window and the above
613 commands insert the Hebrew or Islamic date (corresponding to the date
614 indicated by point) at the end of your diary file and you can then type the
615 diary entry.  If you want the diary entry to be nonmarking, give a numeric
616 argument to the command.
618 @node Fancy Diary Display
619 @section Fancy Diary Display
620 @vindex diary-display-hook
621 @findex simple-diary-display
623   Diary display works by preparing the diary buffer and then running the
624 hook @code{diary-display-hook}.  The default value of this hook hides
625 the irrelevant diary entries and then displays the buffer
626 (@code{simple-diary-display}).  However, if you specify the hook as
627 follows,
629 @cindex diary buffer
630 @findex fancy-diary-display
631 @example
632 (add-hook 'diary-display-hook 'fancy-diary-display)
633 @end example
635 @noindent
636 then fancy mode displays diary entries and holidays by copying them into
637 a special buffer that exists only for display.  Copying provides an
638 opportunity to change the displayed text to make it prettier---for
639 example, to sort the entries by the dates they apply to.
641   As with simple diary display, you can print a hard copy of the buffer
642 with @code{print-diary-entries}.  To print a hard copy of a day-by-day
643 diary for a week by positioning point on Sunday of that week, type
644 @kbd{7 d} and then do @kbd{M-x print-diary-entries}.  As usual, the
645 inclusion of the holidays slows down the display slightly; you can speed
646 things up by setting the variable @code{holidays-in-diary-buffer} to
647 @code{nil}.
649 @vindex diary-list-include-blanks
650   Ordinarily, the fancy diary buffer does not show days for which there are
651 no diary entries, even if that day is a holiday.  If you want such days to be
652 shown in the fancy diary buffer, set the variable
653 @code{diary-list-include-blanks} to @code{t}.@refill
655 @cindex sorting diary entries
656   If you use the fancy diary display, you can use the normal hook
657 @code{list-diary-entries-hook} to sort each day's diary entries by their
658 time of day.  Add this line to your @file{.emacs} file:
660 @findex sort-diary-entries
661 @example
662 (add-hook 'list-diary-entries-hook 'sort-diary-entries)
663 @end example
665 @noindent
666 For each day, this sorts diary entries that begin with a recognizable
667 time of day according to their times.  Diary entries without times come
668 first within each day.
670 @node Included Diary Files
671 @section Included Diary Files
673   If you use the fancy diary display, you can have diary entries from other
674 files included with your own by an ``include'' mechanism.  This facility makes
675 possible the sharing of common diary files among groups of users.  Lines in
676 the diary file of this form:
678 @smallexample
679 #include "@var{filename}"
680 @end smallexample
682 @noindent
683 includes the diary entries from the file @var{filename} in the fancy
684 diary buffer (because the ordinary diary buffer is just the buffer
685 associated with your diary file, you cannot use the include mechanism
686 unless you use the fancy diary buffer).  The include mechanism is
687 recursive, by the way, so that included files can include other files,
688 and so on; you must be careful not to have a cycle of inclusions, of
689 course.  To enable the include facility, add lines as follows to your
690 @file{.emacs} file:
692 @vindex list-diary-entries-hook
693 @vindex mark-diary-entries-hook
694 @findex include-other-diary-files
695 @findex mark-included-diary-files
696 @smallexample
697 (add-hook 'list-diary-entries-hook 'include-other-diary-files)
698 (add-hook 'mark-diary-entries-hook 'mark-included-diary-files)
699 @end smallexample
701 @node Sexp Diary Entries
702 @section Sexp Entries and the Fancy Diary Display
703 @cindex sexp diary entries
705   Sexp diary entries allow you to do more than just have complicated
706 conditions under which a diary entry applies.  If you use the fancy
707 diary display, sexp entries can generate the text of the entry depending
708 on the date itself.  For example, an anniversary diary entry can insert
709 the number of years since the anniversary date into the text of the
710 diary entry.  Thus the @samp{%d} in this dairy entry:
712 @findex diary-anniversary
713 @smallexample
714 %%(diary-anniversary 10 31 1948) Arthur's birthday (%d years old)
715 @end smallexample
717 @noindent
718 gets replaced by the age, so on October 31, 1990 the entry appears in
719 the fancy diary buffer like this:
721 @smallexample
722 Arthur's birthday (42 years old)
723 @end smallexample
725 @noindent
726 If the diary file instead contains this entry:
728 @smallexample
729 %%(diary-anniversary 10 31 1948) Arthur's %d%s birthday
730 @end smallexample
732 @noindent
733 the entry in the fancy diary buffer for October 31, 1990 appears like this:
735 @smallexample
736 Arthur's 42nd birthday
737 @end smallexample
739   Similarly, cyclic diary entries can interpolate the number of repetitions
740 that have occurred:
742 @findex diary-cyclic
743 @smallexample
744 %%(diary-cyclic 50 1 1 1990) Renew medication (%d%s time)
745 @end smallexample
747 @noindent
748 looks like this:
750 @smallexample
751 Renew medication (5th time)
752 @end smallexample
754 @noindent
755 in the fancy diary display on September 8, 1990.
757   The generality of sexp diary entries lets you specify any diary entry
758 that you can describe algorithmically.  Suppose you get paid on the 21st
759 of the month if it is a weekday, and to the Friday before if the 21st is
760 on a weekend.  The diary entry
762 @smallexample
763 &%%(let ((dayname (calendar-day-of-week date))
764          (day (car (cdr date))))
765       (or (and (= day 21) (memq dayname '(1 2 3 4 5)))
766           (and (memq day '(19 20)) (= dayname 5)))
767          ) Pay check deposited
768 @end smallexample
770 @noindent
771 applies to just those dates.  This example illustrates how the sexp can
772 depend on the variable @code{date}; this variable is a list (@var{month}
773 @var{day} @var{year}) that gives the Gregorian date for which the diary
774 entries are being found.  If the value of the expression is @code{t},
775 the entry applies to that date.  If the expression evaluates to
776 @code{nil}, the entry does @emph{not} apply to that date.
778   The following sexp diary entries take advantage of the ability (in the fancy
779 diary display) to concoct diary entries based on the date:
781 @findex diary-sunrise-sunset
782 @findex diary-phases-of-moon
783 @findex diary-day-of-year
784 @findex diary-iso-date
785 @findex diary-julian-date
786 @findex diary-astro-day-number
787 @findex diary-hebrew-date
788 @findex diary-islamic-date
789 @findex diary-french-date
790 @findex diary-mayan-date
791 @table @code
792 @item %%(diary-sunrise-sunset)
793 Make a diary entry for the local times of today's sunrise and sunset.
794 @item %%(diary-phases-of-moon)
795 Make a diary entry for the phases (quarters) of the moon.
796 @item %%(diary-day-of-year)
797 Make a diary entry with today's day number in the current year and the number
798 of days remaining in the current year.
799 @item %%(diary-iso-date)
800 Make a diary entry with today's equivalent ISO commercial date.
801 @item %%(diary-julian-date)
802 Make a diary entry with today's equivalent date on the Julian calendar.
803 @item %%(diary-astro-day-number)
804 Make a diary entry with today's equivalent astronomical (Julian) day number.
805 @item %%(diary-hebrew-date)
806 Make a diary entry with today's equivalent date on the Hebrew calendar.
807 @item %%(diary-islamic-date)
808 Make a diary entry with today's equivalent date on the Islamic calendar.
809 @item %%(diary-french-date)
810 Make a diary entry with today's equivalent date on the French Revolutionary
811 calendar.
812 @item %%(diary-mayan-date)
813 Make a diary entry with today's equivalent date on the Mayan calendar.
814 @end table
816 @noindent
817 Thus including the diary entry
819 @smallexample
820 &%%(diary-hebrew-date)
821 @end smallexample
823 @noindent
824 causes every day's diary display to contain the equivalent date on the
825 Hebrew calendar, if you are using the fancy diary display.  (With simple
826 diary display, the line @samp{&%%(diary-hebrew-date)} appears in the
827 diary for any date, but does nothing particularly useful.)
829   There are a number of other available sexp diary entries that are important
830 to those who follow the Hebrew calendar:
832 @cindex rosh hodesh
833 @findex diary-rosh-hodesh
834 @cindex parasha, weekly
835 @findex diary-parasha
836 @cindex candle lighting times
837 @findex diary-sabbath-candles
838 @cindex omer count
839 @findex diary-omer
840 @cindex yahrzeits
841 @findex diary-yahrzeit
842 @table @code
843 @item %%(diary-rosh-hodesh)
844 Make a diary entry that tells the occurrence and ritual announcement of each
845 new Hebrew month.
846 @item %%(diary-parasha)
847 Make a Saturday diary entry that tells the weekly synagogue scripture reading.
848 @item %%(diary-sabbath-candles)
849 Make a Friday diary entry that tells the @emph{local time} of Sabbath
850 candle lighting.
851 @item %%(diary-omer)
852 Make a diary entry that gives the omer count, when appropriate.
853 @item %%(diary-yahrzeit @var{month} @var{day} @var{year}) @var{name}
854 Make a diary entry marking the anniversary of a date of death.  The date
855 is the @emph{Gregorian} (civil) date of death.  The diary entry appears
856 on the proper Hebrew calendar anniversary and on the day before.  (In
857 the European style, the order of the parameters is changed to @var{day},
858 @var{month}, @var{year}.)
859 @end table
861 @node Appt Customizing
862 @section Customizing Appointment Reminders
864   You can specify exactly how Emacs reminds you of an appointment and
865 how far in advance it begins doing so.  Here are the variables that you
866 can set:
868 @vindex appt-message-warning-time
869 @vindex appt-audible
870 @vindex appt-visible
871 @vindex appt-display-mode-line
872 @vindex appt-msg-window
873 @vindex appt-display-duration
874 @table @code
875 @item appt-message-warning-time
876 The time in minutes before an appointment that the reminder begins.  The
877 default is 10 minutes.
878 @item appt-audible
879 If this is @code{t} (the default), Emacs rings the terminal bell for
880 appointment reminders.
881 @item appt-visible
882 If this is @code{t} (the default), Emacs displays the appointment
883 message in echo area.
884 @item appt-display-mode-line
885 If this is @code{t} (the default), Emacs displays the number of minutes
886 to the appointment on the mode line.
887 @item appt-msg-window
888 If this is @code{t} (the default), Emacs displays the appointment
889 message in another window.
890 @item appt-display-duration
891 The number of seconds an appointment message is displayed.  The default
892 is 5 seconds.
893 @end table