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.
View this message in rfc822 format
From: Vitalie Spinu <spinuvit <at> gmail.com> To: Juri Linkov <juri <at> linkov.net> Cc: 19710 <at> debbugs.gnu.org Subject: 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.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.