# HG changeset patch # User Glenn Morris # Date 1207017989 0 # Node ID 2fe1b51b87716c96c2d15692a81307ce8b978e35 # Parent 15b2492faf631b517ad8cff115d78685542f11ad (calendar-mode-map): Use calendar-mark-holidays rather than obsolete alias. (mark-visible-calendar-date): Also use overlay for mark characters. (calendar-unmark): Unmark by removing all overlays, rather than redrawing. (calendar-starred-day): Remove. (calendar-mode): Disable undo. Don't make calendar-starred-day local. (calendar-cursor-to-date): No need for special star handling now using overlays. (calendar-star-date): Use overlays. diff -r 15b2492faf63 -r 2fe1b51b8771 lisp/calendar/calendar.el --- a/lisp/calendar/calendar.el Tue Apr 01 02:45:47 2008 +0000 +++ b/lisp/calendar/calendar.el Tue Apr 01 02:46:29 2008 +0000 @@ -48,32 +48,35 @@ ;; Islamic calendar, to the Baha'i calendar, to the French ;; Revolutionary calendar, to the Mayan calendar, to the Chinese ;; calendar, to the Coptic calendar, to the Ethiopic calendar, and to -;; the astronomical (Julian) day number. When floating point is -;; available, times of sunrise/sunset can be displayed, as can the -;; phases of the moon. Appointment notification for diary entries is -;; available. Calendar printing via LaTeX is available. +;; the astronomical (Julian) day number. Times of sunrise/sunset can +;; be displayed, as can the phases of the moon. Appointment +;; notification for diary entries is available. Calendar printing via +;; LaTeX is available. ;; The following files are part of the calendar/diary code: -;; appt.el Appointment notification -;; cal-china.el Chinese calendar -;; cal-coptic.el Coptic/Ethiopic calendars -;; cal-dst.el Daylight saving time rules -;; cal-hebrew.el Hebrew calendar -;; cal-islam.el Islamic calendar -;; cal-bahai.el Baha'i calendar -;; cal-iso.el ISO calendar -;; cal-julian.el Julian/astronomical calendars -;; cal-mayan.el Mayan calendars -;; cal-menu.el Menu support -;; cal-move.el Movement in the calendar -;; cal-persia.el Persian calendar -;; cal-tex.el Calendars in LaTeX -;; cal-x.el X-windows dedicated frame functions -;; diary-lib.el Diary functions -;; holidays.el Holiday functions -;; lunar.el Phases of the moon -;; solar.el Sunrise/sunset, equinoxes/solstices +;; appt.el Appointment notification +;; cal-bahai.el Baha'i calendar +;; cal-china.el Chinese calendar +;; cal-coptic.el Coptic/Ethiopic calendars +;; cal-dst.el Daylight saving time rules +;; cal-french.el French revolutionary calendar +;; cal-hebrew.el Hebrew calendar +;; cal-html.el Calendars in HTML +;; cal-islam.el Islamic calendar +;; cal-iso.el ISO calendar +;; cal-julian.el Julian/astronomical calendars +;; cal-mayan.el Mayan calendars +;; cal-menu.el Menu support +;; cal-move.el Movement in the calendar +;; cal-persia.el Persian calendar +;; cal-tex.el Calendars in LaTeX +;; cal-x.el Dedicated frame functions +;; calendar.el This file +;; diary-lib.el Diary functions +;; holidays.el Holiday functions +;; lunar.el Phases of the moon +;; solar.el Sunrise/sunset, equinoxes/solstices ;; Technical details of all the calendrical calculations can be found in ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold @@ -1666,7 +1669,7 @@ (define-key map "q" 'exit-calendar) (define-key map "a" 'calendar-list-holidays) (define-key map "h" 'calendar-cursor-holidays) - (define-key map "x" 'mark-calendar-holidays) + (define-key map "x" 'calendar-mark-holidays) (define-key map "u" 'calendar-unmark) (define-key map "m" 'mark-diary-entries) (define-key map "d" 'diary-view-entries) @@ -1837,9 +1840,6 @@ (defvar calendar-mark-ring nil "Used by `calendar-set-mark'.") -(defvar calendar-starred-day nil - "Stores the value of the last date that `calendar-star-date' replaced.") - (defun calendar-mode () "A major mode for the calendar window. @@ -1851,11 +1851,11 @@ (setq major-mode 'calendar-mode mode-name "Calendar" buffer-read-only t + buffer-undo-list t indent-tabs-mode nil) (use-local-map calendar-mode-map) (update-calendar-mode-line) (make-local-variable 'calendar-mark-ring) - (make-local-variable 'calendar-starred-day) (make-local-variable 'displayed-month) ; month in middle of window (make-local-variable 'displayed-year) ; year in middle of window ;; Most functions only work if displayed-month and displayed-year are set, @@ -1984,12 +1984,7 @@ (list month (string-to-number (buffer-substring (1+ (point)) (+ 4 (point)))) year)) - (if (and (looking-at "\\*") - (save-excursion - (re-search-backward "[^*]") - (looking-at ".\\*\\*"))) - (list month calendar-starred-day year) - (if error (error "Not on a date!")))))) + (if error (error "Not on a date!"))))) (add-to-list 'debug-ignored-errors "Not on a date!") @@ -2316,7 +2311,8 @@ (interactive) (setq mark-holidays-in-calendar nil mark-diary-entries-in-calendar nil) - (redraw-calendar)) + (with-current-buffer calendar-buffer + (mapc 'delete-overlay (overlays-in (point-min) (point-max))))) (defun calendar-date-is-visible-p (date) "Return non-nil if DATE is valid and is visible in the calendar window." @@ -2370,14 +2366,10 @@ ((facep mark) (overlay-put (make-overlay (1- (point)) (1+ (point))) 'face mark)) - ;; Single-character. + ;; Single-character mark, goes after the date. ((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))) + (overlay-put + (make-overlay (1+ (point)) (+ 2 (point))) 'display mark)) (t ; attr list (let ((temp-face (make-symbol @@ -2392,6 +2384,7 @@ (make-face temp-face) ;; Remove :face info from mark, copy the face info into temp-face. (while (setq faceinfo (memq :face faceinfo)) + ;; FIXME not read. (copy-face (read (nth 1 faceinfo)) temp-face) (setcar faceinfo nil) (setcar (cdr faceinfo) nil)) @@ -2404,17 +2397,19 @@ (defun calendar-star-date () "Replace the date under the cursor in the calendar window with asterisks. You might want to add this function to `today-visible-calendar-hook'." - (let ((inhibit-read-only t) - (modified (buffer-modified-p))) - (forward-char 1) - (setq calendar-starred-day - (string-to-number (buffer-substring (point) (- (point) 2)))) - ;; Insert before deleting, to better preserve markers. - (insert "**") - (forward-char -2) - (delete-char -2) - (forward-char 1) - (restore-buffer-modified-p modified))) + (unless (catch 'found + (dolist (ol (overlays-at (point))) + (and (overlay-get ol 'calendar-star) + (throw 'found t)))) + (let ((ol (make-overlay (1- (point)) (point)))) + (overlay-put ol 'display "*") + (overlay-put ol 'calendar-star t) + ;; Use copy-sequence to avoid merging of identical 'display props. + ;; Use two overlays so as not to mess up + ;; calendar-cursor-to-nearest-date (and calendar-forward-day). + (overlay-put (setq ol (make-overlay (point) (1+ (point)))) + 'display (copy-sequence "*")) + (overlay-put ol 'calendar-star t)))) (defun calendar-mark-today () "Mark the date under the cursor in the calendar window.