From e276a14ac53a1f5b9bb8ebb81de908e9dcbcbfcc Mon Sep 17 00:00:00 2001 From: Miles Bader Date: Thu, 26 Oct 2000 04:35:48 +0000 Subject: [PATCH] (previous-matching-history-element): Position point on match. Handle N == 0 correctly. Miscellaneous cleanup. --- lisp/ChangeLog | 5 +++- lisp/simple.el | 73 +++++++++++++++++++++++++++----------------------- 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 07de8dbd57b..dd2c3907dc8 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,4 +1,7 @@ -2000-10-25 Miles Bader +2000-10-26 Miles Bader + + * simple.el (previous-matching-history-element): Position point on + match. Handle N == 0 correctly. Miscellaneous cleanup. * comint.el (comint-mode): Locally set `next-line-add-newlines' to nil. (comint-mode-map): Reverse order of `comint-write-output' and diff --git a/lisp/simple.el b/lisp/simple.el index 891928b3969..c95fd36c863 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -715,44 +715,49 @@ See also `minibuffer-history-case-insensitive-variables'." (error "No previous history search regexp")) regexp) (prefix-numeric-value current-prefix-arg)))) - (if (and (zerop minibuffer-history-position) - (null minibuffer-text-before-history)) - (setq minibuffer-text-before-history (field-string (point-max)))) - (let ((history (symbol-value minibuffer-history-variable)) - (case-fold-search - (if (isearch-no-upper-case-p regexp t) ; assume isearch.el is dumped - ;; On some systems, ignore case for file names. - (if (memq minibuffer-history-variable - minibuffer-history-case-insensitive-variables) - t - ;; Respect the user's setting for case-fold-search: - case-fold-search) - nil)) - prevpos - (pos minibuffer-history-position)) - (while (/= n 0) - (setq prevpos pos) - (setq pos (min (max 1 (+ pos (if (< n 0) -1 1))) (length history))) - (if (= pos prevpos) + (unless (zerop n) + (if (and (zerop minibuffer-history-position) + (null minibuffer-text-before-history)) + (setq minibuffer-text-before-history (field-string (point-max)))) + (let ((history (symbol-value minibuffer-history-variable)) + (case-fold-search + (if (isearch-no-upper-case-p regexp t) ; assume isearch.el is dumped + ;; On some systems, ignore case for file names. + (if (memq minibuffer-history-variable + minibuffer-history-case-insensitive-variables) + t + ;; Respect the user's setting for case-fold-search: + case-fold-search) + nil)) + prevpos + match-string + match-offset + (pos minibuffer-history-position)) + (while (/= n 0) + (setq prevpos pos) + (setq pos (min (max 1 (+ pos (if (< n 0) -1 1))) (length history))) + (when (= pos prevpos) (error (if (= pos 1) "No later matching history item" "No earlier matching history item"))) - (if (string-match regexp - (if (eq minibuffer-history-sexp-flag - (minibuffer-depth)) - (let ((print-level nil)) - (prin1-to-string (nth (1- pos) history))) - (nth (1- pos) history))) - (setq n (+ n (if (< n 0) 1 -1))))) - (setq minibuffer-history-position pos) - (goto-char (point-max)) - (delete-field) - (let ((elt (nth (1- pos) history))) - (insert (if (eq minibuffer-history-sexp-flag (minibuffer-depth)) + (setq match-string + (if (eq minibuffer-history-sexp-flag (minibuffer-depth)) (let ((print-level nil)) - (prin1-to-string elt)) - elt))) - (goto-char (field-beginning))) + (prin1-to-string (nth (1- pos) history))) + (nth (1- pos) history))) + (setq match-offset + (if (< n 0) + (and (string-match regexp match-string) + (match-end 0)) + (and (string-match (concat ".*\\(" regexp "\\)") match-string) + (match-beginning 1)))) + (when match-offset + (setq n (+ n (if (< n 0) 1 -1))))) + (setq minibuffer-history-position pos) + (goto-char (point-max)) + (delete-field) + (insert match-string) + (goto-char (+ (field-beginning) match-offset)))) (if (or (eq (car (car command-history)) 'previous-matching-history-element) (eq (car (car command-history)) 'next-matching-history-element)) (setq command-history (cdr command-history)))) -- 2.39.2