comparison man/emacs-xtra.texi @ 61000:7493ddb113fc

(Advanced Calendar/Diary Usage): New section; move here from Emacs Lisp Reference Manual.
author Glenn Morris <rgm@gnu.org>
date Sat, 26 Mar 2005 17:45:40 +0000
parents aac0a33f5772
children 4030d2641654
comparison
equal deleted inserted replaced
60999:40c6fc855a82 61000:7493ddb113fc
8 @comment %**end of header 8 @comment %**end of header
9 9
10 @copying 10 @copying
11 This manual describes specialized features of Emacs. 11 This manual describes specialized features of Emacs.
12 12
13 Copyright (C) 2004 13 Copyright (C) 2004, 2005
14 Free Software Foundation, Inc. 14 Free Software Foundation, Inc.
15 15
16 @quotation 16 @quotation
17 Permission is granted to copy, distribute and/or modify this document 17 Permission is granted to copy, distribute and/or modify this document
18 under the terms of the GNU Free Documentation License, Version 1.1 or 18 under the terms of the GNU Free Documentation License, Version 1.1 or
57 57
58 @menu 58 @menu
59 * Introduction:: What documentation belongs here? 59 * Introduction:: What documentation belongs here?
60 * Autorevert:: Auto Reverting non-file buffers. 60 * Autorevert:: Auto Reverting non-file buffers.
61 * Subdir switches:: Subdirectory switches in Dired. 61 * Subdir switches:: Subdirectory switches in Dired.
62 * Advanced Calendar/Diary Usage:: Advanced Calendar/Diary customization.
62 * Index:: 63 * Index::
63 @end menu 64 @end menu
64 65
65 @node Introduction 66 @node Introduction
66 @unnumbered Introduction 67 @unnumbered Introduction
305 306
306 You can make Dired forget about all subdirectory switches and relist 307 You can make Dired forget about all subdirectory switches and relist
307 all subdirectories with the buffer's default switches using 308 all subdirectories with the buffer's default switches using
308 @kbd{M-x dired-reset-subdir-switches}. This also reverts the Dired buffer. 309 @kbd{M-x dired-reset-subdir-switches}. This also reverts the Dired buffer.
309 310
311
312 @c Moved here from the Emacs Lisp Reference Manual, 2005-03-26.
313 @node Advanced Calendar/Diary Usage
314 @chapter Customizing the Calendar and Diary
315
316 There are many customizations that you can use to make the calendar and
317 diary suit your personal tastes.
318
319 @menu
320 * Calendar Customizing:: Defaults you can set.
321 * Holiday Customizing:: Defining your own holidays.
322 * Date Display Format:: Changing the format.
323 * Time Display Format:: Changing the format.
324 * Daylight Savings:: Changing the default.
325 * Diary Customizing:: Defaults you can set.
326 * Hebrew/Islamic Entries:: How to obtain them.
327 * Fancy Diary Display:: Enhancing the diary display, sorting entries,
328 using included diary files.
329 * Sexp Diary Entries:: Fancy things you can do.
330 * Appt Customizing:: Customizing appointment reminders.
331 @end menu
332
333 @node Calendar Customizing
334 @section Customizing the Calendar
335 @vindex view-diary-entries-initially
336
337 If you set the variable @code{view-diary-entries-initially} to
338 @code{t}, calling up the calendar automatically displays the diary
339 entries for the current date as well. The diary dates appear only if
340 the current date is visible. If you add both of the following lines to
341 your init file:@refill
342
343 @example
344 (setq view-diary-entries-initially t)
345 (calendar)
346 @end example
347
348 @noindent
349 this displays both the calendar and diary windows whenever you start Emacs.
350
351 @vindex view-calendar-holidays-initially
352 Similarly, if you set the variable
353 @code{view-calendar-holidays-initially} to @code{t}, entering the
354 calendar automatically displays a list of holidays for the current
355 three-month period. The holiday list appears in a separate
356 window.
357
358 @vindex mark-diary-entries-in-calendar
359 You can set the variable @code{mark-diary-entries-in-calendar} to
360 @code{t} in order to mark any dates with diary entries. This takes
361 effect whenever the calendar window contents are recomputed. There are
362 two ways of marking these dates: by changing the face
363 (@pxref{Faces,,, elisp, the Emacs Lisp Reference Manual}), or by placing
364 a plus sign (@samp{+}) beside the date.
365
366 @vindex mark-holidays-in-calendar
367 Similarly, setting the variable @code{mark-holidays-in-calendar} to
368 @code{t} marks holiday dates, either with a change of face or with an
369 asterisk (@samp{*}).
370
371 @vindex calendar-holiday-marker
372 @vindex diary-entry-marker
373 The variable @code{calendar-holiday-marker} specifies how to mark a
374 date as being a holiday. Its value may be a single-character string
375 to insert next to the date, or a face name to use for displaying the
376 date. Likewise, the variable @code{diary-entry-marker} specifies how
377 to mark a date that has diary entries. The calendar creates faces
378 named @code{holiday-face} and @code{diary-face} for these purposes;
379 those symbols are the default values of these variables.
380
381 @vindex calendar-load-hook
382 The variable @code{calendar-load-hook} is a normal hook run when the
383 calendar package is first loaded (before actually starting to display
384 the calendar).
385
386 @vindex initial-calendar-window-hook
387 Starting the calendar runs the normal hook
388 @code{initial-calendar-window-hook}. Recomputation of the calendar
389 display does not run this hook. But if you leave the calendar with the
390 @kbd{q} command and reenter it, the hook runs again.@refill
391
392 @vindex today-visible-calendar-hook
393 The variable @code{today-visible-calendar-hook} is a normal hook run
394 after the calendar buffer has been prepared with the calendar when the
395 current date is visible in the window. One use of this hook is to
396 replace today's date with asterisks; to do that, use the hook function
397 @code{calendar-star-date}.
398
399 @findex calendar-star-date
400 @example
401 (add-hook 'today-visible-calendar-hook 'calendar-star-date)
402 @end example
403
404 @noindent
405 Another standard hook function marks the current date, either by
406 changing its face or by adding an asterisk. Here's how to use it:
407
408 @findex calendar-mark-today
409 @example
410 (add-hook 'today-visible-calendar-hook 'calendar-mark-today)
411 @end example
412
413 @noindent
414 @vindex calendar-today-marker
415 The variable @code{calendar-today-marker} specifies how to mark
416 today's date. Its value should be a single-character string to insert
417 next to the date or a face name to use for displaying the date. A
418 face named @code{calendar-today-face} is provided for this purpose;
419 that symbol is the default for this variable.
420
421 @vindex today-invisible-calendar-hook
422 @noindent
423 A similar normal hook, @code{today-invisible-calendar-hook} is run if
424 the current date is @emph{not} visible in the window.
425
426 @vindex calendar-move-hook
427 Each of the calendar cursor motion commands runs the hook
428 @code{calendar-move-hook} after it moves the cursor.
429
430 @node Holiday Customizing
431 @section Customizing the Holidays
432
433 @vindex calendar-holidays
434 @vindex christian-holidays
435 @vindex hebrew-holidays
436 @vindex islamic-holidays
437 Emacs knows about holidays defined by entries on one of several lists.
438 You can customize these lists of holidays to your own needs, adding or
439 deleting holidays. The lists of holidays that Emacs uses are for
440 general holidays (@code{general-holidays}), local holidays
441 (@code{local-holidays}), Christian holidays (@code{christian-holidays}),
442 Hebrew (Jewish) holidays (@code{hebrew-holidays}), Islamic (Muslim)
443 holidays (@code{islamic-holidays}), and other holidays
444 (@code{other-holidays}).
445
446 @vindex general-holidays
447 The general holidays are, by default, holidays common throughout the
448 United States. To eliminate these holidays, set @code{general-holidays}
449 to @code{nil}.
450
451 @vindex local-holidays
452 There are no default local holidays (but sites may supply some). You
453 can set the variable @code{local-holidays} to any list of holidays, as
454 described below.
455
456 @vindex all-christian-calendar-holidays
457 @vindex all-hebrew-calendar-holidays
458 @vindex all-islamic-calendar-holidays
459 By default, Emacs does not include all the holidays of the religions
460 that it knows, only those commonly found in secular calendars. For a
461 more extensive collection of religious holidays, you can set any (or
462 all) of the variables @code{all-christian-calendar-holidays},
463 @code{all-hebrew-calendar-holidays}, or
464 @code{all-islamic-calendar-holidays} to @code{t}. If you want to
465 eliminate the religious holidays, set any or all of the corresponding
466 variables @code{christian-holidays}, @code{hebrew-holidays}, and
467 @code{islamic-holidays} to @code{nil}.@refill
468
469 @vindex other-holidays
470 You can set the variable @code{other-holidays} to any list of
471 holidays. This list, normally empty, is intended for individual use.
472
473 @cindex holiday forms
474 Each of the lists (@code{general-holidays}, @code{local-holidays},
475 @code{christian-holidays}, @code{hebrew-holidays},
476 @code{islamic-holidays}, and @code{other-holidays}) is a list of
477 @dfn{holiday forms}, each holiday form describing a holiday (or
478 sometimes a list of holidays).
479
480 Here is a table of the possible kinds of holiday form. Day numbers
481 and month numbers count starting from 1, but ``dayname'' numbers
482 count Sunday as 0. The element @var{string} is always the
483 name of the holiday, as a string.
484
485 @table @code
486 @item (holiday-fixed @var{month} @var{day} @var{string})
487 A fixed date on the Gregorian calendar.
488
489 @item (holiday-float @var{month} @var{dayname} @var{k} @var{string})
490 The @var{k}th @var{dayname} in @var{month} on the Gregorian calendar
491 (@var{dayname}=0 for Sunday, and so on); negative @var{k} means count back
492 from the end of the month.
493
494 @item (holiday-hebrew @var{month} @var{day} @var{string})
495 A fixed date on the Hebrew calendar.
496
497 @item (holiday-islamic @var{month} @var{day} @var{string})
498 A fixed date on the Islamic calendar.
499
500 @item (holiday-julian @var{month} @var{day} @var{string})
501 A fixed date on the Julian calendar.
502
503 @item (holiday-sexp @var{sexp} @var{string})
504 A date calculated by the Lisp expression @var{sexp}. The expression
505 should use the variable @code{year} to compute and return the date of a
506 holiday, or @code{nil} if the holiday doesn't happen this year. The
507 value of @var{sexp} must represent the date as a list of the form
508 @code{(@var{month} @var{day} @var{year})}.
509
510 @item (if @var{condition} @var{holiday-form})
511 A holiday that happens only if @var{condition} is true.
512
513 @item (@var{function} @r{[}@var{args}@r{]})
514 A list of dates calculated by the function @var{function}, called with
515 arguments @var{args}.
516 @end table
517
518 For example, suppose you want to add Bastille Day, celebrated in
519 France on July 14. You can do this as follows:
520
521 @smallexample
522 (setq other-holidays '((holiday-fixed 7 14 "Bastille Day")))
523 @end smallexample
524
525 @noindent
526 The holiday form @code{(holiday-fixed 7 14 "Bastille Day")} specifies the
527 fourteenth day of the seventh month (July).
528
529 Many holidays occur on a specific day of the week, at a specific time
530 of month. Here is a holiday form describing Hurricane Supplication Day,
531 celebrated in the Virgin Islands on the fourth Monday in August:
532
533 @smallexample
534 (holiday-float 8 1 4 "Hurricane Supplication Day")
535 @end smallexample
536
537 @noindent
538 Here the 8 specifies August, the 1 specifies Monday (Sunday is 0,
539 Tuesday is 2, and so on), and the 4 specifies the fourth occurrence in
540 the month (1 specifies the first occurrence, 2 the second occurrence,
541 @minus{}1 the last occurrence, @minus{}2 the second-to-last occurrence, and
542 so on).
543
544 You can specify holidays that occur on fixed days of the Hebrew,
545 Islamic, and Julian calendars too. For example,
546
547 @smallexample
548 (setq other-holidays
549 '((holiday-hebrew 10 2 "Last day of Hanukkah")
550 (holiday-islamic 3 12 "Mohammed's Birthday")
551 (holiday-julian 4 2 "Jefferson's Birthday")))
552 @end smallexample
553
554 @noindent
555 adds the last day of Hanukkah (since the Hebrew months are numbered with
556 1 starting from Nisan), the Islamic feast celebrating Mohammed's
557 birthday (since the Islamic months are numbered from 1 starting with
558 Muharram), and Thomas Jefferson's birthday, which is 2 April 1743 on the
559 Julian calendar.
560
561 To include a holiday conditionally, use either Emacs Lisp's @code{if} or the
562 @code{holiday-sexp} form. For example, American presidential elections
563 occur on the first Tuesday after the first Monday in November of years
564 divisible by 4:
565
566 @smallexample
567 (holiday-sexp '(if (= 0 (% year 4))
568 (calendar-gregorian-from-absolute
569 (1+ (calendar-dayname-on-or-before
570 1 (+ 6 (calendar-absolute-from-gregorian
571 (list 11 1 year)))))))
572 "US Presidential Election")
573 @end smallexample
574
575 @noindent
576 or
577
578 @smallexample
579 (if (= 0 (% displayed-year 4))
580 (fixed 11
581 (extract-calendar-day
582 (calendar-gregorian-from-absolute
583 (1+ (calendar-dayname-on-or-before
584 1 (+ 6 (calendar-absolute-from-gregorian
585 (list 11 1 displayed-year)))))))
586 "US Presidential Election"))
587 @end smallexample
588
589 Some holidays just don't fit into any of these forms because special
590 calculations are involved in their determination. In such cases you
591 must write a Lisp function to do the calculation. To include eclipses,
592 for example, add @code{(eclipses)} to @code{other-holidays}
593 and write an Emacs Lisp function @code{eclipses} that returns a
594 (possibly empty) list of the relevant Gregorian dates among the range
595 visible in the calendar window, with descriptive strings, like this:
596
597 @smallexample
598 (((6 27 1991) "Lunar Eclipse") ((7 11 1991) "Solar Eclipse") ... )
599 @end smallexample
600
601 @node Date Display Format
602 @section Date Display Format
603 @vindex calendar-date-display-form
604
605 You can customize the manner of displaying dates in the diary, in mode
606 lines, and in messages by setting @code{calendar-date-display-form}.
607 This variable holds a list of expressions that can involve the variables
608 @code{month}, @code{day}, and @code{year}, which are all numbers in
609 string form, and @code{monthname} and @code{dayname}, which are both
610 alphabetic strings. In the American style, the default value of this
611 list is as follows:
612
613 @smallexample
614 ((if dayname (concat dayname ", ")) monthname " " day ", " year)
615 @end smallexample
616
617 @noindent
618 while in the European style this value is the default:
619
620 @smallexample
621 ((if dayname (concat dayname ", ")) day " " monthname " " year)
622 @end smallexample
623
624 @noindent
625 The ISO standard date representation is this:
626
627 @smallexample
628 (year "-" month "-" day)
629 @end smallexample
630
631 @noindent
632 This specifies a typical American format:
633
634 @smallexample
635 (month "/" day "/" (substring year -2))
636 @end smallexample
637
638 @node Time Display Format
639 @section Time Display Format
640 @vindex calendar-time-display-form
641
642 The calendar and diary by default display times of day in the
643 conventional American style with the hours from 1 through 12, minutes,
644 and either @samp{am} or @samp{pm}. If you prefer the European style,
645 also known in the US as military, in which the hours go from 00 to 23,
646 you can alter the variable @code{calendar-time-display-form}. This
647 variable is a list of expressions that can involve the variables
648 @code{12-hours}, @code{24-hours}, and @code{minutes}, which are all
649 numbers in string form, and @code{am-pm} and @code{time-zone}, which are
650 both alphabetic strings. The default value of
651 @code{calendar-time-display-form} is as follows:
652
653 @smallexample
654 (12-hours ":" minutes am-pm
655 (if time-zone " (") time-zone (if time-zone ")"))
656 @end smallexample
657
658 @noindent
659 Here is a value that provides European style times:
660
661 @smallexample
662 (24-hours ":" minutes
663 (if time-zone " (") time-zone (if time-zone ")"))
664 @end smallexample
665
666 @node Daylight Savings
667 @section Daylight Savings Time
668 @cindex daylight savings time
669
670 Emacs understands the difference between standard time and daylight
671 savings time---the times given for sunrise, sunset, solstices,
672 equinoxes, and the phases of the moon take that into account. The rules
673 for daylight savings time vary from place to place and have also varied
674 historically from year to year. To do the job properly, Emacs needs to
675 know which rules to use.
676
677 Some operating systems keep track of the rules that apply to the place
678 where you are; on these systems, Emacs gets the information it needs
679 from the system automatically. If some or all of this information is
680 missing, Emacs fills in the gaps with the rules currently used in
681 Cambridge, Massachusetts, which is the center of GNU's world.
682
683
684 @vindex calendar-daylight-savings-starts
685 @vindex calendar-daylight-savings-ends
686 If the default choice of rules is not appropriate for your location,
687 you can tell Emacs the rules to use by setting the variables
688 @code{calendar-daylight-savings-starts} and
689 @code{calendar-daylight-savings-ends}. Their values should be Lisp
690 expressions that refer to the variable @code{year}, and evaluate to the
691 Gregorian date on which daylight savings time starts or (respectively)
692 ends, in the form of a list @code{(@var{month} @var{day} @var{year})}.
693 The values should be @code{nil} if your area does not use daylight
694 savings time.
695
696 Emacs uses these expressions to determine the start and end dates of
697 daylight savings time as holidays and for correcting times of day in the
698 solar and lunar calculations.
699
700 The values for Cambridge, Massachusetts are as follows:
701
702 @example
703 @group
704 (calendar-nth-named-day 1 0 4 year)
705 (calendar-nth-named-day -1 0 10 year)
706 @end group
707 @end example
708
709 @noindent
710 i.e., the first 0th day (Sunday) of the fourth month (April) in
711 the year specified by @code{year}, and the last Sunday of the tenth month
712 (October) of that year. If daylight savings time were
713 changed to start on October 1, you would set
714 @code{calendar-daylight-savings-starts} to this:
715
716 @example
717 (list 10 1 year)
718 @end example
719
720 For a more complex example, suppose daylight savings time begins on
721 the first of Nisan on the Hebrew calendar. You should set
722 @code{calendar-daylight-savings-starts} to this value:
723
724 @example
725 (calendar-gregorian-from-absolute
726 (calendar-absolute-from-hebrew
727 (list 1 1 (+ year 3760))))
728 @end example
729
730 @noindent
731 because Nisan is the first month in the Hebrew calendar and the Hebrew
732 year differs from the Gregorian year by 3760 at Nisan.
733
734 If there is no daylight savings time at your location, or if you want
735 all times in standard time, set @code{calendar-daylight-savings-starts}
736 and @code{calendar-daylight-savings-ends} to @code{nil}.
737
738 @vindex calendar-daylight-time-offset
739 The variable @code{calendar-daylight-time-offset} specifies the
740 difference between daylight savings time and standard time, measured in
741 minutes. The value for Cambridge is 60.
742
743 @vindex calendar-daylight-savings-starts-time
744 @vindex calendar-daylight-savings-ends-time
745 The variable @code{calendar-daylight-savings-starts-time} and the
746 variable @code{calendar-daylight-savings-ends-time} specify the number
747 of minutes after midnight local time when the transition to and from
748 daylight savings time should occur. For Cambridge, both variables'
749 values are 120.
750
751 @node Diary Customizing
752 @section Customizing the Diary
753
754 @vindex holidays-in-diary-buffer
755 Ordinarily, the mode line of the diary buffer window indicates any
756 holidays that fall on the date of the diary entries. The process of
757 checking for holidays can take several seconds, so including holiday
758 information delays the display of the diary buffer noticeably. If you'd
759 prefer to have a faster display of the diary buffer but without the
760 holiday information, set the variable @code{holidays-in-diary-buffer} to
761 @code{nil}.@refill
762
763 @vindex number-of-diary-entries
764 The variable @code{number-of-diary-entries} controls the number of
765 days of diary entries to be displayed at one time. It affects the
766 initial display when @code{view-diary-entries-initially} is @code{t}, as
767 well as the command @kbd{M-x diary}. For example, the default value is
768 1, which says to display only the current day's diary entries. If the
769 value is 2, both the current day's and the next day's entries are
770 displayed. The value can also be a vector of seven elements: for
771 example, if the value is @code{[0 2 2 2 2 4 1]} then no diary entries
772 appear on Sunday, the current date's and the next day's diary entries
773 appear Monday through Thursday, Friday through Monday's entries appear
774 on Friday, while on Saturday only that day's entries appear.
775
776 @vindex print-diary-entries-hook
777 @findex print-diary-entries
778 The variable @code{print-diary-entries-hook} is a normal hook run
779 after preparation of a temporary buffer containing just the diary
780 entries currently visible in the diary buffer. (The other, irrelevant
781 diary entries are really absent from the temporary buffer; in the diary
782 buffer, they are merely hidden.) The default value of this hook does
783 the printing with the command @code{lpr-buffer}. If you want to use a
784 different command to do the printing, just change the value of this
785 hook. Other uses might include, for example, rearranging the lines into
786 order by day and time.
787
788 @vindex diary-date-forms
789 You can customize the form of dates in your diary file, if neither the
790 standard American nor European styles suits your needs, by setting the
791 variable @code{diary-date-forms}. This variable is a list of patterns
792 for recognizing a date. Each date pattern is a list whose elements may
793 be regular expressions (@pxref{Regular Expressions,,, elisp, the Emacs
794 Lisp Reference Manual}) or the symbols @code{month}, @code{day},
795 @code{year}, @code{monthname}, and @code{dayname}. All these elements
796 serve as patterns that match certain kinds of text in the diary file.
797 In order for the date pattern, as a whole, to match, all of its elements
798 must match consecutively.
799
800 A regular expression in a date pattern matches in its usual fashion,
801 using the standard syntax table altered so that @samp{*} is a word
802 constituent.
803
804 The symbols @code{month}, @code{day}, @code{year}, @code{monthname},
805 and @code{dayname} match the month number, day number, year number,
806 month name, and day name of the date being considered. The symbols that
807 match numbers allow leading zeros; those that match names allow
808 three-letter abbreviations and capitalization. All the symbols can
809 match @samp{*}; since @samp{*} in a diary entry means ``any day'', ``any
810 month'', and so on, it should match regardless of the date being
811 considered.
812
813 The default value of @code{diary-date-forms} in the American style is
814 this:
815
816 @example
817 ((month "/" day "[^/0-9]")
818 (month "/" day "/" year "[^0-9]")
819 (monthname " *" day "[^,0-9]")
820 (monthname " *" day ", *" year "[^0-9]")
821 (dayname "\\W"))
822 @end example
823
824 The date patterns in the list must be @emph{mutually exclusive} and
825 must not match any portion of the diary entry itself, just the date and
826 one character of whitespace. If, to be mutually exclusive, the pattern
827 must match a portion of the diary entry text---beyond the whitespace
828 that ends the date---then the first element of the date pattern
829 @emph{must} be @code{backup}. This causes the date recognizer to back
830 up to the beginning of the current word of the diary entry, after
831 finishing the match. Even if you use @code{backup}, the date pattern
832 must absolutely not match more than a portion of the first word of the
833 diary entry. The default value of @code{diary-date-forms} in the
834 European style is this list:
835
836 @example
837 ((day "/" month "[^/0-9]")
838 (day "/" month "/" year "[^0-9]")
839 (backup day " *" monthname "\\W+\\<[^*0-9]")
840 (day " *" monthname " *" year "[^0-9]")
841 (dayname "\\W"))
842 @end example
843
844 @noindent
845 Notice the use of @code{backup} in the third pattern, because it needs
846 to match part of a word beyond the date itself to distinguish it from
847 the fourth pattern.
848
849 @node Hebrew/Islamic Entries
850 @section Hebrew- and Islamic-Date Diary Entries
851
852 Your diary file can have entries based on Hebrew or Islamic dates, as
853 well as entries based on the world-standard Gregorian calendar.
854 However, because recognition of such entries is time-consuming and most
855 people don't use them, you must explicitly enable their use. If you
856 want the diary to recognize Hebrew-date diary entries, for example,
857 you must do this:
858
859 @vindex nongregorian-diary-listing-hook
860 @vindex nongregorian-diary-marking-hook
861 @findex list-hebrew-diary-entries
862 @findex mark-hebrew-diary-entries
863 @smallexample
864 (add-hook 'nongregorian-diary-listing-hook 'list-hebrew-diary-entries)
865 (add-hook 'nongregorian-diary-marking-hook 'mark-hebrew-diary-entries)
866 @end smallexample
867
868 @noindent
869 If you want Islamic-date entries, do this:
870
871 @findex list-islamic-diary-entries
872 @findex mark-islamic-diary-entries
873 @smallexample
874 (add-hook 'nongregorian-diary-listing-hook 'list-islamic-diary-entries)
875 (add-hook 'nongregorian-diary-marking-hook 'mark-islamic-diary-entries)
876 @end smallexample
877
878 Hebrew- and Islamic-date diary entries have the same formats as
879 Gregorian-date diary entries, except that @samp{H} precedes a Hebrew
880 date and @samp{I} precedes an Islamic date. Moreover, because the
881 Hebrew and Islamic month names are not uniquely specified by the first
882 three letters, you may not abbreviate them. For example, a diary entry
883 for the Hebrew date Heshvan 25 could look like this:
884
885 @smallexample
886 HHeshvan 25 Happy Hebrew birthday!
887 @end smallexample
888
889 @noindent
890 and would appear in the diary for any date that corresponds to Heshvan 25
891 on the Hebrew calendar. And here is an Islamic-date diary entry that matches
892 Dhu al-Qada 25:
893
894 @smallexample
895 IDhu al-Qada 25 Happy Islamic birthday!
896 @end smallexample
897
898 As with Gregorian-date diary entries, Hebrew- and Islamic-date entries
899 are nonmarking if they are preceded with an ampersand (@samp{&}).
900
901 Here is a table of commands used in the calendar to create diary entries
902 that match the selected date and other dates that are similar in the Hebrew
903 or Islamic calendar:
904
905 @table @kbd
906 @item i h d
907 Add a diary entry for the Hebrew date corresponding to the selected date
908 (@code{insert-hebrew-diary-entry}).
909 @item i h m
910 Add a diary entry for the day of the Hebrew month corresponding to the
911 selected date (@code{insert-monthly-hebrew-diary-entry}). This diary
912 entry matches any date that has the same Hebrew day-within-month as the
913 selected date.
914 @item i h y
915 Add a diary entry for the day of the Hebrew year corresponding to the
916 selected date (@code{insert-yearly-hebrew-diary-entry}). This diary
917 entry matches any date which has the same Hebrew month and day-within-month
918 as the selected date.
919 @item i i d
920 Add a diary entry for the Islamic date corresponding to the selected date
921 (@code{insert-islamic-diary-entry}).
922 @item i i m
923 Add a diary entry for the day of the Islamic month corresponding to the
924 selected date (@code{insert-monthly-islamic-diary-entry}).
925 @item i i y
926 Add a diary entry for the day of the Islamic year corresponding to the
927 selected date (@code{insert-yearly-islamic-diary-entry}).
928 @end table
929
930 @findex insert-hebrew-diary-entry
931 @findex insert-monthly-hebrew-diary-entry
932 @findex insert-yearly-hebrew-diary-entry
933 @findex insert-islamic-diary-entry
934 @findex insert-monthly-islamic-diary-entry
935 @findex insert-yearly-islamic-diary-entry
936 These commands work much like the corresponding commands for ordinary
937 diary entries: they apply to the date that point is on in the calendar
938 window, and what they do is insert just the date portion of a diary entry
939 at the end of your diary file. You must then insert the rest of the
940 diary entry.
941
942 @node Fancy Diary Display
943 @section Fancy Diary Display
944 @vindex diary-display-hook
945 @findex simple-diary-display
946
947 Diary display works by preparing the diary buffer and then running the
948 hook @code{diary-display-hook}. The default value of this hook
949 (@code{simple-diary-display}) hides the irrelevant diary entries and
950 then displays the buffer. However, if you specify the hook as follows,
951
952 @cindex diary buffer
953 @findex fancy-diary-display
954 @example
955 (add-hook 'diary-display-hook 'fancy-diary-display)
956 @end example
957
958 @noindent
959 this enables fancy diary display. It displays diary entries and
960 holidays by copying them into a special buffer that exists only for the
961 sake of display. Copying to a separate buffer provides an opportunity
962 to change the displayed text to make it prettier---for example, to sort
963 the entries by the dates they apply to.
964
965 As with simple diary display, you can print a hard copy of the buffer
966 with @code{print-diary-entries}. To print a hard copy of a day-by-day
967 diary for a week, position point on Sunday of that week, type
968 @kbd{7 d}, and then do @kbd{M-x print-diary-entries}. As usual, the
969 inclusion of the holidays slows down the display slightly; you can speed
970 things up by setting the variable @code{holidays-in-diary-buffer} to
971 @code{nil}.
972
973 @vindex diary-list-include-blanks
974 Ordinarily, the fancy diary buffer does not show days for which there are
975 no diary entries, even if that day is a holiday. If you want such days to be
976 shown in the fancy diary buffer, set the variable
977 @code{diary-list-include-blanks} to @code{t}.@refill
978
979 @cindex sorting diary entries
980 If you use the fancy diary display, you can use the normal hook
981 @code{list-diary-entries-hook} to sort each day's diary entries by their
982 time of day. Here's how:
983
984 @findex sort-diary-entries
985 @example
986 (add-hook 'list-diary-entries-hook 'sort-diary-entries t)
987 @end example
988
989 @noindent
990 For each day, this sorts diary entries that begin with a recognizable
991 time of day according to their times. Diary entries without times come
992 first within each day.
993
994 Fancy diary display also has the ability to process included diary
995 files. This permits a group of people to share a diary file for events
996 that apply to all of them. Lines in the diary file of this form:
997
998 @smallexample
999 #include "@var{filename}"
1000 @end smallexample
1001
1002 @noindent
1003 includes the diary entries from the file @var{filename} in the fancy
1004 diary buffer. The include mechanism is recursive, so that included files
1005 can include other files, and so on; you must be careful not to have a
1006 cycle of inclusions, of course. Here is how to enable the include
1007 facility:
1008
1009 @vindex list-diary-entries-hook
1010 @vindex mark-diary-entries-hook
1011 @findex include-other-diary-files
1012 @findex mark-included-diary-files
1013 @smallexample
1014 (add-hook 'list-diary-entries-hook 'include-other-diary-files)
1015 (add-hook 'mark-diary-entries-hook 'mark-included-diary-files)
1016 @end smallexample
1017
1018 The include mechanism works only with the fancy diary display, because
1019 ordinary diary display shows the entries directly from your diary file.
1020
1021 @node Sexp Diary Entries
1022 @section Sexp Entries and the Fancy Diary Display
1023 @cindex sexp diary entries
1024
1025 Sexp diary entries allow you to do more than just have complicated
1026 conditions under which a diary entry applies. If you use the fancy
1027 diary display, sexp entries can generate the text of the entry depending
1028 on the date itself. For example, an anniversary diary entry can insert
1029 the number of years since the anniversary date into the text of the
1030 diary entry. Thus the @samp{%d} in this dairy entry:
1031
1032 @findex diary-anniversary
1033 @smallexample
1034 %%(diary-anniversary 10 31 1948) Arthur's birthday (%d years old)
1035 @end smallexample
1036
1037 @noindent
1038 gets replaced by the age, so on October 31, 1990 the entry appears in
1039 the fancy diary buffer like this:
1040
1041 @smallexample
1042 Arthur's birthday (42 years old)
1043 @end smallexample
1044
1045 @noindent
1046 If the diary file instead contains this entry:
1047
1048 @smallexample
1049 %%(diary-anniversary 10 31 1948) Arthur's %d%s birthday
1050 @end smallexample
1051
1052 @noindent
1053 the entry in the fancy diary buffer for October 31, 1990 appears like this:
1054
1055 @smallexample
1056 Arthur's 42nd birthday
1057 @end smallexample
1058
1059 Similarly, cyclic diary entries can interpolate the number of repetitions
1060 that have occurred:
1061
1062 @findex diary-cyclic
1063 @smallexample
1064 %%(diary-cyclic 50 1 1 1990) Renew medication (%d%s time)
1065 @end smallexample
1066
1067 @noindent
1068 looks like this:
1069
1070 @smallexample
1071 Renew medication (5th time)
1072 @end smallexample
1073
1074 @noindent
1075 in the fancy diary display on September 8, 1990.
1076
1077 There is an early reminder diary sexp that includes its entry in the
1078 diary not only on the date of occurrence, but also on earlier dates.
1079 For example, if you want a reminder a week before your anniversary, you
1080 can use
1081
1082 @findex diary-remind
1083 @smallexample
1084 %%(diary-remind '(diary-anniversary 12 22 1968) 7) Ed's anniversary
1085 @end smallexample
1086
1087 @noindent
1088 and the fancy diary will show
1089 @smallexample
1090 Ed's anniversary
1091 @end smallexample
1092 @noindent
1093 both on December 15 and on December 22.
1094
1095 @findex diary-date
1096 The function @code{diary-date} applies to dates described by a month,
1097 day, year combination, each of which can be an integer, a list of
1098 integers, or @code{t}. The value @code{t} means all values. For
1099 example,
1100
1101 @smallexample
1102 %%(diary-date '(10 11 12) 22 t) Rake leaves
1103 @end smallexample
1104
1105 @noindent
1106 causes the fancy diary to show
1107
1108 @smallexample
1109 Rake leaves
1110 @end smallexample
1111
1112 @noindent
1113 on October 22, November 22, and December 22 of every year.
1114
1115 @findex diary-float
1116 The function @code{diary-float} allows you to describe diary entries
1117 that apply to dates like the third Friday of November, or the last
1118 Tuesday in April. The parameters are the @var{month}, @var{dayname},
1119 and an index @var{n}. The entry appears on the @var{n}th @var{dayname}
1120 of @var{month}, where @var{dayname}=0 means Sunday, 1 means Monday, and
1121 so on. If @var{n} is negative it counts backward from the end of
1122 @var{month}. The value of @var{month} can be a list of months, a single
1123 month, or @code{t} to specify all months. You can also use an optional
1124 parameter @var{day} to specify the @var{n}th @var{dayname} of
1125 @var{month} on or after/before @var{day}; the value of @var{day} defaults
1126 to 1 if @var{n} is positive and to the last day of @var{month} if
1127 @var{n} is negative. For example,
1128
1129 @smallexample
1130 %%(diary-float t 1 -1) Pay rent
1131 @end smallexample
1132
1133 @noindent
1134 causes the fancy diary to show
1135
1136 @smallexample
1137 Pay rent
1138 @end smallexample
1139
1140 @noindent
1141 on the last Monday of every month.
1142
1143 The generality of sexp diary entries lets you specify any diary
1144 entry that you can describe algorithmically. A sexp diary entry
1145 contains an expression that computes whether the entry applies to any
1146 given date. If its value is non-@code{nil}, the entry applies to that
1147 date; otherwise, it does not. The expression can use the variable
1148 @code{date} to find the date being considered; its value is a list
1149 (@var{month} @var{day} @var{year}) that refers to the Gregorian
1150 calendar.
1151
1152 The sexp diary entry applies to a date when the expression's value
1153 is non-@code{nil}, but some values have more specific meanings. If
1154 the value is a string, that string is a description of the event which
1155 occurs on that date. The value can also have the form
1156 @code{(@var{mark} . @var{string})}; then @var{mark} specifies how to
1157 mark the date in the calendar, and @var{string} is the description of
1158 the event. If @var{mark} is a single-character string, that character
1159 appears next to the date in the calendar. If @var{mark} is a face
1160 name, the date is displayed in that face. If @var{mark} is
1161 @code{nil}, that specifies no particular highlighting for the date.
1162
1163 Suppose you get paid on the 21st of the month if it is a weekday, and
1164 on the Friday before if the 21st is on a weekend. Here is how to write
1165 a sexp diary entry that matches those dates:
1166
1167 @smallexample
1168 &%%(let ((dayname (calendar-day-of-week date))
1169 (day (car (cdr date))))
1170 (or (and (= day 21) (memq dayname '(1 2 3 4 5)))
1171 (and (memq day '(19 20)) (= dayname 5)))
1172 ) Pay check deposited
1173 @end smallexample
1174
1175 The following sexp diary entries take advantage of the ability (in the fancy
1176 diary display) to concoct diary entries whose text varies based on the date:
1177
1178 @findex diary-sunrise-sunset
1179 @findex diary-phases-of-moon
1180 @findex diary-day-of-year
1181 @findex diary-iso-date
1182 @findex diary-julian-date
1183 @findex diary-astro-day-number
1184 @findex diary-hebrew-date
1185 @findex diary-islamic-date
1186 @findex diary-french-date
1187 @findex diary-mayan-date
1188 @table @code
1189 @item %%(diary-sunrise-sunset)
1190 Make a diary entry for the local times of today's sunrise and sunset.
1191 @item %%(diary-phases-of-moon)
1192 Make a diary entry for the phases (quarters) of the moon.
1193 @item %%(diary-day-of-year)
1194 Make a diary entry with today's day number in the current year and the number
1195 of days remaining in the current year.
1196 @item %%(diary-iso-date)
1197 Make a diary entry with today's equivalent ISO commercial date.
1198 @item %%(diary-julian-date)
1199 Make a diary entry with today's equivalent date on the Julian calendar.
1200 @item %%(diary-astro-day-number)
1201 Make a diary entry with today's equivalent astronomical (Julian) day number.
1202 @item %%(diary-hebrew-date)
1203 Make a diary entry with today's equivalent date on the Hebrew calendar.
1204 @item %%(diary-islamic-date)
1205 Make a diary entry with today's equivalent date on the Islamic calendar.
1206 @item %%(diary-french-date)
1207 Make a diary entry with today's equivalent date on the French Revolutionary
1208 calendar.
1209 @item %%(diary-mayan-date)
1210 Make a diary entry with today's equivalent date on the Mayan calendar.
1211 @end table
1212
1213 @noindent
1214 Thus including the diary entry
1215
1216 @example
1217 &%%(diary-hebrew-date)
1218 @end example
1219
1220 @noindent
1221 causes every day's diary display to contain the equivalent date on the
1222 Hebrew calendar, if you are using the fancy diary display. (With simple
1223 diary display, the line @samp{&%%(diary-hebrew-date)} appears in the
1224 diary for any date, but does nothing particularly useful.)
1225
1226 These functions can be used to construct sexp diary entries based on
1227 the Hebrew calendar in certain standard ways:
1228
1229 @cindex rosh hodesh
1230 @findex diary-rosh-hodesh
1231 @cindex parasha, weekly
1232 @findex diary-parasha
1233 @cindex candle lighting times
1234 @findex diary-sabbath-candles
1235 @cindex omer count
1236 @findex diary-omer
1237 @cindex yahrzeits
1238 @findex diary-yahrzeit
1239 @table @code
1240 @item %%(diary-rosh-hodesh)
1241 Make a diary entry that tells the occurrence and ritual announcement of each
1242 new Hebrew month.
1243 @item %%(diary-parasha)
1244 Make a Saturday diary entry that tells the weekly synagogue scripture reading.
1245 @item %%(diary-sabbath-candles)
1246 Make a Friday diary entry that tells the @emph{local time} of Sabbath
1247 candle lighting.
1248 @item %%(diary-omer)
1249 Make a diary entry that gives the omer count, when appropriate.
1250 @item %%(diary-yahrzeit @var{month} @var{day} @var{year}) @var{name}
1251 Make a diary entry marking the anniversary of a date of death. The date
1252 is the @emph{Gregorian} (civil) date of death. The diary entry appears
1253 on the proper Hebrew calendar anniversary and on the day before. (In
1254 the European style, the order of the parameters is changed to @var{day},
1255 @var{month}, @var{year}.)
1256 @end table
1257
1258 All the functions documented above take an optional argument
1259 @var{mark} which specifies how to mark the date in the calendar display.
1260 If one of these functions decides that it applies to a certain date,
1261 it returns a value that contains @var{mark}.
1262
1263 @node Appt Customizing
1264 @section Customizing Appointment Reminders
1265
1266 You can specify exactly how Emacs reminds you of an appointment, and
1267 how far in advance it begins doing so, by setting these variables:
1268
1269 @vindex appt-message-warning-time
1270 @vindex appt-audible
1271 @vindex appt-visible
1272 @vindex appt-display-mode-line
1273 @vindex appt-msg-window
1274 @vindex appt-display-duration
1275 @vindex appt-disp-window-function
1276 @vindex appt-delete-window-function
1277 @table @code
1278 @item appt-message-warning-time
1279 The time in minutes before an appointment that the reminder begins. The
1280 default is 12 minutes.
1281 @item appt-audible
1282 If this is non-@code{nil}, Emacs rings the
1283 terminal bell for appointment reminders. The default is @code{t}.
1284 @item appt-visible
1285 If this is non-@code{nil}, Emacs displays the appointment
1286 message in the echo area. The default is @code{t}.
1287 @item appt-display-mode-line
1288 If this is non-@code{nil}, Emacs displays the number of minutes
1289 to the appointment on the mode line. The default is @code{t}.
1290 @item appt-msg-window
1291 If this is non-@code{nil}, Emacs displays the appointment
1292 message in another window. The default is @code{t}.
1293 @item appt-disp-window-function
1294 This variable holds a function to use to create the other window
1295 for the appointment message.
1296 @item appt-delete-window-function
1297 This variable holds a function to use to get rid of the appointment
1298 message window, when its time is up.
1299 @item appt-display-duration
1300 The number of seconds to display an appointment message. The default
1301 is 10 seconds.
1302 @end table
1303
1304
310 @node Index 1305 @node Index
311 @unnumbered Index 1306 @unnumbered Index
312 1307
313 @printindex cp 1308 @printindex cp
314 1309