Mercurial > emacs
changeset 96296:e8b908e44add
(calendar-cursor-to-nearest-date): Use calendar-column-to-segment,
calendar-month-edges, and the 'date property to handle intermonth text.
author | Glenn Morris <rgm@gnu.org> |
---|---|
date | Thu, 26 Jun 2008 03:41:38 +0000 |
parents | f007f1675fd7 |
children | 7653ed8392c5 |
files | lisp/calendar/cal-move.el |
diffstat | 1 files changed, 26 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/calendar/cal-move.el Thu Jun 26 03:41:20 2008 +0000 +++ b/lisp/calendar/cal-move.el Thu Jun 26 03:41:38 2008 +0000 @@ -32,28 +32,39 @@ ;; FIXME should calendar just require this? (require 'calendar) + +;; Note that this is not really the "closest" date. +;; In most cases, it just searches forwards for the next day. ;;;###cal-autoload (defun calendar-cursor-to-nearest-date () "Move the cursor to the closest date. The position of the cursor is unchanged if it is already on a date. Returns the list (month day year) giving the cursor position." (or (calendar-cursor-to-date) - (let ((column (current-column))) - (when (> calendar-first-date-row (count-lines (point-min) (point))) + (let* ((col (current-column)) + (edges (cdr (assoc (calendar-column-to-segment) + calendar-month-edges))) + (last (nth 2 edges)) + (right (nth 3 edges))) + (when (< (count-lines (point-min) (point)) calendar-first-date-row) (goto-line calendar-first-date-row) - (move-to-column column)) - ;; FIXME the date positions are fixed and computable, - ;; but searching is probably more flexible. - ;; Note also that this may not be the "nearest" date. - ;; Eg with cursor just after end of month, can skip to next month. - (or (looking-at "[0-9]") - ;; We search forwards for a number, except close to the RH - ;; margin of a month, where we search backwards. - (if (or (looking-at " *$") - (< (calendar-column-to-month) 0)) - (re-search-backward "[0-9]" nil t) - (re-search-forward "[0-9]" nil t) - (backward-char 1))) + (move-to-column col)) + ;; The date positions are fixed and computable, but searching + ;; is probably more flexible. Need to consider blank days at + ;; start and end of month if computing positions. + ;; 'date text-property is used to exclude intermonth text. + (unless (and (looking-at "[0-9]") + (get-text-property (point) 'date)) + ;; We search forwards for a number, except close to the RH + ;; margin of a month, where we search backwards. + ;; Note that the searches can go to other lines. + (if (or (looking-at " *$") + (and (> col last) (< col right))) + (while (and (re-search-backward "[0-9]" nil t) + (not (get-text-property (point) 'date)))) + (while (and (re-search-forward "[0-9]" nil t) + (not (get-text-property (1- (point)) 'date)))) + (backward-char 1))) (calendar-cursor-to-date)))) (defvar displayed-month) ; from calendar-generate