bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#19710: 24.4.51; Isearch is broken in comints which relly on regexp


From: Vitalie Spinu
Subject: bug#19710: 24.4.51; Isearch is broken in comints which relly on regexp
Date: Thu, 29 Jan 2015 09:13:08 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4.51 (gnu/linux)

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.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]