]> code.delx.au - gnu-emacs/blobdiff - lisp/calendar/calendar.el
(generate-calendar-month): Make highlighted text for mouse-2 a full column (2
[gnu-emacs] / lisp / calendar / calendar.el
index 366e5c243deafd594fe6225e592238a33bf3dd73..2cf4dc76f928bfba8024f9625af2e2ac53c44ee8 100644 (file)
@@ -9,26 +9,21 @@
 ;;     Hebrew calendar, Islamic calendar, ISO calendar, Julian day number,
 ;;     diary, holidays
 
-(defun calendar-version ()
-  (interactive)
-  (message "Version 5.3, January 25, 1994"))
-
 ;; This file is part of GNU Emacs.
 
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
 ;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY.  No author or distributor
-;; accepts responsibility to anyone for the consequences of using it
-;; or for whether it serves any particular purpose or works at all,
-;; unless he says so in writing.  Refer to the GNU Emacs General Public
-;; License for full details.
-
-;; Everyone is granted permission to copy, modify and redistribute
-;; GNU Emacs, but only under the conditions described in the
-;; GNU Emacs General Public License.   A copy of this license is
-;; supposed to have been given to you along with GNU Emacs so you
-;; can know your rights and responsibilities.  It should be in a
-;; file named COPYING.  Among other things, the copyright notice
-;; and this notice must be preserved on all copies.
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; 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, 675 Mass Ave, Cambridge, MA 02139, USA.
 
 ;;; Commentary:
 
 
 ;;; Code:
 
+(defun calendar-version ()
+  (interactive)
+  (message "Version 5.3, January 25, 1994"))
+
 ;;;###autoload
 (defvar calendar-week-start-day 0
   "*The day of the week on which a week in the calendar begins.
 
 ;;;###autoload
 (defvar view-diary-entries-initially nil
-  "*If t, the diary entries for the current date will be displayed on entry.
+  "*Non-nil means display current date's diary entries on entry.
 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'.")
@@ -123,18 +122,21 @@ This variable affects the diary display when the command M-x 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 will cause no diary entries to
-be displayed on Sunday, the current date's and the next day's diary entries
-to be displayed Monday through Thursday, Friday through Monday's entries to
-be displayed on Friday, and only Saturday's entries to be displayed 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
+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.")
 
 ;;;###autoload
 (defvar mark-diary-entries-in-calendar nil
-  "*If t, dates with diary entries will be marked 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'.")
 
 (defvar diary-entry-marker
@@ -174,49 +176,42 @@ Can be either a single-character string or a face.")
 
 ;;;###autoload
 (defvar view-calendar-holidays-initially nil
-  "*If t, holidays for current three month period will be displayed 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.")
 
 ;;;###autoload
 (defvar mark-holidays-in-calendar nil
-  "*If t, dates of holidays will be marked 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'.")
 
 ;;;###autoload
 (defvar all-hebrew-calendar-holidays nil
   "*If nil, show only major holidays from the Hebrew calendar.
+This means only those Jewish holidays that appear on secular calendars.
 
-If nil, the only holidays from the Hebrew calendar shown will be those days of
-such major interest as to appear on secular calendars.
-
-If t, the holidays shown in the calendar will include all special days that
-would be shown on a complete Hebrew calendar.")
+If t, show all the holidays that would appear in a complete Hebrew calendar.")
 
 ;;;###autoload
 (defvar all-christian-calendar-holidays nil
   "*If nil, show only major holidays from the Christian calendar.
+This means only those Christian holidays that appear on secular calendars.
 
-If nil, the only holidays from the Christian calendar shown will be those days
-of such major interest as to appear on secular calendars.
-
-If t, the holidays shown in the calendar will include all special days that
-would be shown on a complete Christian calendar.")
+If t, show all the holidays that would appear in a complete Christian
+calendar.")
 
 ;;;###autoload
 (defvar all-islamic-calendar-holidays nil
   "*If nil, show only major holidays from the Islamic calendar.
+This means only those Islamic holidays that appear on secular calendars.
 
-If nil, the only holidays from the Islamic calendar shown will be those days
-of such major interest as to appear on secular calendars.
-
-If t, the holidays shown in the calendar will include all special days that
-would be shown on a complete Islamic calendar.")
+If t, show all the holidays that would appear in a complete Islamic
+calendar.")
 
 ;;;###autoload
 (defvar calendar-load-hook nil
   "*List of functions to be called after the calendar is first loaded.
-This is the place to add key bindings to calendar-mode-map.")
+This is the place to add key bindings to `calendar-mode-map'.")
 
 ;;;###autoload
 (defvar initial-calendar-window-hook nil
@@ -231,7 +226,7 @@ and reentering it will cause these functions to be called again.")
 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)
-It can also be used to mark the current date with calendar-today-marker;
+It can also be used to mark the current date with `calendar-today-marker';
 a function is also provided for this:
     (setq today-visible-calendar-hook 'calendar-mark-today)
 
@@ -290,9 +285,10 @@ instead, if you execute `european-calendar' when in the calendar, or set
 To revert to the default American style from the European style, execute
 `american-calendar' in the calendar.
 
-A diary entry can be preceded by a diary-nonmarking-symbol (ordinarily `&')
-to make that entry nonmarking--that is, it will not be marked on dates in
-the calendar window but will appear in a diary window.
+A diary entry can be preceded by the character
+`diary-nonmarking-symbol' (ordinarily `&') to make that entry
+nonmarking--that is, it will not be marked on dates in the calendar
+window but will appear in a diary window.
 
 Multiline diary entries are made by indenting lines after the first with
 either a TAB or one or more spaces.
@@ -313,8 +309,8 @@ entries (in the default American style):
      &* 15 time cards due.
 
 If the first line of a diary entry consists only of the date or day name with
-no trailing blanks or punctuation, then that line will not be displayed in the
-diary window; only the continuation lines will be shown.  For example, the
+no trailing blanks or punctuation, then that line is not displayed in the
+diary window; only the continuation lines is shown.  For example, the
 single diary entry
 
      02/11/1989
@@ -402,7 +398,7 @@ characters with or without a period.")
     (monthname " *" day ", *" year "[^0-9]")
     (dayname "\\W"))
   "*List of pseudo-patterns describing the American patterns of date used.
-See the documentation of diary-date-forms for an explanation.")
+See the documentation of `diary-date-forms' for an explanation.")
 
 ;;;###autoload
 (defvar european-date-diary-pattern
@@ -412,7 +408,7 @@ See the documentation of diary-date-forms for an explanation.")
     (day " *" monthname " *" year "[^0-9]")
     (dayname "\\W"))
   "*List of pseudo-patterns describing the European patterns of date used.
-See the documentation of diary-date-forms for an explanation.")
+See the documentation of `diary-date-forms' for an explanation.")
 
 (defvar diary-date-forms
   (if european-calendar-style
@@ -451,7 +447,7 @@ See the documentation of calendar-date-display-form for an explanation.")
 (defvar american-calendar-display-form
   '((if dayname (concat dayname ", ")) monthname " " day ", " year)
   "*Pseudo-pattern governing the way a date appears in the American style.
-See the documentation of calendar-date-display-form for an explanation.")
+See the documentation of `calendar-date-display-form' for an explanation.")
 
 (defvar calendar-date-display-form
   (if european-calendar-style
@@ -509,7 +505,7 @@ 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
 this hook.  This function enables you to use shared diary files together
-with your own.  The files included are specified in the diary-file by lines
+with your own.  The files included are specified in the diary file by lines
 of the form
 
         #include \"filename\"
@@ -518,7 +514,7 @@ This is recursive; that is, #include directives in files thus included are
 obeyed.  You can change the \"#include\" to some other string by changing
 the variable `diary-include-string'.  When you use `include-other-diary-files'
 as part of the list-diary-entries-hook, you will probably also want to use the
-function `mark-included-diary-files' as part of the mark-diary-entries-hook.
+function `mark-included-diary-files' as part of `mark-diary-entries-hook'.
 
 For example, you could use
 
@@ -526,7 +522,7 @@ For example, you could use
        '(include-other-diary-files sort-diary-entries))
      (setq diary-display-hook 'fancy-diary-display)
 
-in your .emacs file to cause the fancy diary buffer to be displayed with
+in your `.emacs' file to cause the fancy diary buffer to be displayed with
 diary entries from various included files, each day's entries sorted into
 lexicographic order.")
 
@@ -538,7 +534,7 @@ Can be used for appointment notification.")
 ;;;###autoload
 (defvar diary-display-hook nil
   "*List of functions that handle the display of the diary.
-If nil (the default), `simple-diary-display' will be used.  Use `ignore' for no
+If nil (the default), `simple-diary-display' is used.  Use `ignore' for no
 diary display.
 
 Ordinarily, this just displays the diary buffer (with holidays indicated in
@@ -572,14 +568,14 @@ describes the style of such diary entries.")
 
 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
-with your own.  The files included are specified in the diary-file by lines
+with your own.  The files included are specified in the diary file by lines
 of the form
         #include \"filename\"
 This is recursive; that is, #include directives in files thus included are
 obeyed.  You can change the \"#include\" to some other string by changing the
 variable `diary-include-string'.  When you use `mark-included-diary-files' as
 part of the mark-diary-entries-hook, you will probably also want to use the
-function `include-other-diary-files' as part of the list-diary-entries-hook.")
+function `include-other-diary-files' as part of `list-diary-entries-hook'.")
 
 ;;;###autoload
 (defvar nongregorian-diary-marking-hook nil
@@ -597,13 +593,15 @@ are holidays.")
 
 ;;;###autoload
 (defvar holidays-in-diary-buffer t
-  "*If t, the holidays will be indicated in the diary display.
-The holidays will be given in the mode line of the diary buffer, or in the
+  "*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 will make the diary display faster.")
+somewhat; setting it to nil makes the diary display faster.")
 
 (defvar calendar-mark-ring nil)
 
+;;;###autoload
+(put 'general-holidays 'risky-local-variable t)
 ;;;###autoload
 (defvar general-holidays
   '((holiday-fixed 1 1 "New Year's Day")
@@ -626,16 +624,22 @@ somewhat; setting it to nil will make the diary display faster.")
   "*General holidays.  Default value is for the United States.
 See the documentation for `calendar-holidays' for details.")
 
+;;;###autoload
+(put 'local-holidays 'risky-local-variable t)
 ;;;###autoload
 (defvar local-holidays nil
   "*Local holidays.
 See the documentation for `calendar-holidays' for details.")
 
+;;;###autoload
+(put 'other-holidays 'risky-local-variable t)
 ;;;###autoload
 (defvar other-holidays nil
   "*User defined holidays.
 See the documentation for `calendar-holidays' for details.")
 
+;;;###autoload
+(put 'hebrew-holidays-1 'risky-local-variable t)
 ;;;###autoload
 (defvar hebrew-holidays-1
   '((holiday-rosh-hashanah-etc)
@@ -654,6 +658,8 @@ See the documentation for `calendar-holidays' for details.")
                  22
                21))) "\"Tal Umatar\" (evening)"))))
 
+;;;###autoload
+(put 'hebrew-holidays-2 'risky-local-variable t)
 ;;;###autoload
 (defvar hebrew-holidays-2
   '((if all-hebrew-calendar-holidays
@@ -674,6 +680,8 @@ See the documentation for `calendar-holidays' for details.")
     (if all-hebrew-calendar-holidays
         (holiday-hebrew 11 15 "Tu B'Shevat"))))
 
+;;;###autoload
+(put 'hebrew-holidays-3 'risky-local-variable t)
 ;;;###autoload
 (defvar hebrew-holidays-3
   '((if all-hebrew-calendar-holidays
@@ -705,6 +713,8 @@ See the documentation for `calendar-holidays' for details.")
              day))
          "Shabbat Shirah"))))
 
+;;;###autoload
+(put 'hebrew-holidays-4 'risky-local-variable t)
 ;;;###autoload
 (defvar hebrew-holidays-4
   '((holiday-passover-etc)
@@ -722,12 +732,16 @@ See the documentation for `calendar-holidays' for details.")
     (if all-hebrew-calendar-holidays
         (holiday-tisha-b-av-etc))))
 
+;;;###autoload
+(put 'hebrew-holidays 'risky-local-variable t)
 ;;;###autoload
 (defvar hebrew-holidays (append hebrew-holidays-1 hebrew-holidays-2
                                hebrew-holidays-3 hebrew-holidays-4)
   "*Jewish holidays.
 See the documentation for `calendar-holidays' for details.")
 
+;;;###autoload
+(put 'christian-holidays 'risky-local-variable t)
 ;;;###autoload
 (defvar christian-holidays
   '((if all-christian-calendar-holidays
@@ -745,6 +759,8 @@ See the documentation for `calendar-holidays' for details.")
   "*Christian holidays.
 See the documentation for `calendar-holidays' for details.")
 
+;;;###autoload
+(put 'islamic-holidays 'risky-local-variable t)
 ;;;###autoload
 (defvar islamic-holidays
   '((holiday-islamic
@@ -776,6 +792,8 @@ See the documentation for `calendar-holidays' for details.")
   "*Islamic holidays.
 See the documentation for `calendar-holidays' for details.")
 
+;;;###autoload
+(put 'solar-holidays 'risky-local-variable t)
 ;;;###autoload
 (defvar solar-holidays
   '((if (fboundp 'atan)
@@ -809,6 +827,8 @@ See the documentation for `calendar-holidays' for details.")
   "*Sun-related holidays.
 See the documentation for `calendar-holidays' for details.")
 
+;;;###autoload
+(put 'calendar-holidays 'risky-local-variable t)
 (defvar calendar-holidays
   (append general-holidays local-holidays other-holidays
           christian-holidays hebrew-holidays islamic-holidays
@@ -1166,7 +1186,7 @@ to be replaced by asterisks to highlight it whenever it is in the window."
 
 (autoload 'view-diary-entries "diary"
   "Prepare and display a buffer with diary entries.
-Searches the file diary-file for entries that match ARG days starting with
+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)
@@ -1228,15 +1248,15 @@ calendar."
   t)
 
 (autoload 'show-all-diary-entries "diary"
-  "Show all of the diary entries in the diary-file.
-This function gets rid of the selective display of the diary-file so that
+  "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
 is created."
   t)
 
 (autoload 'mark-diary-entries "diary"
   "Mark days in the calendar window that have diary entries.
-Each entry in diary-file visible in the calendar window is marked."
+Each entry in diary file visible in the calendar window is marked."
   t)
 
 (autoload 'insert-diary-entry "diary-ins"
@@ -1387,6 +1407,7 @@ characters on the line."
    ;; Put in the days of the month
    (calendar-for-loop i from 1 to last do
       (insert (format "%2d " i))
+      (put-text-property (- (point) 3) (1- (point)) 'mouse-face 'highlight)
       (and (zerop (calendar-mod (+ i blank-days) 7))
            (/= i last)
            (calendar-insert-indented "" 0 t)    ;; Force onto following line
@@ -1429,16 +1450,17 @@ the inserted text.  Value is always t."
   (if window-system (require 'cal-menu))
   (calendar-for-loop i from 0 to 9 do
        (define-key calendar-mode-map (int-to-string i) 'digit-argument))
+  ;; kill-region and copy-region-as-kill are omitted from this list
+  ;; because they cause an ugly second pane in the Edit menu.
   (let ((l (list 'narrow-to-region 'mark-word 'mark-sexp 'mark-paragraph
-                 'mark-defun 'mark-whole-buffer 'mark-page 'kill-region
-                 'copy-region-as-kill 'downcase-region 'upcase-region
+                 'mark-defun 'mark-whole-buffer 'mark-page
+                 'downcase-region 'upcase-region
                  'capitalize-region 'write-region)))
-    (while (car l)
-      (let ((k (where-is-internal (car l))))
-        (while (car k)
-          (define-key calendar-mode-map (car k) 'calendar-not-implemented)
-          (setq k (cdr k)))
-        (setq l (cdr l)))))
+   
+    (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)
@@ -1539,7 +1561,7 @@ the inserted text.  Value is always t."
   (list
    (substitute-command-keys "\\<calendar-mode-map>\\[scroll-calendar-left]")
    "Calendar"
-   (substitute-command-keys "\\<calendar-mode-map>\\[describe-calendar-mode] help/\\[calendar-other-month] other/\\[calendar-current-month] current")
+   (substitute-command-keys "\\<calendar-mode-map>\\[describe-calendar-mode] help/\\[calendar-other-month] other/\\[calendar-current-month] today")
    '(calendar-date-string (calendar-current-date) t)
    (substitute-command-keys "\\<calendar-mode-map>\\[scroll-calendar-right]"))
   "The mode line of the calendar buffer.")
@@ -1610,7 +1632,7 @@ The following commands control the diary:
        \\[view-diary-entries]  display diary entries       \\[show-all-diary-entries]  show all diary entries
        \\[print-diary-entries]  print diary entries
 
-Displaying the diary entries causes the diary entries from the diary-file
+Displaying the diary entries causes the diary entries from the diary file
 \(for the date indicated by the cursor in the calendar window) to be
 displayed in another window.  This function takes an integer argument that
 specifies the number of days of calendar entries to be displayed, starting
@@ -1624,7 +1646,7 @@ displayed, independently of the calendar.  The number of days of entries is
 governed by number-of-diary-entries.
 
 The format of the entries in the diary file is described in the
-documentation string for the variable diary-file.
+documentation string for the variable `diary-file'.
 
 When diary entries are in view in the window, they can be edited.  It is
 important to keep in mind that the buffer displayed contains the entire
@@ -1692,7 +1714,7 @@ To find the times of sunrise and sunset and lunar phases use
        \\[calendar-sunrise-sunset]  show times of sunrise and sunset
        \\[calendar-phases-of-moon]  show times of quarters of the moon
 
-The times given will be for location `calendar-location-name' at latitude
+The times given apply to location `calendar-location-name' at latitude
 `calendar-latitude', longitude `calendar-longitude'; set these variables for
 your location.  The following variables are also consulted, and you must set
 them if your system does not initialize them properly: `calendar-time-zone',
@@ -1705,27 +1727,27 @@ To exit from the calendar use
 
        \\[exit-calendar]  exit from calendar
 
-The variable `view-diary-entries-initially', whose default is nil, can be
-set to to t cause diary entries for the current date will be displayed in
+Set `view-diary-entries-initially' to a non-nil value to display 
+diary entries for the current date in
 another window when the calendar is first displayed, if the current date is
 visible.  The variable `number-of-diary-entries' controls number of days of
-diary entries that will be displayed initially or with the command M-x
-diary.  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, both the
-current day's and the next day's entries will be displayed.  The value can
-also be a vector: If the value is [0 2 2 2 2 4 1] then no diary entries
-will be displayed on Sunday, the current date's and the next day's diary
-entries will be displayed Monday through Thursday, Friday through Monday's
-entries will be displayed on Friday, while on Saturday only that day's
-entries will be displayed.
-
-The variable `view-calendar-holidays-initially' can be set to t to cause the
-holidays for the current three month period will be displayed on entry to the
-calendar.  The holidays are displayed in another window.
-
-The variable `mark-diary-entries-in-calendar' can be set to t to cause any
-dates visible with calendar entries to be marked with the symbol specified by
-the variable `diary-entry-marker'.
+diary entries that to display initially or with the command M-x
+diary.  For example, the default value 1 says to display only the current
+day's diary entries.  The value 2 says to display both the
+current day's and the next day's entries.
+
+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.
+
+Set `view-calendar-holidays-initially' to a non-nil value to display
+holidays for the current three month period on entry to the calendar.
+
+Set `mark-diary-entries-in-calendar' to a non-nil value to mark in the
+calendar all the dates that have diary entries.  The variable
+`diary-entry-marker' controls how to mark them.
 
 The variable `calendar-load-hook', whose default value is nil, is list of
 functions to be called when the calendar is first loaded.
@@ -1850,8 +1872,7 @@ concatenated and the result truncated."
 Movement is backward if ARG is negative."
   (interactive "p")
   (calendar-cursor-to-nearest-date)
-  (let* ((cursor-date (or (calendar-cursor-to-date)
-                          (error "Cursor is not on a date!")))
+  (let* ((cursor-date (calendar-cursor-to-date t))
          (month (extract-calendar-month cursor-date))
          (day (extract-calendar-day cursor-date))
          (year (extract-calendar-year cursor-date)))
@@ -1933,36 +1954,41 @@ If in the calendar buffer, also sets the current date local variables."
          (month
           (cdr (assoc 
                 (substring date (match-beginning 2) (match-end 2))
-                (calendar-make-alist
-                 calendar-month-name-array
-                 1
-                 '(lambda (x) (substring x 0 3))))))
+                '(("Jan" . 1) ("Feb" . 2) ("Mar" . 3) ("Apr" . 4)
+                  ("May" . 5) ("Jun" . 6) ("Jul" . 7) ("Aug" . 8)
+                  ("Sep" . 9) ("Oct" . 10) ("Nov" . 11) ("Dec" . 12)))))
          (day
           (string-to-int (substring date (match-beginning 3) (match-end 3))))
          (year
           (string-to-int (substring date (match-beginning 4) (match-end 4)))))
     (list month day year)))
 
-(defun calendar-cursor-to-date ()
+(defun calendar-cursor-to-date (&optional error)
   "Returns a list of the month, day, and year of current cursor position.
-Returns nil if the cursor is not on a specific day."
-  (if (and (looking-at "[*0-9]")
-           (< 2 (count-lines (point-min) (point))))
-      (save-excursion
-        (re-search-backward "[^0-9]")
-        (forward-char 1)
-        (let*
-            ((day (string-to-int (buffer-substring (point) (+ 3 (point)))))
-             (day (if (= 0 day) starred-day day))
-             (segment (/ (current-column) 25))
-             (month (% (+ displayed-month segment -1) 12))
-             (month (if (= 0 month) 12 month))
-             (year
-              (cond
-               ((and (=  12 month) (= segment 0)) (1- displayed-year))
-               ((and (=   1 month) (= segment 2)) (1+ displayed-year))
-               (t displayed-year))))
-          (list month day year)))))
+If cursor is not on a specific date, signals an error if optional parameter
+ERROR is t, otherwise just returns nil."
+  (let* ((segment (/ (current-column) 25))
+         (month (% (+ displayed-month segment -1) 12))
+         (month (if (= 0 month) 12 month))
+         (year
+          (cond
+           ((and (=  12 month) (= segment 0)) (1- displayed-year))
+           ((and (=   1 month) (= segment 2)) (1+ displayed-year))
+           (t displayed-year))))
+    (if (and (looking-at "[0-9]")
+             (< 2 (count-lines (point-min) (point))))
+        (save-excursion
+          (re-search-backward "[^0-9]")
+          (list month
+                (string-to-int (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 error (error "Not on a date!"))))))
 
 (defun calendar-cursor-to-nearest-date ()
   "Move the cursor to the closest date.
@@ -2233,8 +2259,7 @@ Gregorian date Sunday, December 31, 1 BC."
 With no prefix argument, push current date onto marked date ring.
 With argument, jump to mark, pop it, and put point at end of ring."
   (interactive "P")
-  (let ((date (or (calendar-cursor-to-date)
-                  (error "Cursor is not on a date!"))))
+  (let ((date (calendar-cursor-to-date t)))
     (if (null arg)
         (progn
           (setq calendar-mark-ring (cons date calendar-mark-ring))
@@ -2254,8 +2279,7 @@ With argument, jump to mark, pop it, and put point at end of ring."
   "Exchange the current cursor position with the marked date."
   (interactive)
   (let ((mark (car calendar-mark-ring))
-        (date (or (calendar-cursor-to-date)
-                  (error "Cursor is not on a date!"))))
+        (date (calendar-cursor-to-date t)))
     (if (null mark)
         (error "No mark set in this buffer")
       (setq calendar-mark-ring (cons date (cdr calendar-mark-ring)))
@@ -2265,8 +2289,7 @@ With argument, jump to mark, pop it, and put point at end of ring."
   "Count the number of days (inclusive) between point and the mark."
   (interactive)
   (let* ((days (- (calendar-absolute-from-gregorian
-                   (or (calendar-cursor-to-date)
-                       (error "Cursor is not on a date!")))
+                   (calendar-cursor-to-date t))
                   (calendar-absolute-from-gregorian
                    (or (car calendar-mark-ring)
                        (error "No mark set in this buffer")))))
@@ -2552,9 +2575,9 @@ MARK defaults to diary-entry-marker."
 This function can be used with the today-visible-calendar-hook run after the
 calendar window has been prepared."
   (let ((buffer-read-only nil))
-    (make-variable-buffer-local 'starred-day)
+    (make-variable-buffer-local 'calendar-starred-day)
     (forward-char 1)
-    (setq starred-day
+    (setq calendar-starred-day
           (string-to-int
            (buffer-substring (point) (- (point) 2))))
     (delete-char -2)
@@ -2653,9 +2676,7 @@ Defaults to today's date if DATE is not given."
 (defun calendar-print-day-of-year ()
   "Show day number in year/days remaining in year for date under the cursor."
   (interactive)
-  (message (calendar-day-of-year-string
-            (or (calendar-cursor-to-date)
-                (error "Cursor is not on a date!")))))
+  (message (calendar-day-of-year-string (calendar-cursor-to-date t))))
 
 (defun calendar-absolute-from-iso (date)
   "The number of days elapsed between the Gregorian date 12/31/1 BC and DATE.
@@ -2700,7 +2721,7 @@ Defaults to today's date if DATE is not given."
              (or date (calendar-current-date))))
          (day (% d 7))
          (iso-date (calendar-iso-from-absolute d)))
-    (format "Day %s of week %d of %d."
+    (format "Day %s of week %d of %d"
             (if (zerop day) 7 day)
             (extract-calendar-month iso-date)
             (extract-calendar-year iso-date))))
@@ -2709,9 +2730,7 @@ Defaults to today's date if DATE is not given."
   "Show equivalent ISO date for the date under the cursor."
   (interactive)
   (message "ISO date: %s"
-           (calendar-iso-date-string
-            (or (calendar-cursor-to-date)
-                (error "Cursor is not on a date!")))))
+           (calendar-iso-date-string (calendar-cursor-to-date t))))
 
 (defun calendar-julian-from-absolute (date)
   "Compute the Julian (month day year) corresponding to the absolute DATE.
@@ -2767,9 +2786,7 @@ Driven by the variable `calendar-date-display-form'."
   "Show the Julian calendar equivalent of the date under the cursor."
   (interactive)
   (message "Julian date: %s"
-           (calendar-julian-date-string
-            (or (calendar-cursor-to-date)
-                (error "Cursor is not on a date!")))))
+           (calendar-julian-date-string (calendar-cursor-to-date t))))
 
 (defun islamic-calendar-leap-year-p (year)
   "Returns t if YEAR is a leap year on the Islamic calendar."
@@ -2857,9 +2874,7 @@ Driven by the variable `calendar-date-display-form'."
 (defun calendar-print-islamic-date ()
   "Show the Islamic calendar equivalent of the date under the cursor."
   (interactive)
-  (let ((i (calendar-islamic-date-string
-            (or (calendar-cursor-to-date)
-                (error "Cursor is not on a date!")))))
+  (let ((i (calendar-islamic-date-string (calendar-cursor-to-date t))))
     (if (string-equal i "")
         (message "Date is pre-Islamic")
       (message "Islamic date (until sunset): %s" i))))
@@ -3002,9 +3017,7 @@ Driven by the variable `calendar-date-display-form'."
   "Show the Hebrew calendar equivalent of the date under the cursor."
   (interactive)
   (message "Hebrew date (until sunset): %s"
-           (calendar-hebrew-date-string
-            (or (calendar-cursor-to-date)
-                (error "Cursor is not on a date!")))))
+           (calendar-hebrew-date-string (calendar-cursor-to-date t))))
 
 (defun hebrew-calendar-yahrzeit (death-date year)
   "Absolute date of the anniversary of Hebrew DEATH-DATE in Hebrew YEAR."
@@ -3130,9 +3143,7 @@ Defaults to today's date if DATE is not given."
   (interactive)
   (message
    "Astronomical (Julian) day number after noon UTC: %s"
-   (calendar-astro-date-string
-    (or (calendar-cursor-to-date)
-        (error "Cursor is not on a date!")))))
+   (calendar-astro-date-string (calendar-cursor-to-date t))))
 
 (defun calendar-goto-astro-day-number (daynumber &optional noecho)
   "Move cursor to astronomical (Julian) DAYNUMBER.