;;; calendar.el --- calendar functions
;; Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1997,
-;; 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
+;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
-;; Maintainer: Glenn Morris <gmorris@ast.cam.ac.uk>
+;; Maintainer: Glenn Morris <rgm@gnu.org>
;; Keywords: calendar
;; Human-Keywords: calendar, Gregorian calendar, diary, holidays
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; appt.el Appointment notification
;; cal-china.el Chinese calendar
;; cal-coptic.el Coptic/Ethiopic calendars
-;; cal-dst.el Daylight savings time rules
+;; cal-dst.el Daylight saving time rules
;; cal-hebrew.el Hebrew calendar
;; cal-islam.el Islamic calendar
;; cal-bahai.el Baha'i calendar
;; reingold@cs.uiuc.edu with the SUBJECT "send-paper-cal" (no quotes) and
;; the message BODY containing your mailing address (snail).
-;; Comments, corrections, and improvements should be sent to
-;; Edward M. Reingold Department of Computer Science
-;; (217) 333-6733 University of Illinois at Urbana-Champaign
-;; reingold@cs.uiuc.edu 1304 West Springfield Avenue
-;; Urbana, Illinois 61801
-
;;; Code:
-(eval-when-compile
- (defvar displayed-month)
- (defvar displayed-year)
- (defvar calendar-month-name-array)
- (defvar calendar-starred-day))
+(defvar displayed-month)
+(defvar displayed-year)
+(defvar calendar-month-name-array)
+(defvar calendar-starred-day)
(defun calendar-version ()
(interactive)
;;;###autoload
(defcustom calendar-offset 0
- "*The offset of the principal month from the center of the calendar window.
+ "The offset of the principal month from the center of the calendar window.
0 means the principal month is in the center (default), -1 means on the left,
+1 means on the right. Larger (or smaller) values push the principal month off
the screen."
;;;###autoload
(defcustom view-diary-entries-initially nil
- "*Non-nil means display current date's diary entries on entry to calendar.
+ "Non-nil means display current date's diary entries on entry to calendar.
The diary is displayed in another window when the calendar is first displayed,
if the current date is visible. The number of days of diary entries displayed
is governed by the variable `number-of-diary-entries'. This variable can
:type 'boolean
:group 'diary)
-;;;###autoload
-(defcustom number-of-diary-entries 1
- "*Specifies how many days of diary entries are to be displayed initially.
-This variable affects the diary display when the command \\[diary] is used,
-or if the value of the variable `view-diary-entries-initially' is t. For
-example, if the default value 1 is used, then only the current day's diary
-entries will be displayed. If the value 2 is used, then both the current
-day's and the next day's entries will be displayed.
-
-The value can also be a vector such as [0 2 2 2 2 4 1]; this value
-says to display no diary entries on Sunday, the display the entries
-for the current date and the day after on Monday through Thursday,
-display Friday through Monday's entries on Friday, and display only
-Saturday's entries on Saturday.
-
-This variable does not affect the diary display with the `d' command
-from the calendar; in that case, the prefix argument controls the
-number of days of diary entries displayed."
- :type '(choice (integer :tag "Entries")
- (vector :value [0 0 0 0 0 0 0]
- (integer :tag "Sunday")
- (integer :tag "Monday")
- (integer :tag "Tuesday")
- (integer :tag "Wednesday")
- (integer :tag "Thursday")
- (integer :tag "Friday")
- (integer :tag "Saturday")))
- :group 'diary)
-
;;;###autoload
(defcustom mark-diary-entries-in-calendar nil
- "*Non-nil means mark dates with diary entries, in the calendar window.
+ "Non-nil means mark dates with diary entries, in the calendar window.
The marking symbol is specified by the variable `diary-entry-marker'."
:type 'boolean
:group 'diary)
;;;###autoload
(defcustom calendar-remove-frame-by-deleting nil
- "*Determine how the calendar mode removes a frame no longer needed.
+ "Determine how the calendar mode removes a frame no longer needed.
If nil, make an icon of the frame. If non-nil, delete the frame."
:type 'boolean
:group 'view)
-(defvar diary-face 'diary-face
+(defvar diary-face 'diary
"Face name to use for diary entries.")
-(defface diary-face
+(defface diary
'((((min-colors 88) (class color) (background light))
:foreground "red1")
(((class color) (background light))
:weight bold))
"Face for highlighting diary entries."
:group 'diary)
+;; backward-compatibility alias
+(put 'diary-face 'face-alias 'diary)
-(defface calendar-today-face
+(defface calendar-today
'((t (:underline t)))
"Face for indicating today's date."
:group 'diary)
+;; backward-compatibility alias
+(put 'calendar-today-face 'face-alias 'calendar-today)
-(defface holiday-face
+(defface holiday
'((((class color) (background light))
:background "pink")
(((class color) (background dark))
:inverse-video t))
"Face for indicating dates that have holidays."
:group 'diary)
-
-(eval-after-load "facemenu"
- '(progn
- (add-to-list 'facemenu-unlisted-faces 'diary-face)
- (add-to-list 'facemenu-unlisted-faces 'calendar-today-face)
- (add-to-list 'facemenu-unlisted-faces 'holiday-face)))
+;; backward-compatibility alias
+(put 'holiday-face 'face-alias 'holiday)
(defcustom diary-entry-marker
(if (not (display-color-p))
"+"
- 'diary-face)
- "*How to mark dates that have diary entries.
+ 'diary)
+ "How to mark dates that have diary entries.
The value can be either a single-character string or a face."
:type '(choice string face)
:group 'diary)
(defcustom calendar-today-marker
(if (not (display-color-p))
"="
- 'calendar-today-face)
- "*How to mark today's date in the calendar.
+ 'calendar-today)
+ "How to mark today's date in the calendar.
The value can be either a single-character string or a face.
Marking today's date is done only if you set up `today-visible-calendar-hook'
to request that."
(defcustom calendar-holiday-marker
(if (not (display-color-p))
"*"
- 'holiday-face)
- "*How to mark notable dates in the calendar.
+ 'holiday)
+ "How to mark notable dates in the calendar.
The value can be either a single-character string or a face."
:type '(choice string face)
:group 'calendar)
;;;###autoload
(defcustom view-calendar-holidays-initially nil
- "*Non-nil means display holidays for current three month period on entry.
+ "Non-nil means display holidays for current three month period on entry.
The holidays are displayed in another window when the calendar is first
displayed."
:type 'boolean
;;;###autoload
(defcustom mark-holidays-in-calendar nil
- "*Non-nil means mark dates of holidays in the calendar window.
+ "Non-nil means mark dates of holidays in the calendar window.
The marking symbol is specified by the variable `calendar-holiday-marker'."
:type 'boolean
:group 'holidays)
;;;###autoload
(defcustom all-hebrew-calendar-holidays nil
- "*If nil, show only major holidays from the Hebrew calendar.
+ "If nil, show only major holidays from the Hebrew calendar.
This means only those Jewish holidays that appear on secular calendars.
If t, show all the holidays that would appear in a complete Hebrew calendar."
;;;###autoload
(defcustom all-christian-calendar-holidays nil
- "*If nil, show only major holidays from the Christian calendar.
+ "If nil, show only major holidays from the Christian calendar.
This means only those Christian holidays that appear on secular calendars.
If t, show all the holidays that would appear in a complete Christian
;;;###autoload
(defcustom all-islamic-calendar-holidays nil
- "*If nil, show only major holidays from the Islamic calendar.
+ "If nil, show only major holidays from the Islamic calendar.
This means only those Islamic holidays that appear on secular calendars.
If t, show all the holidays that would appear in a complete Islamic
:group 'holidays)
(defcustom diary-file-name-prefix-function (function (lambda (str) str))
- "*The function that will take a diary file name and return the desired prefix."
+ "The function that will take a diary file name and return the desired prefix."
:type 'function
:group 'diary)
;;;###autoload
(defcustom all-bahai-calendar-holidays nil
- "*If nil, show only major holidays from the Baha'i calendar.
+ "If nil, show only major holidays from the Baha'i calendar.
These are the days on which work and school must be suspended.
If t, show all the holidays that would appear in a complete Baha'i
:type 'boolean
:group 'holidays)
+(defcustom calendar-mode-hook nil
+ "Hook run when entering `calendar-mode'."
+ :type 'hook
+ :group 'calendar-hooks)
+
;;;###autoload
(defcustom calendar-load-hook nil
- "*List of functions to be called after the calendar is first loaded.
+ "List of functions to be called after the calendar is first loaded.
This is the place to add key bindings to `calendar-mode-map'."
:type 'hook
:group 'calendar-hooks)
;;;###autoload
(defcustom initial-calendar-window-hook nil
- "*List of functions to be called when the calendar window is first opened.
+ "List of functions to be called when the calendar window is first opened.
The functions invoked are called after the calendar window is opened, but
once opened is never called again. Leaving the calendar with the `q' command
and reentering it will cause these functions to be called again."
;;;###autoload
(defcustom today-visible-calendar-hook nil
- "*List of functions called whenever the current date is visible.
+ "List of functions called whenever the current date is visible.
This can be used, for example, to replace today's date with asterisks; a
function `calendar-star-date' is included for this purpose:
(setq today-visible-calendar-hook 'calendar-star-date)
;;;###autoload
(defcustom today-invisible-calendar-hook nil
- "*List of functions called whenever the current date is not visible.
+ "List of functions called whenever the current date is not visible.
The corresponding variable `today-visible-calendar-hook' is the list of
functions called when the calendar function was called when the current
;;;###autoload
(defcustom calendar-move-hook nil
- "*List of functions called whenever the cursor moves in the calendar.
+ "List of functions called whenever the cursor moves in the calendar.
For example,
- (add-hook 'calendar-move-hook (lambda () (view-diary-entries 1)))
+ (add-hook 'calendar-move-hook (lambda () (diary-view-entries 1)))
redisplays the diary for whatever date the cursor is moved to."
:type 'hook
;;;###autoload
(defcustom diary-file "~/diary"
- "*Name of the file in which one's personal diary of dates is kept.
+ "Name of the file in which one's personal diary of dates is kept.
The file's entries are lines beginning with any of the forms
specified by the variable `american-date-diary-pattern', by default:
;;;###autoload
(defcustom diary-nonmarking-symbol "&"
- "*Symbol indicating that a diary entry is not to be marked in the calendar."
+ "Symbol indicating that a diary entry is not to be marked in the calendar."
:type 'string
:group 'diary)
;;;###autoload
(defcustom hebrew-diary-entry-symbol "H"
- "*Symbol indicating a diary entry according to the Hebrew calendar."
+ "Symbol indicating a diary entry according to the Hebrew calendar."
:type 'string
:group 'diary)
;;;###autoload
(defcustom islamic-diary-entry-symbol "I"
- "*Symbol indicating a diary entry according to the Islamic calendar."
+ "Symbol indicating a diary entry according to the Islamic calendar."
:type 'string
:group 'diary)
;;;###autoload
(defcustom bahai-diary-entry-symbol "B"
- "*Symbol indicating a diary entry according to the Baha'i calendar."
+ "Symbol indicating a diary entry according to the Baha'i calendar."
:type 'string
:group 'diary)
;;;###autoload
(defcustom diary-include-string "#include"
- "*The string indicating inclusion of another file of diary entries.
+ "The string indicating inclusion of another file of diary entries.
See the documentation for the function `include-other-diary-files'."
:type 'string
:group 'diary)
(defcustom diary-glob-file-regexp-prefix "^\\#"
- "*The regular expression that gets pre-pended to each of the attribute-regexp's for file-wide specifiers."
+ "The regular expression that gets pre-pended to each of the attribute-regexp's for file-wide specifiers."
:type 'regexp
:group 'diary)
;;; (" *\\[box:\\([-a-z]+\\)\\]$" 1 :box)
;;; (" *\\[stipple:\\([-a-z]+\\)\\]$" 1 :stipple)
)
- "*A list of (regexp regnum attr attrtype) lists where the
+ "A list of (regexp regnum attr attrtype) lists where the
regexp says how to find the tag, the regnum says which
parenthetical sub-regexp this regexp looks for, and the attr says
which attribute of the face (or that this _is_ a face) is being
;;;###autoload
(defcustom sexp-diary-entry-symbol "%%"
- "*The string used to indicate a sexp diary entry in `diary-file'.
+ "The string used to indicate a sexp diary entry in `diary-file'.
See the documentation for the function `list-sexp-diary-entries'."
:type 'string
:group 'diary)
;;;###autoload
(defcustom abbreviated-calendar-year t
- "*Interpret a two-digit year DD in a diary entry as either 19DD or 20DD.
+ "Interpret a two-digit year DD in a diary entry as either 19DD or 20DD.
For the Gregorian calendar; similarly for the Hebrew, Islamic and
Baha'i calendars. If this variable is nil, years must be written in
full."
;;;###autoload
(defcustom european-calendar-style nil
- "*Use the European style of dates in the diary and in any displays.
+ "Use the European style of dates in the diary and in any displays.
If this variable is t, a date 1/2/1990 would be interpreted as February 1,
1990. The default European date styles (see `european-date-diary-pattern')
are
Names can be capitalized or not, written in full (as specified by the
variable `calendar-day-name-array'), or abbreviated (as specified by
-`calendar-day-abbrev-array') with or without a period. To take effect,
-this variable should be set before the calendar package and its associates
-are loaded. Otherwise, use one of the functions `european-calendar' or
-`american-calendar' to force the appropriate update."
+`calendar-day-abbrev-array') with or without a period.
+
+Setting this variable directly does not take effect (if the
+calendar package is already loaded). Rather, use either
+\\[customize] or the functions `european-calendar' and
+`american-calendar'."
:type 'boolean
+ ;; Without :initialize (require 'calendar) throws an error because
+ ;; american-calendar is undefined at this point.
+ :initialize 'custom-initialize-default
+ :set (lambda (symbol value)
+ (if value
+ (european-calendar)
+ (american-calendar)))
:group 'diary)
;;;###autoload
(monthname " *" day "[^,0-9]")
(monthname " *" day ", *" year "[^0-9]")
(dayname "\\W"))
- "*List of pseudo-patterns describing the American patterns of date used.
+ "List of pseudo-patterns describing the American patterns of date used.
See the documentation of `diary-date-forms' for an explanation."
:type '(repeat (choice (cons :tag "Backup"
:value (backup . nil)
(backup day " *" monthname "\\W+\\<\\([^*0-9]\\|\\([0-9]+[:aApP]\\)\\)")
(day " *" monthname " *" year "[^0-9]")
(dayname "\\W"))
- "*List of pseudo-patterns describing the European patterns of date used.
+ "List of pseudo-patterns describing the European patterns of date used.
See the documentation of `diary-date-forms' for an explanation."
:type '(repeat (choice (cons :tag "Backup"
:value (backup . nil)
(choice symbol regexp)))))
:group 'diary)
+(autoload 'diary-font-lock-keywords "diary-lib")
+(autoload 'diary-live-p "diary-lib")
+(defvar diary-font-lock-keywords)
+
(defcustom diary-date-forms
(if european-calendar-style
european-date-diary-pattern
american-date-diary-pattern)
- "*List of pseudo-patterns describing the forms of date used in the diary.
+ "List of pseudo-patterns describing the forms of date used in the diary.
The patterns on the list must be MUTUALLY EXCLUSIVE and should not match
any portion of the diary entry itself, just the date component.
(repeat (list :inline t :format "%v"
(symbol :tag "Keyword")
(choice symbol regexp)))))
+ :initialize 'custom-initialize-default
+ :set (lambda (symbol value)
+ (unless (equal value (eval symbol))
+ (custom-set-default symbol value)
+ (setq diary-font-lock-keywords (diary-font-lock-keywords))
+ ;; Need to redraw not just to get new font-locking, but also
+ ;; to pick up any newly recognized entries.
+ (and (diary-live-p)
+ (diary))))
:group 'diary)
;;;###autoload
(defcustom european-calendar-display-form
'((if dayname (concat dayname ", ")) day " " monthname " " year)
- "*Pseudo-pattern governing the way a date appears in the European style.
+ "Pseudo-pattern governing the way a date appears in the European style.
See the documentation of `calendar-date-display-form' for an explanation."
:type 'sexp
:group 'calendar)
;;;###autoload
(defcustom american-calendar-display-form
'((if dayname (concat dayname ", ")) monthname " " day ", " year)
- "*Pseudo-pattern governing the way a date appears in the American style.
+ "Pseudo-pattern governing the way a date appears in the American style.
See the documentation of `calendar-date-display-form' for an explanation."
:type 'sexp
:group 'calendar)
(if european-calendar-style
european-calendar-display-form
american-calendar-display-form)
- "*Pseudo-pattern governing the way a date appears.
+ "Pseudo-pattern governing the way a date appears.
Used by the function `calendar-date-string', a pseudo-pattern is a list of
expressions that can involve the keywords `month', `day', and `year', all
;;;###autoload
(defcustom print-diary-entries-hook 'lpr-buffer
- "*List of functions called after a temporary diary buffer is prepared.
+ "List of functions called after a temporary diary buffer is prepared.
The buffer shows only the diary entries currently visible in the diary
buffer. The default just does the printing. Other uses might include, for
example, rearranging the lines into order by day and time, saving the buffer
;;;###autoload
(defcustom list-diary-entries-hook nil
- "*List of functions called after diary file is culled for relevant entries.
+ "List of functions called after diary file is culled for relevant entries.
It is to be used for diary entries that are not found in the diary file.
A function `include-other-diary-files' is provided for use as the value of
;;;###autoload
(defcustom diary-hook nil
- "*List of functions called after the display of the diary.
+ "List of functions called after the display of the diary.
Can be used for appointment notification."
:type 'hook
:group 'diary)
+(autoload 'diary-set-maybe-redraw "diary-lib")
+
;;;###autoload
(defcustom diary-display-hook nil
- "*List of functions that handle the display of the diary.
+ "List of functions that handle the display of the diary.
If nil (the default), `simple-diary-display' is used. Use `ignore' for no
diary display.
diary buffer, set the variable `diary-list-include-blanks' to t."
:type 'hook
:options '(fancy-diary-display)
+ :initialize 'custom-initialize-default
+ :set 'diary-set-maybe-redraw
:group 'diary)
;;;###autoload
(defcustom nongregorian-diary-listing-hook nil
- "*List of functions called for listing diary file and included files.
+ "List of functions called for listing diary file and included files.
As the files are processed for diary entries, these functions are used
to cull relevant entries. You can use either or both of
`list-hebrew-diary-entries', `list-islamic-diary-entries' and
;;;###autoload
(defcustom mark-diary-entries-hook nil
- "*List of functions called after marking diary entries in the calendar.
+ "List of functions called after marking diary entries in the calendar.
A function `mark-included-diary-files' is also provided for use as the
`mark-diary-entries-hook'; it enables you to use shared diary files together
;;;###autoload
(defcustom nongregorian-diary-marking-hook nil
- "*List of functions called for marking diary file and included files.
+ "List of functions called for marking diary file and included files.
As the files are processed for diary entries, these functions are used
to cull relevant entries. You can use either or both of
`mark-hebrew-diary-entries', `mark-islamic-diary-entries' and
;;;###autoload
(defcustom diary-list-include-blanks nil
- "*If nil, do not include days with no diary entry in the list of diary entries.
+ "If nil, do not include days with no diary entry in the list of diary entries.
Such days will then not be shown in the fancy diary buffer, even if they
are holidays."
:type 'boolean
;;;###autoload
(defcustom holidays-in-diary-buffer t
- "*Non-nil means include holidays in the diary display.
+ "Non-nil means include holidays in the diary display.
The holidays appear in the mode line of the diary buffer, or in the
fancy diary buffer next to the date. This slows down the diary functions
somewhat; setting it to nil makes the diary display faster."
(holiday-fixed 10 31 "Halloween")
(holiday-fixed 11 11 "Veteran's Day")
(holiday-float 11 4 4 "Thanksgiving"))
- "*General holidays. Default value is for the United States.
+ "General holidays. Default value is for the United States.
See the documentation for `calendar-holidays' for details."
:type 'sexp
:group 'holidays)
(defcustom oriental-holidays
'((if (fboundp 'atan)
(holiday-chinese-new-year)))
- "*Oriental holidays.
+ "Oriental holidays.
See the documentation for `calendar-holidays' for details."
:type 'sexp
:group 'holidays)
(put 'local-holidays 'risky-local-variable t)
;;;###autoload
(defcustom local-holidays nil
- "*Local holidays.
+ "Local holidays.
See the documentation for `calendar-holidays' for details."
:type 'sexp
:group 'holidays)
(put 'other-holidays 'risky-local-variable t)
;;;###autoload
(defcustom other-holidays nil
- "*User defined holidays.
+ "User defined holidays.
See the documentation for `calendar-holidays' for details."
:type 'sexp
:group 'holidays)
;;;###autoload
(defcustom hebrew-holidays (append hebrew-holidays-1 hebrew-holidays-2
hebrew-holidays-3 hebrew-holidays-4)
- "*Jewish holidays.
+ "Jewish holidays.
See the documentation for `calendar-holidays' for details."
:type 'sexp
:group 'holidays)
(holiday-fixed 12 25 "Christmas")
(if all-christian-calendar-holidays
(holiday-julian 12 25 "Eastern Orthodox Christmas")))
- "*Christian holidays.
+ "Christian holidays.
See the documentation for `calendar-holidays' for details."
:type 'sexp
:group 'holidays)
(holiday-islamic 10 1 "Id-al-Fitr"))
(if all-islamic-calendar-holidays
(holiday-islamic 12 10 "Id-al-Adha")))
- "*Islamic holidays.
+ "Islamic holidays.
See the documentation for `calendar-holidays' for details."
:type 'sexp
:group 'holidays)
(holiday-fixed 11 26 "Day of the Covenant"))
(if all-bahai-calendar-holidays
(holiday-fixed 11 28 "Ascension of `Abdu'l-Baha")))
- "*Baha'i holidays.
+ "Baha'i holidays.
See the documentation for `calendar-holidays' for details."
:type 'sexp
:group 'holidays)
(funcall
'holiday-sexp
calendar-daylight-savings-starts
- '(format "Daylight Savings Time Begins %s"
+ '(format "Daylight Saving Time Begins %s"
(if (fboundp 'atan)
(solar-time-string
(/ calendar-daylight-savings-starts-time (float 60))
(funcall
'holiday-sexp
calendar-daylight-savings-ends
- '(format "Daylight Savings Time Ends %s"
+ '(format "Daylight Saving Time Ends %s"
(if (fboundp 'atan)
(solar-time-string
(/ calendar-daylight-savings-ends-time (float 60))
calendar-daylight-time-zone-name)
""))))
- "*Sun-related holidays.
+ "Sun-related holidays.
See the documentation for `calendar-holidays' for details."
:type 'sexp
:group 'holidays)
(append general-holidays local-holidays other-holidays
christian-holidays hebrew-holidays islamic-holidays
bahai-holidays oriental-holidays solar-holidays)
- "*List of notable days for the command \\[holidays].
+ "List of notable days for the command \\[holidays].
Additional holidays are easy to add to the list, just put them in the
list `other-holidays' in your .emacs file. Similarly, by setting any
of `general-holidays', `local-holidays' `christian-holidays',
`hebrew-holidays', `islamic-holidays', `bahai-holidays',
`oriental-holidays', or `solar-holidays' to nil in your .emacs file,
-you can eliminate unwanted categories of holidays. The intention is
-that (in the US) `local-holidays' be set in site-init.el and
-`other-holidays' be set by the user.
+you can eliminate unwanted categories of holidays.
+
+The aforementioned variables control the holiday choices offered
+by the function `list-holidays' when it is called interactively.
+
+They also initialize the default value of `calendar-holidays',
+which is the default list of holidays used by the function
+`list-holidays' in the non-interactive case. Note that these
+variables have no effect on `calendar-holidays' after it has been
+set (e.g. after the calendar is loaded). In that case, customize
+`calendar-holidays' directly.
+
+The intention is that (in the US) `local-holidays' be set in
+site-init.el and `other-holidays' be set by the user.
Entries on the list are expressions that return (possibly empty) lists of
items of the form ((month day year) string) of a holiday in the in the
(and (< macro-y 0) (> ,mon 1) (setq ,yr (1- ,yr)))
(if (< ,yr 1) (setq ,yr (1- ,yr))))) ; 0 AD -> -1 BC, etc
+(defun calendar-increment-month (n &optional mon yr)
+ "Return the Nth month after MON/YR.
+The return value is a pair (MONTH . YEAR).
+MON defaults to `displayed-month'. YR defaults to `displayed-year'."
+ (unless mon (setq mon displayed-month))
+ (unless yr (setq yr displayed-year))
+ (increment-calendar-month mon yr n)
+ (cons mon yr))
+
(defmacro calendar-for-loop (var from init to final do &rest body)
"Execute a for loop."
+ (declare (debug (symbolp "from" form "to" form "do" body)))
`(let ((,var (1- ,init)))
(while (>= ,final (setq ,var (1+ ,var)))
,@body)))
(defmacro calendar-sum (index initial condition expression)
"For INDEX = INITIAL et seq, as long as CONDITION holds, sum EXPRESSION."
+ (declare (debug (symbolp form form form)))
`(let ((,index ,initial)
(sum 0))
(while ,condition
"Extract the month part of DATE which has the form (month day year)."
(car date))
+;; Note gives wrong answer for result of (calendar-read-date 'noday).
(defsubst extract-calendar-day (date)
"Extract the day part of DATE which has the form (month day year)."
(car (cdr date)))
(calendar-only-one-frame-setup arg))
(t (calendar-basic-setup arg))))
+(autoload 'diary-view-entries "diary-lib"
+ "Prepare and display a buffer with diary entries.
+Searches your diary file for entries that match ARG days starting with
+the date indicated by the cursor position in the displayed three-month
+calendar."
+ t)
+
+(autoload 'list-calendar-holidays "holidays"
+ "Create a buffer containing the holidays for the current calendar window.
+The holidays are those in the list `calendar-notable-days'. Returns t if any
+holidays are found, nil if not."
+ t)
+
(defun calendar-basic-setup (&optional arg)
"Display a three-month calendar in another window.
The three months appear side by side, with the current month in the middle
(calendar-current-date)))
(month (extract-calendar-month date))
(year (extract-calendar-year date)))
+ ;; (calendar-read-date t) returns a date with day = nil, which is
+ ;; not a legal date for the visible test in the diary section.
+ (if arg (setcar (cdr date) 1))
(pop-to-buffer calendar-buffer)
(increment-calendar-month month year (- calendar-offset))
(generate-calendar-window month year)
(if (and view-diary-entries-initially (calendar-date-is-visible-p date))
- (view-diary-entries
- (if (vectorp number-of-diary-entries)
- (aref number-of-diary-entries (calendar-day-of-week date))
- number-of-diary-entries))))
+ (diary-view-entries)))
(let* ((diary-buffer (get-file-buffer diary-file))
(diary-window (if diary-buffer (get-buffer-window diary-buffer)))
(split-height-threshold (if diary-window 2 1000)))
(list-calendar-holidays)))
(run-hooks 'initial-calendar-window-hook))
-(autoload 'view-diary-entries "diary-lib"
- "Prepare and display a buffer with diary entries.
-Searches your diary file for entries that match ARG days starting with
-the date indicated by the cursor position in the displayed three-month
-calendar."
- t)
-
(autoload 'view-other-diary-entries "diary-lib"
"Prepare and display buffer of diary entries from an alternative diary file.
Searches for entries that match ARG days, starting with the date indicated
t)
(autoload 'calendar-french-date-string "cal-french"
- "String of French Revolutionary date of Gregorian date."
- t)
+ "String of French Revolutionary date of Gregorian date.")
(autoload 'calendar-mayan-date-string "cal-mayan"
- "String of Mayan date of Gregorian date."
- t)
+ "String of Mayan date of Gregorian date.")
(autoload 'calendar-print-mayan-date "cal-mayan"
"Show the Mayan long count, Tzolkin, and Haab equivalents of the date under the cursor."
t)
(autoload 'calendar-chinese-date-string "cal-china"
- "String of Chinese date of Gregorian date."
- t)
+ "String of Chinese date of Gregorian date.")
(autoload 'calendar-absolute-from-astro "cal-julian"
"Absolute date of astronomical (Julian) day number D."
"Astronomical (Julian) day number of absolute date D.")
(autoload 'calendar-astro-date-string "cal-julian"
- "String of astronomical (Julian) day number of Gregorian date."
- t)
+ "String of astronomical (Julian) day number of Gregorian date.")
(autoload 'calendar-goto-astro-day-number "cal-julian"
"Move cursor to astronomical (Julian) day number."
t)
(autoload 'calendar-iso-date-string "cal-iso"
- "String of ISO date of Gregorian date."
- t)
+ "String of ISO date of Gregorian date.")
(autoload 'calendar-goto-islamic-date "cal-islam"
"Move cursor to Islamic date."
t)
(autoload 'calendar-islamic-date-string "cal-islam"
- "String of Islamic date of Gregorian date."
- t)
+ "String of Islamic date of Gregorian date.")
(autoload 'calendar-print-bahai-date "cal-bahai"
"Show the Baha'i date equivalents of date."
t)
(autoload 'calendar-bahai-date-string "cal-bahai"
- "String of Baha'i date of Gregorian date."
- t)
+ "String of Baha'i date of Gregorian date.")
(autoload 'calendar-goto-hebrew-date "cal-hebrew"
- "Move cursor to Hebrew date date."
+ "Move cursor to Hebrew date."
t)
(autoload 'calendar-print-hebrew-date "cal-hebrew"
t)
(autoload 'calendar-hebrew-date-string "cal-hebrew"
- "String of Hebrew date of Gregorian date."
- t)
+ "String of Hebrew date of Gregorian date.")
(autoload 'calendar-goto-coptic-date "cal-coptic"
- "Move cursor to Coptic date date."
+ "Move cursor to Coptic date."
t)
(autoload 'calendar-print-coptic-date "cal-coptic"
t)
(autoload 'calendar-coptic-date-string "cal-coptic"
- "String of Coptic date of Gregorian date."
- t)
+ "String of Coptic date of Gregorian date.")
(autoload 'calendar-goto-ethiopic-date "cal-coptic"
- "Move cursor to Ethiopic date date."
+ "Move cursor to Ethiopic date."
t)
(autoload 'calendar-print-ethiopic-date "cal-coptic"
t)
(autoload 'calendar-ethiopic-date-string "cal-coptic"
- "String of Ethiopic date of Gregorian date."
- t)
+ "String of Ethiopic date of Gregorian date.")
(autoload 'calendar-goto-persian-date "cal-persia"
- "Move cursor to Persian date date."
+ "Move cursor to Persian date."
t)
(autoload 'calendar-print-persian-date "cal-persia"
t)
(autoload 'calendar-persian-date-string "cal-persia"
- "String of Persian date of Gregorian date."
- t)
+ "String of Persian date of Gregorian date.")
-(autoload 'show-all-diary-entries "diary-lib"
+(autoload 'diary-show-all-entries "diary-lib"
"Show all of the diary entries in the diary file.
This function gets rid of the selective display of the diary file so that
all entries, not just some, are visible. If there is no diary buffer, one
t)
(autoload 'make-diary-entry "diary-lib"
- "Insert a diary entry STRING which may be NONMARKING in FILE."
- t)
+ "Insert a diary entry STRING which may be NONMARKING in FILE.")
(autoload 'insert-diary-entry "diary-lib"
"Insert a diary entry for the date indicated by point."
to the date indicated by point."
t)
-(autoload 'list-calendar-holidays "holidays"
- "Create a buffer containing the holidays for the current calendar window.
-The holidays are those in the list `calendar-notable-days'. Returns t if any
-holidays are found, nil if not."
- t)
-
(autoload 'cal-tex-cursor-month "cal-tex"
"Make a buffer with LaTeX commands for the month cursor is on.
Optional prefix argument specifies number of months to be produced.
-Calendar is condensed onto one page.")
+Calendar is condensed onto one page." t)
(autoload 'cal-tex-cursor-month-landscape "cal-tex"
"Make a buffer with LaTeX commands for the month cursor is on.
-Optional prefix argument specifies number of months to be produced.")
+Optional prefix argument specifies number of months to be produced." t)
(autoload 'cal-tex-cursor-day "cal-tex"
- "Make a buffer with LaTeX commands for the day cursor is on.")
+ "Make a buffer with LaTeX commands for the day cursor is on." t)
(autoload 'cal-tex-cursor-week "cal-tex"
"Make a buffer with LaTeX commands for a two-page one-week calendar.
It applies to the week that point is in.
Optional prefix argument specifies number of weeks.
-Holidays are included if `cal-tex-holidays' is t.")
+Holidays are included if `cal-tex-holidays' is t." t)
(autoload 'cal-tex-cursor-week2 "cal-tex"
"Make a buffer with LaTeX commands for a two-page one-week calendar.
It applies to the week that point is in.
Optional prefix argument specifies number of weeks.
-Holidays are included if `cal-tex-holidays' is t.")
+Holidays are included if `cal-tex-holidays' is t." t)
(autoload 'cal-tex-cursor-week-iso "cal-tex"
"Make a buffer with LaTeX commands for a one page ISO-style weekly calendar.
Optional prefix argument specifies number of weeks.
Diary entries are included if `cal-tex-diary' is t.
-Holidays are included if `cal-tex-holidays' is t.")
+Holidays are included if `cal-tex-holidays' is t." t)
(autoload 'cal-tex-cursor-week-monday "cal-tex"
"Make a buffer with LaTeX commands for a two-page one-week calendar.
It applies to the week that point is in, and starts on Monday.
Optional prefix argument specifies number of weeks.
-Holidays are included if `cal-tex-holidays' is t.")
+Holidays are included if `cal-tex-holidays' is t." t)
(autoload 'cal-tex-cursor-filofax-2week "cal-tex"
"Two-weeks-at-a-glance Filofax style calendar for week indicated by cursor.
Optional prefix argument specifies number of weeks.
Diary entries are included if cal-tex-diary is t.
-Holidays are included if `cal-tex-holidays' is t.")
+Holidays are included if `cal-tex-holidays' is t." t)
(autoload 'cal-tex-cursor-filofax-week "cal-tex"
"One-week-at-a-glance Filofax style calendar for week indicated by cursor.
Optional prefix argument specifies number of weeks.
Weeks start on Monday.
Diary entries are included if cal-tex-diary is t.
-Holidays are included if `cal-tex-holidays' is t.")
+Holidays are included if `cal-tex-holidays' is t." t)
(autoload 'cal-tex-cursor-filofax-daily "cal-tex"
"Day-per-page Filofax style calendar for week indicated by cursor.
Optional prefix argument specifies number of weeks. Weeks start on Monday.
Diary entries are included if `cal-tex-diary' is t.
-Holidays are included if `cal-tex-holidays' is t.")
+Holidays are included if `cal-tex-holidays' is t." t)
(autoload 'cal-tex-cursor-year "cal-tex"
"Make a buffer with LaTeX commands for a year's calendar.
-Optional prefix argument specifies number of years.")
+Optional prefix argument specifies number of years." t)
(autoload 'cal-tex-cursor-year-landscape "cal-tex"
"Make a buffer with LaTeX commands for a year's calendar (landscape).
-Optional prefix argument specifies number of years.")
+Optional prefix argument specifies number of years." t)
(autoload 'cal-tex-cursor-filofax-year "cal-tex"
"Make a buffer with LaTeX commands for a year's calendar (Filofax).
-Optional prefix argument specifies number of years.")
+Optional prefix argument specifies number of years." t)
+
+(autoload 'cal-html-cursor-month "cal-html"
+ "Write an HTML calendar file for numeric MONTH of four-digit YEAR.
+The output directory DIR is created if necessary. Interactively,
+MONTH and YEAR are taken from the calendar cursor position. Note
+that any existing output files are overwritten." t)
+
+(autoload 'cal-html-cursor-year "cal-html"
+ "Write HTML calendar files (index and monthly pages) for four-digit YEAR.
+The output directory DIR is created if necessary. Interactively,
+YEAR is taken from the calendar cursor position. Note that any
+existing output files are overwritten." t)
(autoload 'mark-calendar-holidays "holidays"
"Mark notable days in the calendar window."
;;;###autoload
(defcustom calendar-week-start-day 0
- "*The day of the week on which a week in the calendar begins.
+ "The day of the week on which a week in the calendar begins.
0 means Sunday (default), 1 means Monday, and so on.
If you change this variable directly (without using customize)
update the calendar display to reflect the change, otherwise
movement commands will not work correctly."
:type 'integer
+ ;; Change the initialize so that if you reload calendar.el, it will not
+ ;; cause a redraw (which may fail, e.g. with "invalid byte-code in
+ ;; calendar.elc" because of the "byte-compile-dynamic").
+ :initialize 'custom-initialize-default
:set (lambda (sym val)
(set sym val)
(redraw-calendar))
:group 'calendar)
(defcustom calendar-debug-sexp nil
- "*Turn debugging on when evaluating a sexp in the diary or holiday list."
+ "Turn debugging on when evaluating a sexp in the diary or holiday list."
:type 'boolean
:group 'calendar)
(defvar calendar-mode-map nil)
(if calendar-mode-map
nil
- (setq calendar-mode-map (make-sparse-keymap))
- (require 'cal-menu)
- (calendar-for-loop i from 0 to 9 do
- (define-key calendar-mode-map (int-to-string i) 'digit-argument))
- (let ((l (list 'narrow-to-region 'mark-word 'mark-sexp 'mark-paragraph
- 'mark-defun 'mark-whole-buffer 'mark-page
- 'downcase-region 'upcase-region 'kill-region
- 'copy-region-as-kill 'capitalize-region 'write-region)))
- (while l
- (substitute-key-definition (car l) 'calendar-not-implemented
- calendar-mode-map global-map)
- (setq l (cdr l))))
- (define-key calendar-mode-map "-" 'negative-argument)
- (define-key calendar-mode-map "\C-x>" 'scroll-calendar-right)
- (define-key calendar-mode-map [prior] 'scroll-calendar-right-three-months)
- (define-key calendar-mode-map "\ev" 'scroll-calendar-right-three-months)
- (define-key calendar-mode-map "\C-x<" 'scroll-calendar-left)
- (define-key calendar-mode-map [next] 'scroll-calendar-left-three-months)
- (define-key calendar-mode-map "\C-v" 'scroll-calendar-left-three-months)
- (define-key calendar-mode-map "\C-b" 'calendar-backward-day)
- (define-key calendar-mode-map "\C-p" 'calendar-backward-week)
- (define-key calendar-mode-map "\e{" 'calendar-backward-month)
- (define-key calendar-mode-map "\C-x[" 'calendar-backward-year)
- (define-key calendar-mode-map "\C-f" 'calendar-forward-day)
- (define-key calendar-mode-map "\C-n" 'calendar-forward-week)
- (define-key calendar-mode-map [left] 'calendar-backward-day)
- (define-key calendar-mode-map [up] 'calendar-backward-week)
- (define-key calendar-mode-map [right] 'calendar-forward-day)
- (define-key calendar-mode-map [down] 'calendar-forward-week)
- (define-key calendar-mode-map "\e}" 'calendar-forward-month)
- (define-key calendar-mode-map "\C-x]" 'calendar-forward-year)
- (define-key calendar-mode-map "\C-a" 'calendar-beginning-of-week)
- (define-key calendar-mode-map "\C-e" 'calendar-end-of-week)
- (define-key calendar-mode-map "\ea" 'calendar-beginning-of-month)
- (define-key calendar-mode-map "\ee" 'calendar-end-of-month)
- (define-key calendar-mode-map "\e<" 'calendar-beginning-of-year)
- (define-key calendar-mode-map "\e>" 'calendar-end-of-year)
- (define-key calendar-mode-map "\C-@" 'calendar-set-mark)
- ;; Many people are used to typing C-SPC and getting C-@.
- (define-key calendar-mode-map [?\C- ] 'calendar-set-mark)
- (define-key calendar-mode-map "\C-x\C-x" 'calendar-exchange-point-and-mark)
- (define-key calendar-mode-map "\e=" 'calendar-count-days-region)
- (define-key calendar-mode-map "gd" 'calendar-goto-date)
- (define-key calendar-mode-map "gD" 'calendar-goto-day-of-year)
- (define-key calendar-mode-map "gj" 'calendar-goto-julian-date)
- (define-key calendar-mode-map "ga" 'calendar-goto-astro-day-number)
- (define-key calendar-mode-map "gh" 'calendar-goto-hebrew-date)
- (define-key calendar-mode-map "gi" 'calendar-goto-islamic-date)
- (define-key calendar-mode-map "gb" 'calendar-goto-bahai-date)
- (define-key calendar-mode-map "gC" 'calendar-goto-chinese-date)
- (define-key calendar-mode-map "gk" 'calendar-goto-coptic-date)
- (define-key calendar-mode-map "ge" 'calendar-goto-ethiopic-date)
- (define-key calendar-mode-map "gp" 'calendar-goto-persian-date)
- (define-key calendar-mode-map "gc" 'calendar-goto-iso-date)
- (define-key calendar-mode-map "gw" 'calendar-goto-iso-week)
- (define-key calendar-mode-map "gf" 'calendar-goto-french-date)
- (define-key calendar-mode-map "gml" 'calendar-goto-mayan-long-count-date)
- (define-key calendar-mode-map "gmpc" 'calendar-previous-calendar-round-date)
- (define-key calendar-mode-map "gmnc" 'calendar-next-calendar-round-date)
- (define-key calendar-mode-map "gmph" 'calendar-previous-haab-date)
- (define-key calendar-mode-map "gmnh" 'calendar-next-haab-date)
- (define-key calendar-mode-map "gmpt" 'calendar-previous-tzolkin-date)
- (define-key calendar-mode-map "gmnt" 'calendar-next-tzolkin-date)
- (define-key calendar-mode-map "Aa" 'appt-add)
- (define-key calendar-mode-map "Ad" 'appt-delete)
- (define-key calendar-mode-map "S" 'calendar-sunrise-sunset)
- (define-key calendar-mode-map "M" 'calendar-phases-of-moon)
- (define-key calendar-mode-map " " 'scroll-other-window)
- (define-key calendar-mode-map (kbd "DEL") 'scroll-other-window-down)
- (define-key calendar-mode-map "\C-c\C-l" 'redraw-calendar)
- (define-key calendar-mode-map "." 'calendar-goto-today)
- (define-key calendar-mode-map "o" 'calendar-other-month)
- (define-key calendar-mode-map "q" 'exit-calendar)
- (define-key calendar-mode-map "a" 'list-calendar-holidays)
- (define-key calendar-mode-map "h" 'calendar-cursor-holidays)
- (define-key calendar-mode-map "x" 'mark-calendar-holidays)
- (define-key calendar-mode-map "u" 'calendar-unmark)
- (define-key calendar-mode-map "m" 'mark-diary-entries)
- (define-key calendar-mode-map "d" 'view-diary-entries)
- (define-key calendar-mode-map "D" 'view-other-diary-entries)
- (define-key calendar-mode-map "s" 'show-all-diary-entries)
- (define-key calendar-mode-map "pd" 'calendar-print-day-of-year)
- (define-key calendar-mode-map "pC" 'calendar-print-chinese-date)
- (define-key calendar-mode-map "pk" 'calendar-print-coptic-date)
- (define-key calendar-mode-map "pe" 'calendar-print-ethiopic-date)
- (define-key calendar-mode-map "pp" 'calendar-print-persian-date)
- (define-key calendar-mode-map "pc" 'calendar-print-iso-date)
- (define-key calendar-mode-map "pj" 'calendar-print-julian-date)
- (define-key calendar-mode-map "pa" 'calendar-print-astro-day-number)
- (define-key calendar-mode-map "ph" 'calendar-print-hebrew-date)
- (define-key calendar-mode-map "pi" 'calendar-print-islamic-date)
- (define-key calendar-mode-map "pb" 'calendar-print-bahai-date)
- (define-key calendar-mode-map "pf" 'calendar-print-french-date)
- (define-key calendar-mode-map "pm" 'calendar-print-mayan-date)
- (define-key calendar-mode-map "po" 'calendar-print-other-dates)
- (define-key calendar-mode-map "id" 'insert-diary-entry)
- (define-key calendar-mode-map "iw" 'insert-weekly-diary-entry)
- (define-key calendar-mode-map "im" 'insert-monthly-diary-entry)
- (define-key calendar-mode-map "iy" 'insert-yearly-diary-entry)
- (define-key calendar-mode-map "ia" 'insert-anniversary-diary-entry)
- (define-key calendar-mode-map "ib" 'insert-block-diary-entry)
- (define-key calendar-mode-map "ic" 'insert-cyclic-diary-entry)
- (define-key calendar-mode-map "ihd" 'insert-hebrew-diary-entry)
- (define-key calendar-mode-map "ihm" 'insert-monthly-hebrew-diary-entry)
- (define-key calendar-mode-map "ihy" 'insert-yearly-hebrew-diary-entry)
- (define-key calendar-mode-map "iid" 'insert-islamic-diary-entry)
- (define-key calendar-mode-map "iim" 'insert-monthly-islamic-diary-entry)
- (define-key calendar-mode-map "iiy" 'insert-yearly-islamic-diary-entry)
- (define-key calendar-mode-map "iBd" 'insert-bahai-diary-entry)
- (define-key calendar-mode-map "iBm" 'insert-monthly-bahai-diary-entry)
- (define-key calendar-mode-map "iBy" 'insert-yearly-bahai-diary-entry)
- (define-key calendar-mode-map "?" 'calendar-goto-info-node)
- (define-key calendar-mode-map "tm" 'cal-tex-cursor-month)
- (define-key calendar-mode-map "tM" 'cal-tex-cursor-month-landscape)
- (define-key calendar-mode-map "td" 'cal-tex-cursor-day)
- (define-key calendar-mode-map "tw1" 'cal-tex-cursor-week)
- (define-key calendar-mode-map "tw2" 'cal-tex-cursor-week2)
- (define-key calendar-mode-map "tw3" 'cal-tex-cursor-week-iso)
- (define-key calendar-mode-map "tw4" 'cal-tex-cursor-week-monday)
- (define-key calendar-mode-map "tfd" 'cal-tex-cursor-filofax-daily)
- (define-key calendar-mode-map "tfw" 'cal-tex-cursor-filofax-2week)
- (define-key calendar-mode-map "tfW" 'cal-tex-cursor-filofax-week)
- (define-key calendar-mode-map "tfy" 'cal-tex-cursor-filofax-year)
- (define-key calendar-mode-map "ty" 'cal-tex-cursor-year)
- (define-key calendar-mode-map "tY" 'cal-tex-cursor-year-landscape))
+ (let ((map (make-keymap)))
+ (suppress-keymap map)
+ (dolist (c '(narrow-to-region mark-word mark-sexp mark-paragraph
+ mark-defun mark-whole-buffer mark-page
+ downcase-region upcase-region kill-region
+ copy-region-as-kill capitalize-region write-region))
+ (define-key map (vector 'remap c) 'calendar-not-implemented))
+ (define-key map "<" 'scroll-calendar-right)
+ (define-key map "\C-x<" 'scroll-calendar-right)
+ (define-key map [prior] 'scroll-calendar-right-three-months)
+ (define-key map "\ev" 'scroll-calendar-right-three-months)
+ (define-key map ">" 'scroll-calendar-left)
+ (define-key map "\C-x>" 'scroll-calendar-left)
+ (define-key map [next] 'scroll-calendar-left-three-months)
+ (define-key map "\C-v" 'scroll-calendar-left-three-months)
+ (define-key map "\C-b" 'calendar-backward-day)
+ (define-key map "\C-p" 'calendar-backward-week)
+ (define-key map "\e{" 'calendar-backward-month)
+ (define-key map "\C-x[" 'calendar-backward-year)
+ (define-key map "\C-f" 'calendar-forward-day)
+ (define-key map "\C-n" 'calendar-forward-week)
+ (define-key map [left] 'calendar-backward-day)
+ (define-key map [up] 'calendar-backward-week)
+ (define-key map [right] 'calendar-forward-day)
+ (define-key map [down] 'calendar-forward-week)
+ (define-key map "\e}" 'calendar-forward-month)
+ (define-key map "\C-x]" 'calendar-forward-year)
+ (define-key map "\C-a" 'calendar-beginning-of-week)
+ (define-key map "\C-e" 'calendar-end-of-week)
+ (define-key map "\ea" 'calendar-beginning-of-month)
+ (define-key map "\ee" 'calendar-end-of-month)
+ (define-key map "\e<" 'calendar-beginning-of-year)
+ (define-key map "\e>" 'calendar-end-of-year)
+ (define-key map "\C-@" 'calendar-set-mark)
+ ;; Many people are used to typing C-SPC and getting C-@.
+ (define-key map [?\C- ] 'calendar-set-mark)
+ (define-key map "\C-x\C-x" 'calendar-exchange-point-and-mark)
+ (define-key map "\e=" 'calendar-count-days-region)
+ (define-key map "gd" 'calendar-goto-date)
+ (define-key map "gD" 'calendar-goto-day-of-year)
+ (define-key map "gj" 'calendar-goto-julian-date)
+ (define-key map "ga" 'calendar-goto-astro-day-number)
+ (define-key map "gh" 'calendar-goto-hebrew-date)
+ (define-key map "gi" 'calendar-goto-islamic-date)
+ (define-key map "gb" 'calendar-goto-bahai-date)
+ (define-key map "gC" 'calendar-goto-chinese-date)
+ (define-key map "gk" 'calendar-goto-coptic-date)
+ (define-key map "ge" 'calendar-goto-ethiopic-date)
+ (define-key map "gp" 'calendar-goto-persian-date)
+ (define-key map "gc" 'calendar-goto-iso-date)
+ (define-key map "gw" 'calendar-goto-iso-week)
+ (define-key map "gf" 'calendar-goto-french-date)
+ (define-key map "gml" 'calendar-goto-mayan-long-count-date)
+ (define-key map "gmpc" 'calendar-previous-calendar-round-date)
+ (define-key map "gmnc" 'calendar-next-calendar-round-date)
+ (define-key map "gmph" 'calendar-previous-haab-date)
+ (define-key map "gmnh" 'calendar-next-haab-date)
+ (define-key map "gmpt" 'calendar-previous-tzolkin-date)
+ (define-key map "gmnt" 'calendar-next-tzolkin-date)
+ (define-key map "Aa" 'appt-add)
+ (define-key map "Ad" 'appt-delete)
+ (define-key map "S" 'calendar-sunrise-sunset)
+ (define-key map "M" 'calendar-phases-of-moon)
+ (define-key map " " 'scroll-other-window)
+ (define-key map (kbd "DEL") 'scroll-other-window-down)
+ (define-key map "\C-c\C-l" 'redraw-calendar)
+ (define-key map "." 'calendar-goto-today)
+ (define-key map "o" 'calendar-other-month)
+ (define-key map "q" 'exit-calendar)
+ (define-key map "a" 'list-calendar-holidays)
+ (define-key map "h" 'calendar-cursor-holidays)
+ (define-key map "x" 'mark-calendar-holidays)
+ (define-key map "u" 'calendar-unmark)
+ (define-key map "m" 'mark-diary-entries)
+ (define-key map "d" 'diary-view-entries)
+ (define-key map "D" 'view-other-diary-entries)
+ (define-key map "s" 'diary-show-all-entries)
+ (define-key map "pd" 'calendar-print-day-of-year)
+ (define-key map "pC" 'calendar-print-chinese-date)
+ (define-key map "pk" 'calendar-print-coptic-date)
+ (define-key map "pe" 'calendar-print-ethiopic-date)
+ (define-key map "pp" 'calendar-print-persian-date)
+ (define-key map "pc" 'calendar-print-iso-date)
+ (define-key map "pj" 'calendar-print-julian-date)
+ (define-key map "pa" 'calendar-print-astro-day-number)
+ (define-key map "ph" 'calendar-print-hebrew-date)
+ (define-key map "pi" 'calendar-print-islamic-date)
+ (define-key map "pb" 'calendar-print-bahai-date)
+ (define-key map "pf" 'calendar-print-french-date)
+ (define-key map "pm" 'calendar-print-mayan-date)
+ (define-key map "po" 'calendar-print-other-dates)
+ (define-key map "id" 'insert-diary-entry)
+ (define-key map "iw" 'insert-weekly-diary-entry)
+ (define-key map "im" 'insert-monthly-diary-entry)
+ (define-key map "iy" 'insert-yearly-diary-entry)
+ (define-key map "ia" 'insert-anniversary-diary-entry)
+ (define-key map "ib" 'insert-block-diary-entry)
+ (define-key map "ic" 'insert-cyclic-diary-entry)
+ (define-key map "ihd" 'insert-hebrew-diary-entry)
+ (define-key map "ihm" 'insert-monthly-hebrew-diary-entry)
+ (define-key map "ihy" 'insert-yearly-hebrew-diary-entry)
+ (define-key map "iid" 'insert-islamic-diary-entry)
+ (define-key map "iim" 'insert-monthly-islamic-diary-entry)
+ (define-key map "iiy" 'insert-yearly-islamic-diary-entry)
+ (define-key map "iBd" 'insert-bahai-diary-entry)
+ (define-key map "iBm" 'insert-monthly-bahai-diary-entry)
+ (define-key map "iBy" 'insert-yearly-bahai-diary-entry)
+ (define-key map "?" 'calendar-goto-info-node)
+ (define-key map "Hm" 'cal-html-cursor-month)
+ (define-key map "Hy" 'cal-html-cursor-year)
+ (define-key map "tm" 'cal-tex-cursor-month)
+ (define-key map "tM" 'cal-tex-cursor-month-landscape)
+ (define-key map "td" 'cal-tex-cursor-day)
+ (define-key map "tw1" 'cal-tex-cursor-week)
+ (define-key map "tw2" 'cal-tex-cursor-week2)
+ (define-key map "tw3" 'cal-tex-cursor-week-iso)
+ (define-key map "tw4" 'cal-tex-cursor-week-monday)
+ (define-key map "tfd" 'cal-tex-cursor-filofax-daily)
+ (define-key map "tfw" 'cal-tex-cursor-filofax-2week)
+ (define-key map "tfW" 'cal-tex-cursor-filofax-week)
+ (define-key map "tfy" 'cal-tex-cursor-filofax-year)
+ (define-key map "ty" 'cal-tex-cursor-year)
+ (define-key map "tY" 'cal-tex-cursor-year-landscape)
+ (setq calendar-mode-map map)
+ ;; Require cal-menu after initializing calendar-mode-map because it uses it.
+ (require 'cal-menu)))
(defun describe-calendar-mode ()
"Create a help buffer with a brief description of the `calendar-mode'."
(interactive)
- (with-output-to-temp-buffer "*Help*"
+ (help-setup-xref (list #'describe-calendar-mode) (interactive-p))
+ (with-output-to-temp-buffer (help-buffer)
(princ
(format
"Calendar Mode:\nFor a complete description, type %s\n%s\n"
(substitute-command-keys
"\\<calendar-mode-map>\\[describe-mode] from within the calendar")
(substitute-command-keys "\\{calendar-mode-map}")))
- (save-excursion
- (set-buffer standard-output)
- (help-mode))
(print-help-return-message)))
;; Calendar mode is suitable only for specially formatted data.
(defvar calendar-mode-line-format
(list
- (propertize (substitute-command-keys
- "\\<calendar-mode-map>\\[scroll-calendar-left]")
- 'help-echo "mouse-2: scroll left"
- 'keymap (make-mode-line-mouse-map 'mouse-2
- 'mouse-scroll-calendar-left))
+ (propertize "<"
+ 'help-echo "mouse-1: previous month"
+ 'mouse-face 'mode-line-highlight
+ 'keymap (make-mode-line-mouse-map 'mouse-1
+ 'mouse-scroll-calendar-right))
"Calendar"
(concat
(propertize
(substitute-command-keys
"\\<calendar-mode-map>\\[calendar-goto-info-node] info")
- 'help-echo "mouse-2: read Info on Calendar"
- 'keymap (make-mode-line-mouse-map 'mouse-2 'calendar-goto-info-node))
- "/"
+ 'help-echo "mouse-1: read Info on Calendar"
+ 'mouse-face 'mode-line-highlight
+ 'keymap (make-mode-line-mouse-map 'mouse-1 'calendar-goto-info-node))
+ " / "
(propertize
(substitute-command-keys
- "\\<calendar-mode-map>\\[calendar-other-month] other")
- 'help-echo "mouse-2: choose another month"
+ " \\<calendar-mode-map>\\[calendar-other-month] other")
+ 'help-echo "mouse-1: choose another month"
+ 'mouse-face 'mode-line-highlight
'keymap (make-mode-line-mouse-map
- 'mouse-2 'mouse-calendar-other-month))
- "/"
+ 'mouse-1 'mouse-calendar-other-month))
+ " / "
(propertize
(substitute-command-keys
"\\<calendar-mode-map>\\[calendar-goto-today] today")
- 'help-echo "mouse-2: go to today's date"
- 'keymap (make-mode-line-mouse-map 'mouse-2 #'calendar-goto-today)))
+ 'help-echo "mouse-1: go to today's date"
+ 'mouse-face 'mode-line-highlight
+ 'keymap (make-mode-line-mouse-map 'mouse-1 #'calendar-goto-today)))
'(calendar-date-string (calendar-current-date) t)
- (propertize (substitute-command-keys
- "\\<calendar-mode-map>\\[scroll-calendar-right]")
- 'help-echo "mouse-2: scroll right"
+ (propertize ">"
+ 'help-echo "mouse-1: next month"
+ 'mouse-face 'mode-line-highlight
'keymap (make-mode-line-mouse-map
- 'mouse-2 'mouse-scroll-calendar-right)))
+ 'mouse-1 'mouse-scroll-calendar-left)))
"The mode line of the calendar buffer.
This must be a list of items that evaluate to strings--those strings are
\\<calendar-mode-map>\\[calendar-goto-info-node] from within the calendar.
\\<calendar-mode-map>\\{calendar-mode-map}"
-
(kill-all-local-variables)
(setq major-mode 'calendar-mode)
(setq mode-name "Calendar")
(make-local-variable 'displayed-month);; Month in middle of window.
(make-local-variable 'displayed-year) ;; Year in middle of window.
(set (make-local-variable 'font-lock-defaults)
- '(calendar-font-lock-keywords t)))
+ '(calendar-font-lock-keywords t))
+ (run-mode-hooks 'calendar-mode-hook))
(defun calendar-string-spread (strings char length)
"Concatenate list of STRINGS separated with copies of CHAR to fill LENGTH.
(s (car strings))
(strings (cdr strings))
(i 0))
- (while strings
+ (dolist (string strings)
(setq s (concat s
(make-string (max 0 (/ (+ n i) m)) char)
- (car strings)))
- (setq i (1+ i))
- (setq strings (cdr strings)))
+ string))
+ (setq i (1+ i)))
(substring s 0 length)))
(defun update-calendar-mode-line ()
"Update the calendar mode line with the current date and date style."
(if (bufferp (get-buffer calendar-buffer))
- (save-excursion
- (set-buffer calendar-buffer)
+ (with-current-buffer calendar-buffer
(setq mode-line-format
(calendar-string-spread
(let ((date (condition-case nil
list)
(walk-windows (lambda (w)
(if (memq (window-buffer w) calendar-buffers)
- (setq list (cons w list))))
+ (push w list)))
nil t)
list))
(buffers (list "*Yahrzeits*" lunar-phases-buffer holiday-buffer
fancy-diary-buffer diary-buffer calendar-buffer
other-calendars-buffer))
- (buffer-list nil)
- b)
- (while buffers
- (setq b (car buffers))
+ (buffer-list nil))
+ (dolist (b buffers)
(setq b (cond ((stringp b) (get-buffer b))
((bufferp b) b)
(t nil)))
- (if b (setq buffer-list (cons b buffer-list)))
- (setq buffers (cdr buffers)))
+ (if b (push b buffer-list)))
buffer-list))
(defun exit-calendar ()
(if (not (looking-at " "))
(re-search-backward "[^0-9]"))
(list month
- (string-to-int (buffer-substring (1+ (point)) (+ 4 (point))))
+ (string-to-number (buffer-substring (1+ (point)) (+ 4 (point))))
year))
- (if (looking-at "\\*")
- (save-excursion
- (re-search-backward "[^*]")
- (if (looking-at ".\\*\\*")
- (list month calendar-starred-day year)
- (if error (error "Not on a date!"))))
+ (if (and (looking-at "\\*")
+ (save-excursion
+ (re-search-backward "[^*]")
+ (looking-at ".\\*\\*")))
+ (list month calendar-starred-day year)
(if error (error "Not on a date!"))))))
+(add-to-list 'debug-ignored-errors "Not on a date!")
+
;; The following version of calendar-gregorian-from-absolute is preferred for
;; reasons of clarity, BUT it's much slower than the version that follows it.
(let ((date (calendar-cursor-to-date t)))
(if (null arg)
(progn
- (setq calendar-mark-ring (cons date calendar-mark-ring))
+ (push date calendar-mark-ring)
;; Since the top of the mark ring is the marked date in the
;; calendar, the mark ring in the calendar is one longer than
;; in other buffers to get the same effect.
(day (extract-calendar-day date))
(year (extract-calendar-year date)))
(and (<= 1 month) (<= month 12)
- (<= 1 day) (<= day (calendar-last-day-of-month month year))
+ ;; (calendar-read-date t) returns a date with day = nil.
+ ;; Should not be valid (?), since many funcs prob assume integer.
+ ;; (calendar-read-date 'noday) returns (month year), which
+ ;; currently results in extract-calendar-year returning nil.
+ day year (<= 1 day) (<= day (calendar-last-day-of-month month year))
;; BC dates left as non-valid, to suppress errors from
;; complex holiday algorithms not suitable for years BC.
;; Note there are side effects on calendar navigation.
MARK is a single-character string, a list of face attributes/values, or a face.
MARK defaults to `diary-entry-marker'."
(if (calendar-date-is-legal-p date)
- (save-excursion
- (set-buffer calendar-buffer)
- (calendar-cursor-to-visible-date date)
- (let ((mark (or (and (stringp mark) (= (length mark) 1) mark) ; single-char
- (and (listp mark) (> (length mark) 0) mark) ; attr list
- (and (facep mark) mark) ; face-name
- diary-entry-marker)))
- (if (facep mark)
- (progn ; face or an attr-list that contained a face
- (overlay-put
- (make-overlay (1- (point)) (1+ (point))) 'face mark))
- (if (and (stringp mark)
- (= (length mark) 1)) ; single-char
- (let ((buffer-read-only nil))
- (forward-char 1)
- (delete-char 1)
- (insert mark)
- (forward-char -2))
- (let ; attr list
- ((temp-face
- (make-symbol (apply 'concat "temp-face-"
- (mapcar '(lambda (sym)
- (cond ((symbolp sym) (symbol-name sym))
- ((numberp sym) (int-to-string sym))
- (t sym))) mark))))
- (faceinfo mark))
- (make-face temp-face)
- ;; Remove :face info from the mark, copy the face info into temp-face
- (while (setq faceinfo (memq :face faceinfo))
- (copy-face (read (nth 1 faceinfo)) temp-face)
- (setcar faceinfo nil)
- (setcar (cdr faceinfo) nil))
- (setq mark (delq nil mark))
- ;; Apply the font aspects
- (apply 'set-face-attribute temp-face nil mark)
- (overlay-put
- (make-overlay (1- (point)) (1+ (point))) 'face temp-face))))))))
+ (with-current-buffer calendar-buffer
+ (save-excursion
+ (calendar-cursor-to-visible-date date)
+ (setq mark
+ (or (and (stringp mark) (= (length mark) 1) mark) ; single-char
+ (and (listp mark) (> (length mark) 0) mark) ; attr list
+ (and (facep mark) mark) ; face-name
+ diary-entry-marker))
+ (cond
+ ;; face or an attr-list that contained a face
+ ((facep mark)
+ (overlay-put
+ (make-overlay (1- (point)) (1+ (point))) 'face mark))
+ ;; single-char
+ ((and (stringp mark) (= (length mark) 1))
+ (let ((inhibit-read-only t))
+ (forward-char 1)
+ ;; Insert before delete so as to better preserve markers.
+ (insert mark)
+ (delete-char 1)
+ (forward-char -2)))
+ (t ;; attr list
+ (let ((temp-face
+ (make-symbol
+ (apply 'concat "temp-"
+ (mapcar (lambda (sym)
+ (cond
+ ((symbolp sym) (symbol-name sym))
+ ((numberp sym) (number-to-string sym))
+ (t sym)))
+ mark))))
+ (faceinfo mark))
+ (make-face temp-face)
+ ;; Remove :face info from the mark, copy the face info into
+ ;; temp-face
+ (while (setq faceinfo (memq :face faceinfo))
+ (copy-face (read (nth 1 faceinfo)) temp-face)
+ (setcar faceinfo nil)
+ (setcar (cdr faceinfo) nil))
+ (setq mark (delq nil mark))
+ ;; Apply the font aspects
+ (apply 'set-face-attribute temp-face nil mark)
+ (overlay-put
+ (make-overlay (1- (point)) (1+ (point))) 'face temp-face))))))))
(defun calendar-star-date ()
"Replace the date under the cursor in the calendar window with asterisks.
This function can be used with the `today-visible-calendar-hook' run after the
calendar window has been prepared."
- (let ((inhibit-read-only t))
- (make-local-variable 'calendar-starred-day)
+ (let ((inhibit-read-only t)
+ (modified (buffer-modified-p)))
(forward-char 1)
- (setq calendar-starred-day
- (string-to-int
- (buffer-substring (point) (- (point) 2))))
- (delete-char -2)
+ (set (make-local-variable 'calendar-starred-day)
+ (string-to-number
+ (buffer-substring (point) (- (point) 2))))
+ ;; Insert before deleting, to better preserve markers.
(insert "**")
- (backward-char 1)
- (set-buffer-modified-p nil)))
+ (forward-char -2)
+ (delete-char -2)
+ (forward-char 1)
+ (restore-buffer-modified-p modified)))
(defun calendar-mark-today ()
"Mark the date under the cursor in the calendar window.
"Show dates on other calendars for date under the cursor."
(interactive)
(let* ((date (calendar-cursor-to-date t)))
- (save-excursion
- (set-buffer (get-buffer-create other-calendars-buffer))
- (setq buffer-read-only nil)
- (calendar-set-mode-line
- (concat (calendar-date-string date) " (Gregorian)"))
- (erase-buffer)
- (insert
- (mapconcat 'identity
- (list (calendar-day-of-year-string date)
- (format "ISO date: %s" (calendar-iso-date-string date))
- (format "Julian date: %s"
- (calendar-julian-date-string date))
- (format
- "Astronomical (Julian) day number (at noon UTC): %s.0"
- (calendar-astro-date-string date))
- (format "Fixed (RD) date: %s"
- (calendar-absolute-from-gregorian date))
- (format "Hebrew date (before sunset): %s"
- (calendar-hebrew-date-string date))
- (format "Persian date: %s"
- (calendar-persian-date-string date))
- (let ((i (calendar-islamic-date-string date)))
- (if (not (string-equal i ""))
- (format "Islamic date (before sunset): %s" i)))
- (let ((b (calendar-bahai-date-string date)))
- (if (not (string-equal b ""))
- (format "Baha'i date (before sunset): %s" b)))
- (format "Chinese date: %s"
- (calendar-chinese-date-string date))
- (let ((c (calendar-coptic-date-string date)))
- (if (not (string-equal c ""))
- (format "Coptic date: %s" c)))
- (let ((e (calendar-ethiopic-date-string date)))
- (if (not (string-equal e ""))
- (format "Ethiopic date: %s" e)))
- (let ((f (calendar-french-date-string date)))
- (if (not (string-equal f ""))
- (format "French Revolutionary date: %s" f)))
- (format "Mayan date: %s"
- (calendar-mayan-date-string date)))
- "\n"))
- (goto-char (point-min))
- (set-buffer-modified-p nil)
- (setq buffer-read-only t)
+ (with-current-buffer (get-buffer-create other-calendars-buffer)
+ (let ((inhibit-read-only t)
+ (modified (buffer-modified-p)))
+ (calendar-set-mode-line
+ (concat (calendar-date-string date) " (Gregorian)"))
+ (erase-buffer)
+ (apply
+ 'insert
+ (delq nil
+ (list
+ (calendar-day-of-year-string date) "\n"
+ (format "ISO date: %s\n" (calendar-iso-date-string date))
+ (format "Julian date: %s\n"
+ (calendar-julian-date-string date))
+ (format "Astronomical (Julian) day number (at noon UTC): %s.0\n"
+ (calendar-astro-date-string date))
+ (format "Fixed (RD) date: %s\n"
+ (calendar-absolute-from-gregorian date))
+ (format "Hebrew date (before sunset): %s\n"
+ (calendar-hebrew-date-string date))
+ (format "Persian date: %s\n"
+ (calendar-persian-date-string date))
+ (let ((i (calendar-islamic-date-string date)))
+ (if (not (string-equal i ""))
+ (format "Islamic date (before sunset): %s\n" i)))
+ (let ((b (calendar-bahai-date-string date)))
+ (if (not (string-equal b ""))
+ (format "Baha'i date (before sunset): %s\n" b)))
+ (format "Chinese date: %s\n"
+ (calendar-chinese-date-string date))
+ (let ((c (calendar-coptic-date-string date)))
+ (if (not (string-equal c ""))
+ (format "Coptic date: %s\n" c)))
+ (let ((e (calendar-ethiopic-date-string date)))
+ (if (not (string-equal e ""))
+ (format "Ethiopic date: %s\n" e)))
+ (let ((f (calendar-french-date-string date)))
+ (if (not (string-equal f ""))
+ (format "French Revolutionary date: %s\n" f)))
+ (format "Mayan date: %s\n"
+ (calendar-mayan-date-string date)))))
+ (goto-char (point-min))
+ (restore-buffer-modified-p modified))
(display-buffer other-calendars-buffer))))
(defun calendar-print-day-of-year ()
(defun calendar-set-mode-line (str)
"Set mode line to STR, centered, surrounded by dashes."
- (setq mode-line-format
- (calendar-string-spread
- (list str) ?-
+ (let* ((edges (window-edges))
;; As per doc of window-width, total visible mode-line length.
- (let ((edges (window-edges))) (- (nth 2 edges) (nth 0 edges))))))
+ (width (- (nth 2 edges) (nth 0 edges))))
+ (setq mode-line-format
+ (if buffer-file-name
+ `("-" mode-line-modified
+ ,(calendar-string-spread (list str) ?- (- width 6))
+ "---")
+ (calendar-string-spread (list str) ?- width)))))
(defun calendar-mod (m n)
"Non-negative remainder of M/N with N instead of 0."
(provide 'calendar)
-;;; Local variables:
-;;; byte-compile-dynamic: t
-;;; End:
+;; Local variables:
+;; byte-compile-dynamic: t
+;; End:
-;;; arch-tag: 19c61596-c8fb-4c69-bcf1-7dd739919cd8
+;; arch-tag: 19c61596-c8fb-4c69-bcf1-7dd739919cd8
;;; calendar.el ends here