GNU bug report logs - #19710
24.4.51; Isearch is broken in comints which relly on regexp

Previous Next

Package: emacs;

Reported by: Vitalie Spinu <spinuvit <at> gmail.com>

Date: Wed, 28 Jan 2015 09:11:02 UTC

Severity: normal

Found in version 24.4.51

Done: Juri Linkov <juri <at> linkov.net>

Bug is archived. No further changes may be made.

Full log


Message #11 received at 19710 <at> debbugs.gnu.org (full text, mbox):

From: Vitalie Spinu <spinuvit <at> gmail.com>
To: Juri Linkov <juri <at> linkov.net>
Cc: 19710 <at> debbugs.gnu.org
Subject: Re: bug#19710: 24.4.51;
 Isearch is broken in comints which relly on regexp
Date: Thu, 29 Jan 2015 09:13:08 +0100
Thanks Juri, this patch solves the problem indeed.


  Vitalie



 >>> Juri Linkov on Thu, 29 Jan 2015 02:50:33 +0200 wrote:

 >> Recent changes to commit to allow for multiline search assume fields
 >> throughout. The common case when comint-use-prompt-regexp is non-nil is
 >> not captured.
 >> 
 >> To see the problem start shell and issue a couple of commands. Then
 >> (setq comint-use-prompt-regexp t), and add a couple of RETs. Then try M-r.
 >> 
 >> You should see "Regexp history I-search backward:" several lines above
 >> where it should be and isearch will not work as expected.
 >> 
 >> If you restart your shell, you will not even see the "Regexp history
 >> I-search backward:" as there are no fields in the buffer.

 > Thanks for the report.  This can be fixed by the patch that
 > reverts the change of callers, and instead modifies
 > `comint-line-beginning-position' to support multi-line input
 > for both cases of comint-use-prompt-regexp = t/nil:

 > diff --git a/lisp/comint.el b/lisp/comint.el
 > index 30c4dda..1333a0b 100644
 > --- a/lisp/comint.el
 > +++ b/lisp/comint.el
 > @@ -1475,7 +1475,7 @@ (defun comint-history-isearch-search ()
 >        (or
 >         ;; 1. First try searching in the initial comint text
 >         (funcall search-fun string
 > -		(if isearch-forward bound (field-beginning))
 > +		(if isearch-forward bound (comint-line-beginning-position))
 >  		noerror)
 >         ;; 2. If the above search fails, start putting next/prev history
 >         ;; elements in the comint successively, and search the string
 > @@ -1491,7 +1491,7 @@ (defun comint-history-isearch-search ()
 >  			(when (null comint-input-ring-index)
 >  			  (error "End of history; no next item"))
 >  			(comint-next-input 1)
 > -			(goto-char (field-beginning)))
 > +			(goto-char (comint-line-beginning-position)))
 >  		       (t
 >  			;; Signal an error here explicitly, because
 >  			;; `comint-previous-input' doesn't signal an error.
 > @@ -1509,7 +1509,7 @@ (defun comint-history-isearch-search ()
 >  				      (unless isearch-forward
 >  					;; For backward search, don't search
 >  					;; in the comint prompt
 > -					(field-beginning))
 > +					(comint-line-beginning-position))
 >  				      noerror)))
 >  	       ;; Return point of the new search result
 >  	       (point))
 > @@ -1533,16 +1533,16 @@ (defun comint-history-isearch-message (&optional c-q-hack ellipsis)
 >      (if (overlayp comint-history-isearch-message-overlay)
 >  	(move-overlay comint-history-isearch-message-overlay
 >  		      (save-excursion
 > -			(goto-char (field-beginning))
 > +			(goto-char (comint-line-beginning-position))
 >  			(forward-line 0)
 >  			(point))
 > -                      (field-beginning))
 > +                      (comint-line-beginning-position))
 >        (setq comint-history-isearch-message-overlay
 >  	    (make-overlay (save-excursion
 > -			    (goto-char (field-beginning))
 > +			    (goto-char (comint-line-beginning-position))
 >  			    (forward-line 0)
 >  			    (point))
 > -                          (field-beginning)))
 > +                          (comint-line-beginning-position)))
 >        (overlay-put comint-history-isearch-message-overlay 'evaporate t))
 >      (overlay-put comint-history-isearch-message-overlay
 >  		 'display (isearch-message-prefix ellipsis isearch-nonincremental))
 > @@ -1563,7 +1563,7 @@ (defun comint-history-isearch-wrap ()
 >        (comint-goto-input (1- (ring-length comint-input-ring)))
 >      (comint-goto-input nil))
 >    (setq isearch-success t)
 > -  (goto-char (if isearch-forward (field-beginning) (point-max))))
 > +  (goto-char (if isearch-forward (comint-line-beginning-position) (point-max))))

 >  (defun comint-history-isearch-push-state ()
 >    "Save a function restoring the state of input history search.
 > @@ -1787,7 +1787,10 @@ (defun comint-send-input (&optional no-newline artificial)
 >        (widen)
 >        (let* ((pmark (process-mark proc))
 >               (intxt (if (>= (point) (marker-position pmark))
 > -                        (progn (if comint-eol-on-send (goto-char (field-end)))
 > +                        (progn (if comint-eol-on-send
 > +				   (if comint-use-prompt-regexp
 > +				       (end-of-line)
 > +				     (goto-char (field-end))))
 >                                 (buffer-substring pmark (point)))
 >                        (let ((copy (funcall comint-get-old-input)))
 >                          (goto-char pmark)
 > @@ -2266,6 +2269,7 @@ (defun comint-line-beginning-position ()
 >    (if comint-use-prompt-regexp
 >        ;; Use comint-prompt-regexp
 >        (save-excursion
 > +	(re-search-backward (concat comint-prompt-regexp ".*") nil t)
 >  	(beginning-of-line)
 >  	(comint-skip-prompt)
 >  	(point))
 > @@ -2276,7 +2280,7 @@ (defun comint-line-beginning-position ()
 >      ;; if there are two fields on a line, then the first one is the
 >      ;; prompt, and the second one is an input field, and is front-sticky
 >      ;; (as input fields should be).
 > -    (constrain-to-field (line-beginning-position) (line-end-position))))
 > +    (constrain-to-field (field-beginning) (line-end-position))))

 >  (defun comint-bol (&optional arg)
 >    "Go to the beginning of line, then skip past the prompt, if any.




This bug report was last modified 10 years and 156 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.