Function: comint-previous-matching-input-string-position
comint-previous-matching-input-string-position is a byte-compiled
function defined in comint.el.gz.
Signature
(comint-previous-matching-input-string-position REGEXP ARG &optional START)
Documentation
Return the index matching REGEXP ARG places along the input ring.
Moves relative to START, or comint-input-ring-index.
Source Code
;; Defined in /usr/src/emacs/lisp/comint.el.gz
(defun comint-previous-matching-input-string-position (regexp arg &optional start)
"Return the index matching REGEXP ARG places along the input ring.
Moves relative to START, or `comint-input-ring-index'."
(if (or (not (ring-p comint-input-ring))
(ring-empty-p comint-input-ring))
(user-error "No history"))
(let* ((len (ring-length comint-input-ring))
(motion (if (> arg 0) 1 -1))
(n (mod (- (or start (comint-search-start arg)) motion) len))
(tried-each-ring-item nil)
(prev nil))
;; Do the whole search as many times as the argument says.
(while (and (/= arg 0) (not tried-each-ring-item))
;; Step once.
(setq prev n
n (mod (+ n motion) len))
;; If we haven't reached a match, step some more.
(while (and (< n len) (not tried-each-ring-item)
(not (string-match regexp (ring-ref comint-input-ring n))))
(setq n (mod (+ n motion) len)
;; If we have gone all the way around in this search.
tried-each-ring-item (= n prev)))
(setq arg (if (> arg 0) (1- arg) (1+ arg))))
;; Now that we know which ring element to use, if we found it, return that.
(if (string-match regexp (ring-ref comint-input-ring n))
n)))