diff options
author | Chong Yidong <cyd@stupidchicken.com> | 2007-04-01 17:10:11 +0000 |
---|---|---|
committer | Chong Yidong <cyd@stupidchicken.com> | 2007-04-01 17:10:11 +0000 |
commit | 1106c41b1c730d937e7c5ad02b7fea0619b2fdc6 (patch) | |
tree | 2fd23f9c299c1a29af05c47675b000e6ce90a9b0 /lisp/button.el | |
parent | 574b081eca943cd8b4d82881808da4fdaaa2cc65 (diff) | |
download | emacs-1106c41b1c730d937e7c5ad02b7fea0619b2fdc6.tar.gz |
(previous-button): Rewrite to account for adjacent buttons.
Diffstat (limited to 'lisp/button.el')
-rw-r--r-- | lisp/button.el | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/lisp/button.el b/lisp/button.el index 05ea7aec5e2..9110b7867a1 100644 --- a/lisp/button.el +++ b/lisp/button.el @@ -366,16 +366,29 @@ instead of starting at the next button." (next-button pos)))) (defun previous-button (pos &optional count-current) - "Return the Nth button before position POS in the current buffer. + "Return the previous button before position POS in the current buffer. If COUNT-CURRENT is non-nil, count any button at POS in the search, instead of starting at the next button." - (unless count-current - (setq pos (previous-single-char-property-change pos 'button))) - (and (> pos (point-min)) - (or (button-at (1- pos)) - ;; We must have originally been on a button, and are now in - ;; the inter-button space. Recurse to find a button. - (previous-button pos)))) + (let ((button (button-at pos))) + (if button + (if count-current + button + ;; We started out on a button, so move to its start and look + ;; for the previous button boundary. + (setq pos (previous-single-char-property-change + (button-start button) 'button)) + (let ((new-button (button-at pos))) + (if new-button + ;; We are in a button again; this can happen if there + ;; are adjacent buttons (or at bob). + (unless (eq new-button button) new-button) + ;; We are now in the space between buttons. + (previous-button pos)))) + ;; We started out in the space between buttons. + (setq pos (previous-single-char-property-change pos 'button)) + (or (button-at pos) + (and (> pos (point-min)) + (button-at (1- pos))))))) ;; User commands |