diff --git a/lisp/isearch.el b/lisp/isearch.el index ce75911..04f29ba 100644 --- a/lisp/isearch.el +++ b/lisp/isearch.el @@ -1340,15 +1340,60 @@ Use `isearch-exit' to quit without signaling." (isearch-push-state) (isearch-update)) -(defun isearch-repeat-forward () +(defun isearch-repeat-forward (&optional arg) "Repeat incremental search forwards." - (interactive) - (isearch-repeat 'forward)) - -(defun isearch-repeat-backward () + (interactive "P") + (if arg + (let ((narg (prefix-numeric-value arg))) + (if (< narg 0) + ;; Go backward. + (progn + ;; Switch direction if necessary + (if isearch-forward (isearch-repeat 'backward)) + ;; Go back narg times + (while (and isearch-success (< narg 0)) + (isearch-repeat 'backward) + (setq narg (1+ narg))) + ;; Switch back to forward search + (isearch-repeat 'forward)) + ;; Go forward + (progn + ;; Switch direction if necessary + (or isearch-forward (isearch-repeat 'forward)) + ;; Go forward narg times + (while (and isearch-success (> narg 0)) + (isearch-repeat 'forward) + (setq narg (1- narg)))))) + ;; No argument + (isearch-repeat 'forward))) + +(defun isearch-repeat-backward (&optional arg) "Repeat incremental search backwards." - (interactive) - (isearch-repeat 'backward)) + (interactive "P") + (if arg + (let ((narg (prefix-numeric-value arg))) + (if (< narg 0) + ;; Go forward. + (progn + ;; Switch direction if necessary + (or isearch-forward (isearch-repeat 'forward)) + ;; Go back narg times + (while (and isearch-success(< narg 0)) + (isearch-repeat 'forward) + (setq narg (1+ narg))) + ;; Switch back to backward search + (isearch-repeat 'backward)) + ;; Go backward + (progn + ;; Switch direction if necessary + (if isearch-forward (isearch-repeat 'backward)) + ;; Go backward narg times + (while (and isearch-success (> narg 0)) + (isearch-repeat 'backward) + (setq narg (1- narg)))))) + ;; No argument + (isearch-repeat 'backward))) + (defun isearch-toggle-regexp () "Toggle regexp searching on or off."