changeset 92969:bb4fc128d00d

(european-calendar-style, calendar-for-loop) (calendar-sum, calendar-insert-indented, mouse-calendar-other-month) (calendar-cursor-to-date): Doc fix. (hebrew-holidays-1, hebrew-holidays-4): Simplify. (extract-calendar-day, extract-calendar-year): Use cadr, nth. (calendar-day-number): Use when. (generate-calendar-month): Use dotimes. (exit-calendar, calendar-print-other-dates): Use let rather than let*. (calendar-set-mark): Reverse conditional. (calendar-make-alist): Move definition before use.
author Glenn Morris <rgm@gnu.org>
date Sat, 15 Mar 2008 03:00:17 +0000
parents e2f0046a8cb4
children 9bc37937216f
files lisp/calendar/calendar.el
diffstat 1 files changed, 125 insertions(+), 115 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/calendar/calendar.el	Sat Mar 15 02:59:34 2008 +0000
+++ b/lisp/calendar/calendar.el	Sat Mar 15 03:00:17 2008 +0000
@@ -91,6 +91,24 @@
 ;; reingold@cs.uiuc.edu with the SUBJECT "send-paper-cal" (no quotes) and
 ;; the message BODY containing your mailing address (snail).
 
+
+;; A note on free variables:
+
+;; The calendar passes around a few dynamically bound variables, which
+;; unfortunately have rather common names.  They are meant to be
+;; available for external functions, so the names can't be changed.
+
+;; displayed-month, displayed-year: bound in generate-calendar, the
+;;   central month of the 3 month calendar window
+;; original-date, number: bound in diary-list-entries, the arguments
+;;   with which that function was called.
+;; date, entry: bound in list-sexp-diary-entries (qv)
+
+;; Bound in diary-list-entries:
+;; diary-entries-list: use in d-l, appt.el, and by add-to-diary-list
+;; diary-saved-point: only used in diary-lib.el, passed to the display func
+;; date-string: only used in diary-lib.el FIXME could be removed?
+
 ;;; Code:
 
 ;; (elisp) Eval During Compile: "Effectively `require' is
@@ -457,9 +475,9 @@
 ;;;###autoload
 (defcustom european-calendar-style nil
   "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
+If this variable is non-nil, a date 1/2/1990 would be interpreted as
+February 1, 1990.  The default European date styles (see
+`european-date-diary-pattern') are
 
             DAY/MONTH
             DAY/MONTH/YEAR
@@ -746,17 +764,16 @@
     (if all-hebrew-calendar-holidays
         (holiday-julian
          11
-         (let* ((m displayed-month)
-                (y displayed-year)
-                (year))
+         (let ((m displayed-month)
+               (y displayed-year)
+               year)
            (increment-calendar-month m y -1)
-           (let ((year (extract-calendar-year
-                        (calendar-julian-from-absolute
-                         (calendar-absolute-from-gregorian
-                          (list m 1 y))))))
-             (if (zerop (% (1+ year) 4))
-                 22
-               21))) "\"Tal Umatar\" (evening)")))
+           (setq year (extract-calendar-year
+                       (calendar-julian-from-absolute
+                        (calendar-absolute-from-gregorian (list m 1 y)))))
+           (if (zerop (% (1+ year) 4))
+               22
+             21)) "\"Tal Umatar\" (evening)")))
   "Component of the default value of `hebrew-holidays'.")
 ;;;###autoload
 (put 'hebrew-holidays-1 'risky-local-variable t)
@@ -773,9 +790,8 @@
                       (calendar-hebrew-from-absolute
                        (calendar-absolute-from-gregorian
                         (list displayed-month 28 displayed-year))))))
-         (if (= (% (calendar-absolute-from-hebrew (list 10 10 h-year))
-                   7)
-                6)
+         (if (= 6 (% (calendar-absolute-from-hebrew (list 10 10 h-year))
+                     7))
              11 10))
        "Tzom Teveth"))
     (if all-hebrew-calendar-holidays
@@ -800,11 +816,10 @@
                                    y)))))
                   (s-s
                    (calendar-hebrew-from-absolute
-                    (if (=
-                         (% (calendar-absolute-from-hebrew
-                             (list 7 1 h-year))
-                            7)
-                         6)
+                    (if (= 6
+                           (% (calendar-absolute-from-hebrew
+                               (list 7 1 h-year))
+                              7))
                         (calendar-dayname-on-or-before
                          6 (calendar-absolute-from-hebrew
                             (list 11 17 h-year)))
@@ -822,15 +837,15 @@
 (defvar hebrew-holidays-4
   '((holiday-passover-etc)
     (if (and all-hebrew-calendar-holidays
-             (let* ((m displayed-month)
-                    (y displayed-year)
-                    (year))
+             (let ((m displayed-month)
+                   (y displayed-year)
+                   year)
                (increment-calendar-month m y -1)
-               (let ((year (extract-calendar-year
-                            (calendar-julian-from-absolute
-                             (calendar-absolute-from-gregorian
-                              (list m 1 y))))))
-                 (= 21 (% year 28)))))
+               (setq year (extract-calendar-year
+                           (calendar-julian-from-absolute
+                            (calendar-absolute-from-gregorian
+                             (list m 1 y)))))
+               (= 21 (% year 28))))
         (holiday-julian 3 26 "Kiddush HaHamah"))
     (if all-hebrew-calendar-holidays
         (holiday-tisha-b-av-etc)))
@@ -1191,20 +1206,20 @@
 (defmacro calendar-for-loop (var from init to final do &rest body)
   "Execute a for loop.
 Evaluate BODY with VAR bound to successive integers from INIT to FINAL,
-inclusive."
+inclusive.  The standard macro `dotimes' is preferable in most cases."
   (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."
+  "For INDEX = INITIAL, +1, ... (as long as CONDITION holds), sum EXPRESSION."
   (declare (debug (symbolp form form form)))
   `(let ((,index ,initial)
          (sum 0))
     (while ,condition
-      (setq sum (+ sum ,expression))
-      (setq ,index (1+ ,index)))
+      (setq sum (+ sum ,expression)
+            ,index (1+ ,index)))
     sum))
 
 ;; The following are in-line for speed; they can be called thousands of times
@@ -1242,11 +1257,11 @@
 ;; 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)))
+  (cadr date))
 
 (defsubst extract-calendar-year (date)
   "Extract the year part of DATE which has the form (month day year)."
-  (car (cdr (cdr date))))
+  (nth 2 date))
 
 (defsubst calendar-leap-year-p (year)
   "Return t if YEAR is a Gregorian leap year.
@@ -1279,16 +1294,15 @@
   "Return the day number within the year of the date DATE.
 For example, (calendar-day-number '(1 1 1987)) returns the value 1,
 while (calendar-day-number '(12 31 1980)) returns 366."
-    (let* ((month (extract-calendar-month date))
-           (day (extract-calendar-day date))
-           (year (extract-calendar-year date))
+  (let* ((month (extract-calendar-month date))
+         (day (extract-calendar-day date))
+         (year (extract-calendar-year date))
          (day-of-year (+ day (* 31 (1- month)))))
-      (if (> month 2)
-          (progn
-            (setq day-of-year (- day-of-year (/ (+ 23 (* 4 month)) 10)))
-            (if (calendar-leap-year-p year)
-                (setq day-of-year (1+ day-of-year)))))
-      day-of-year))
+    (when (> month 2)
+      (setq day-of-year (- day-of-year (/ (+ 23 (* 4 month)) 10)))
+      (if (calendar-leap-year-p year)
+          (setq day-of-year (1+ day-of-year))))
+    day-of-year))
 
 (defsubst calendar-absolute-from-gregorian (date)
   "The number of days elapsed between the Gregorian date 12/31/1 BC and DATE.
@@ -1378,8 +1392,7 @@
   (calendar-mode)
   (let* ((pop-up-windows t)
          (split-height-threshold 1000)
-         (date (if arg
-                   (calendar-read-date t)
+         (date (if arg (calendar-read-date t)
                  (calendar-current-date)))
          (month (extract-calendar-month date))
          (year (extract-calendar-year date)))
@@ -1465,11 +1478,11 @@
 located, but indented INDENT spaces.  The indentation is done from the first
 character on the line and does not disturb the first INDENT characters on the
 line."
-  (let* ((blank-days                    ; at start of month
-          (mod
-           (- (calendar-day-of-week (list month 1 year))
-              calendar-week-start-day)
-           7))
+  (let ((blank-days                     ; at start of month
+         (mod
+          (- (calendar-day-of-week (list month 1 year))
+             calendar-week-start-day)
+          7))
          (last (calendar-last-day-of-month month year)))
    (goto-char (point-min))
    (calendar-insert-indented
@@ -1491,22 +1504,22 @@
    ;; Add blank days before the first of the month.
    (dotimes (idummy blank-days) (insert "   "))
    ;; Put in the days of the month.
-   (calendar-for-loop i from 1 to last do
-      (insert (format "%2d " i))
-      (add-text-properties
-       (- (point) 3) (1- (point))
-       '(mouse-face highlight
-         help-echo "mouse-2: menu of operations for this date"))
-      (and (zerop (mod (+ i blank-days) 7))
-           (/= i last)
-           (calendar-insert-indented "" 0 t) ; force onto following line
-           (calendar-insert-indented "" indent))))) ; go to proper spot
+   (dotimes (i last)
+     (insert (format "%2d " (1+ i)))
+     (add-text-properties
+      (- (point) 3) (1- (point))
+      '(mouse-face highlight
+                   help-echo "mouse-2: menu of operations for this date"))
+     (and (zerop (mod (+ i 1 blank-days) 7))
+          (/= i (1- last))
+          (calendar-insert-indented "" 0 t) ; force onto following line
+          (calendar-insert-indented "" indent))))) ; go to proper spot
 
 (defun calendar-insert-indented (string indent &optional newline)
   "Insert STRING at column INDENT.
-If the optional parameter NEWLINE is t, leave point at start of next line,
-inserting a newline if there was no next line; otherwise, leave point after
-the inserted text.  Returns t."
+If the optional parameter NEWLINE is non-nil, leave point at start of next
+line, inserting a newline if there was no next line; otherwise, leave point
+after the inserted text.  Returns t."
   ;; Try to move to that column.
   (move-to-column indent)
   ;; If line is too short, indent out to that column.
@@ -1758,7 +1771,8 @@
   :group 'calendar)
 
 (defun mouse-calendar-other-month (event)
-  "Display a three-month calendar centered around a specified month and year."
+  "Display a three-month calendar centered around a specified month and year.
+EVENT is the last mouse event."
   (interactive "e")
   (save-selected-window
     (select-window (posn-window (event-start event)))
@@ -1864,7 +1878,7 @@
 (defun exit-calendar ()
   "Get out of the calendar window and hide it and related buffers."
   (interactive)
-  (let* ((diary-buffer (get-file-buffer diary-file)))
+  (let ((diary-buffer (get-file-buffer diary-file)))
     (if (or (not diary-buffer)
             (not (buffer-modified-p diary-buffer))
             (yes-or-no-p
@@ -1902,7 +1916,7 @@
 (defun calendar-cursor-to-date (&optional error)
   "Return a list (month day year) of current cursor position.
 If cursor is not on a specific date, signals an error if optional parameter
-ERROR is t, otherwise just returns nil."
+ERROR is non-nil, otherwise just returns nil."
   (let* ((segment (/ (current-column) 25))
          (month (% (+ displayed-month segment -1) 12))
          (month (if (zerop month) 12 month))
@@ -2002,20 +2016,19 @@
 With argument ARG, jump to mark, pop it, and put point at end of ring."
   (interactive "P")
   (let ((date (calendar-cursor-to-date t)))
-    (if (null arg)
-        (progn
-          (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.
-          (if (> (length calendar-mark-ring) (1+ mark-ring-max))
-              (setcdr (nthcdr mark-ring-max calendar-mark-ring) nil))
-          (message "Mark set"))
-      (if (null calendar-mark-ring)
-          (error "No mark set in this buffer")
-        (calendar-goto-date (car calendar-mark-ring))
-        (setq calendar-mark-ring
-              (cdr (nconc calendar-mark-ring (list date))))))))
+    (if arg
+        (if (null calendar-mark-ring)
+            (error "No mark set in this buffer")
+          (calendar-goto-date (car calendar-mark-ring))
+          (setq calendar-mark-ring
+                (cdr (nconc calendar-mark-ring (list date)))))
+      (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.
+      (if (> (length calendar-mark-ring) (1+ mark-ring-max))
+          (setcdr (nthcdr mark-ring-max calendar-mark-ring) nil))
+      (message "Mark set"))))
 
 (defun calendar-exchange-point-and-mark ()
   "Exchange the current cursor position with the marked date."
@@ -2096,6 +2109,34 @@
 constructed as the first `calendar-abbrev-length' characters of the
 corresponding full name.")
 
+(defun calendar-make-alist (sequence &optional start-index filter abbrevs)
+  "Make an assoc list corresponding to SEQUENCE.
+Each element of sequence will be associated with an integer, starting
+from 1, or from START-INDEX if that is non-nil.  If a sequence ABBREVS
+is supplied, the function `calendar-abbrev-construct' is used to
+construct abbreviations corresponding to the elements in SEQUENCE.
+Each abbreviation is entered into the alist with the same
+association index as the full name it represents.
+If FILTER is provided, apply it to each key in the alist."
+  (let ((index 0)
+        (offset (or start-index 1))
+        (aseq (if abbrevs (calendar-abbrev-construct abbrevs sequence)))
+        (aseqp (if abbrevs (calendar-abbrev-construct abbrevs sequence
+                                                      'period)))
+        alist elem)
+    (dotimes (i (length sequence) (reverse alist))
+      (setq index (+ i offset)
+            elem (elt sequence i)
+            alist
+            (cons (cons (if filter (funcall filter elem) elem) index) alist))
+      (if aseq
+          (setq elem (elt aseq i)
+                alist (cons (cons (if filter (funcall filter elem) elem)
+                                  index) alist)))
+      (if aseqp
+          (setq elem (elt aseqp i)
+                alist (cons (cons (if filter (funcall filter elem) elem)
+                                  index) alist))))))
 
 (defun calendar-read-date (&optional noday)
   "Prompt for Gregorian date.  Return a list (month day year).
@@ -2180,35 +2221,6 @@
           calendar-day-name-array)
         (if absolute date (calendar-day-of-week date))))
 
-(defun calendar-make-alist (sequence &optional start-index filter abbrevs)
-  "Make an assoc list corresponding to SEQUENCE.
-Each element of sequence will be associated with an integer, starting
-from 1, or from START-INDEX if that is non-nil.  If a sequence ABBREVS
-is supplied, the function `calendar-abbrev-construct' is used to
-construct abbreviations corresponding to the elements in SEQUENCE.
-Each abbreviation is entered into the alist with the same
-association index as the full name it represents.
-If FILTER is provided, apply it to each key in the alist."
-  (let ((index 0)
-        (offset (or start-index 1))
-        (aseq (if abbrevs (calendar-abbrev-construct abbrevs sequence)))
-        (aseqp (if abbrevs (calendar-abbrev-construct abbrevs sequence
-                                                      'period)))
-        alist elem)
-    (dotimes (i (length sequence) (reverse alist))
-      (setq index (+ i offset)
-            elem (elt sequence i)
-            alist
-            (cons (cons (if filter (funcall filter elem) elem) index) alist))
-      (if aseq
-          (setq elem (elt aseq i)
-                alist (cons (cons (if filter (funcall filter elem) elem)
-                                  index) alist)))
-      (if aseqp
-          (setq elem (elt aseqp i)
-                alist (cons (cons (if filter (funcall filter elem) elem)
-                                  index) alist))))))
-
 (defun calendar-month-name (month &optional abbrev)
   "Return a string with the name of month number MONTH.
 Months are numbered from one.  Month names are taken from the
@@ -2354,9 +2366,7 @@
 `calendar-month-abbrev-array' and `calendar-day-abbrev-array',
 respectively.  An optional parameter NODAYNAME, when t, omits the
 name of the day of the week."
-  (let* ((dayname
-          (unless nodayname
-            (calendar-day-name date abbreviate)))
+  (let* ((dayname (unless nodayname (calendar-day-name date abbreviate)))
          (month (extract-calendar-month date))
          (monthname (calendar-month-name month abbreviate))
          (day (int-to-string (extract-calendar-day date)))
@@ -2418,7 +2428,7 @@
 (defun calendar-print-other-dates ()
   "Show dates on other calendars for date under the cursor."
   (interactive)
-  (let* ((date (calendar-cursor-to-date t)))
+  (let ((date (calendar-cursor-to-date t)))
     (with-current-buffer (get-buffer-create other-calendars-buffer)
       (let ((inhibit-read-only t)
             (modified (buffer-modified-p)))
@@ -2473,7 +2483,7 @@
   "Set mode line to STR, centered, surrounded by dashes."
   (let* ((edges (window-edges))
          ;; As per doc of window-width, total visible mode-line length.
-         (width (- (nth 2 edges) (nth 0 edges))))
+         (width (- (nth 2 edges) (car edges))))
     (setq mode-line-format
           (if buffer-file-name
               `("-" mode-line-modified