*** empty log message ***
authorRichard M. Stallman <rms@gnu.org>
Sun, 26 Jul 1992 19:54:20 +0000 (19:54 +0000)
committerRichard M. Stallman <rms@gnu.org>
Sun, 26 Jul 1992 19:54:20 +0000 (19:54 +0000)
lisp/mail/rmail.el
lisp/simple.el

index fa0c7db..ba2a976 100644 (file)
@@ -261,6 +261,7 @@ Note:    it means the file has no messages in it.\n\^_")))
   (define-key rmail-mode-map "\e\C-m" 'rmail-retry-failure)
   (define-key rmail-mode-map "c" 'rmail-continue)
   (define-key rmail-mode-map "f" 'rmail-forward)
+  (define-key rmail-mode-map "\er" 'rmail-search-backwards)
   (define-key rmail-mode-map "\es" 'rmail-search)
   (define-key rmail-mode-map "<" 'rmail-first-message)
   (define-key rmail-mode-map ">" 'rmail-last-message)
@@ -1108,11 +1109,11 @@ or forward if N is negative."
     (if (>= where (rmail-msgbeg high)) high low)))
 
 (defvar rmail-search-last-regexp nil)
-(defun rmail-search (regexp &optional reversep)
+(defun rmail-search (regexp &optional n)
   "Show message containing next match for REGEXP.
-Search in reverse (earlier messages) with non-nil second arg REVERSEP.
-Interactively, empty argument means use same regexp used last time,
-and reverse search is specified by a negative numeric arg."
+Prefix argument gives repeat count; negative argument means search
+backwards (through earlier messages).
+Interactively, empty argument means use same regexp used last time."
   (interactive
     (let* ((reversep (< (prefix-numeric-value current-prefix-arg) 0))
           (prompt
@@ -1128,7 +1129,9 @@ and reverse search is specified by a negative numeric arg."
             (setq rmail-search-last-regexp regexp))
            ((not rmail-search-last-regexp)
             (error "No previous Rmail search string")))
-      (list rmail-search-last-regexp reversep)))
+      (list rmail-search-last-regexp
+           (prefix-numeric-value current-prefix-arg))))
+  (or n (setq n 1))
   (message "%sRmail search for %s..."
           (if reversep "Reverse " "")
           regexp)
@@ -1137,20 +1140,23 @@ and reverse search is specified by a negative numeric arg."
        (omax (point-max))
        (opoint (point))
        win
+       (reversep (< n 0))
        (msg rmail-current-message))
     (unwind-protect
        (progn
          (widen)
-         ;; Check messages one by one, advancing message number up or down
-         ;; but searching forward through each message.
-         (if reversep
-             (while (and (null win) (> msg 1))
-               (goto-char (rmail-msgbeg (setq msg (1- msg))))
-               (setq win (re-search-forward
-                          regexp (rmail-msgend msg) t)))
-           (while (and (null win) (< msg rmail-total-messages))
-             (goto-char (rmail-msgbeg (setq msg (1+ msg))))
-             (setq win (re-search-forward regexp (rmail-msgend msg) t)))))
+         (while (/= n 0)
+           ;; Check messages one by one, advancing message number up or down
+           ;; but searching forward through each message.
+           (if reversep
+               (while (and (null win) (> msg 1))
+                 (goto-char (rmail-msgbeg (setq msg (1- msg))))
+                 (setq win (re-search-forward
+                            regexp (rmail-msgend msg) t)))
+             (while (and (null win) (< msg rmail-total-messages))
+               (goto-char (rmail-msgbeg (setq msg (1+ msg))))
+               (setq win (re-search-forward regexp (rmail-msgend msg) t))))
+           (setq n (+ n (if (< n 0) -1 1)))))
       (if win
          (progn
            ;; If this is a reverse search and we found a message,
@@ -1171,6 +1177,30 @@ and reverse search is specified by a negative numeric arg."
        (ding)
        (message "Search failed: %s" regexp)))))
 
+(defun rmail-search-backwards (regexp &optional n)
+  "Show message containing previous match for REGEXP.
+Prefix argument gives repeat count; negative argument means search
+forward (through later messages).
+Interactively, empty argument means use same regexp used last time."
+  (interactive
+    (let* ((reversep (< (prefix-numeric-value current-prefix-arg) 0))
+          (prompt
+           (concat (if reversep "Reverse " "") "Rmail search (regexp): "))
+          regexp)
+      (if rmail-search-last-regexp
+         (setq prompt (concat prompt
+                              "(default "
+                              rmail-search-last-regexp
+                              ") ")))
+      (setq regexp (read-string prompt))
+      (cond ((not (equal regexp ""))
+            (setq rmail-search-last-regexp regexp))
+           ((not rmail-search-last-regexp)
+            (error "No previous Rmail search string")))
+      (list rmail-search-last-regexp
+           (prefix-numeric-value current-prefix-arg))))
+  (rmail-search regexp (- (or n -1))))
+
 ;; Show the first message which has the `unseen' attribute.
 (defun rmail-first-unseen-message ()
   (let ((current 1)
index 0ed3888..2da7188 100644 (file)
@@ -350,27 +350,6 @@ the minibuffer, then read and evaluate the result."
        (setq command-history (cons command command-history)))
     (eval command)))
 
-;; (defvar repeat-complex-command nil)
-
-(defvar minibuffer-history nil)
-(defvar minibuffer-history-sexp-flag nil)
-(setq minibuffer-history-variable 'minibuffer-history)
-(setq minibuffer-history-position nil)
-
-(define-key minibuffer-local-map "\en" 'next-history-element)
-(define-key minibuffer-local-ns-map "\en" 'next-history-element)
-(define-key minibuffer-local-ns-map "\en" 'next-history-element)
-(define-key minibuffer-local-completion-map "\en" 'next-history-element)
-(define-key minibuffer-local-completion-map "\en" 'next-history-element)
-(define-key minibuffer-local-must-match-map "\en" 'next-history-element)
-
-(define-key minibuffer-local-map "\ep" 'previous-history-element)
-(define-key minibuffer-local-ns-map "\ep" 'previous-history-element)
-(define-key minibuffer-local-ns-map "\ep" 'previous-history-element)
-(define-key minibuffer-local-completion-map "\ep" 'previous-history-element)
-(define-key minibuffer-local-completion-map "\ep" 'previous-history-element)
-(define-key minibuffer-local-must-match-map "\ep" 'previous-history-element)
-
 (defun repeat-complex-command (arg)
   "Edit and re-evaluate last complex command, or ARGth from last.
 A complex command is one which used the minibuffer.
@@ -384,7 +363,6 @@ to get different commands to edit and resubmit."
   (let ((elt (nth (1- arg) command-history))
        (minibuffer-history-position arg)
        (minibuffer-history-sexp-flag t)
-       (repeat-complex-command-flag t)
        newcmd)
     (if elt
        (let ((minibuffer-history-variable ' command-history))
@@ -400,6 +378,75 @@ to get different commands to edit and resubmit."
              (setq command-history (cons newcmd command-history)))
          (eval newcmd))
       (ding))))
+\f
+(defvar minibuffer-history nil)
+(defvar minibuffer-history-sexp-flag nil)
+(setq minibuffer-history-variable 'minibuffer-history)
+(setq minibuffer-history-position nil)
+
+(define-key minibuffer-local-map "\en" 'next-history-element)
+(define-key minibuffer-local-ns-map "\en" 'next-history-element)
+(define-key minibuffer-local-ns-map "\en" 'next-history-element)
+(define-key minibuffer-local-completion-map "\en" 'next-history-element)
+(define-key minibuffer-local-completion-map "\en" 'next-history-element)
+(define-key minibuffer-local-must-match-map "\en" 'next-history-element)
+
+(define-key minibuffer-local-map "\ep" 'previous-history-element)
+(define-key minibuffer-local-ns-map "\ep" 'previous-history-element)
+(define-key minibuffer-local-ns-map "\ep" 'previous-history-element)
+(define-key minibuffer-local-completion-map "\ep" 'previous-history-element)
+(define-key minibuffer-local-completion-map "\ep" 'previous-history-element)
+(define-key minibuffer-local-must-match-map "\ep" 'previous-history-element)
+
+(define-key minibuffer-local-map "\er" 'previous-matching-history-element)
+(define-key minibuffer-local-ns-map "\er" 'previous-matching-history-element)
+(define-key minibuffer-local-ns-map "\er" 'previous-matching-history-element)
+(define-key minibuffer-local-completion-map "\er"
+  'previous-matching-history-element)
+(define-key minibuffer-local-completion-map "\er"
+  'previous-matching-history-element)
+(define-key minibuffer-local-must-match-map "\er"
+  'previous-matching-history-element)
+
+(define-key minibuffer-local-map "\es" 'next-matching-history-element)
+(define-key minibuffer-local-ns-map "\es" 'next-matching-history-element)
+(define-key minibuffer-local-ns-map "\es" 'next-matching-history-element)
+(define-key minibuffer-local-completion-map "\es"
+  'next-matching-history-element)
+(define-key minibuffer-local-completion-map "\es"
+  'next-matching-history-element)
+(define-key minibuffer-local-must-match-map "\es"
+  'next-matching-history-element)
+
+(put 'previous-matching-history-element 'enable-recursive-minibuffers t)
+(defun previous-matching-history-element (regexp n)
+  (interactive "sPrevious element matching (regexp): \np")
+  (let ((history (symbol-value minibuffer-history-variable))
+       (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)
+         (error (if (= pos 1)
+                    "No following item in minibuffer history"
+                  "No preceding item in minibuffer history")))
+      (if (string-match regexp
+                       (if minibuffer-history-sexp-flag
+                           (prin1-to-string (nth (1- pos) history))
+                         (nth (1- pos) history)))
+         (setq n (+ n (if (< n 0) -1 1)))))
+    (setq minibuffer-history-position pos)
+    (erase-buffer)
+    (let ((elt (nth (1- pos) history)))
+      (insert (if minibuffer-history-sexp-flag
+                 (prin1-to-string elt)
+               elt)))
+      (goto-char (point-min))))
+
+(put 'next-matching-history-element 'enable-recursive-minibuffers t)
+(defun next-matching-history-element (regexp n)
+  (interactive "sNext element matching (regexp): \np")
+  (previous-matching-history-element regexp (- n)))
 
 (defun next-history-element (n)
   "Insert the next element of the minibuffer history into the minibuffer."
@@ -423,10 +470,8 @@ to get different commands to edit and resubmit."
 (defun previous-history-element (n)
   "Inserts the previous element of `command-history' into the minibuffer."
   (interactive "p")
-;;  (if repeat-complex-command-flag
   (next-history-element (- n)))
-;;    (repeat-complex-command 1)))
-
+\f
 (defun goto-line (arg)
   "Goto line ARG, counting from line 1 at beginning of buffer."
   (interactive "NGoto line: ")