Subject: bug#10705: closed (Re: bug#10705: 24.0.93; Collect strings matching regexp from Isearch)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 23 Feb 2012 00:42:02 +0000

Your bug report

#10705: 24.0.93; Collect strings matching regexp from Isearch

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
10705: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=10705
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#10705: 24.0.93; Collect strings matching regexp from Isearch
From: Juri Linkov <[email-masked]>
To: Eli Zaretskii <[email-masked]>
Cc: [email-masked]
Date: Thu, 23 Feb 2012 02:38:04 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Installed, with all the comments from Eli and Drew.

Also added a NEWS entry for this feature extracted from the docstring of `occur'.

Subject: 24.0.93; Collect strings matching regexp from Isearch
From: Juri Linkov <[email-masked]>
To: [email-masked]
Date: Thu, 02 Feb 2012 23:02:03 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Currently `isearch-occur' is not in sync with the interactive specification
of `occur' that provides a new feature of `C-u M-x occur RET' that collects
the matching strings into the `*Occur*' buffer without line numbers.

The following patch syncs code from `occur-read-primary-args' to `isearch-occur'.

It doesn't quit Isearch when there are no subexpression in the regexp
(it collects the entire match with "\\&").

But in case of subexpression in the regexp, it quits Isearch because
it needs to ask for a substituted replacement string using `read-string'.

=== modified file 'lisp/isearch.el'
--- lisp/isearch.el	2012-01-25 17:54:01 +0000
+++ lisp/isearch.el	2012-02-02 21:01:12 +0000
@@ -1467,12 +1467,27 @@ (defun isearch-occur (regexp &optional n
 Interactively, REGEXP is the current search regexp or a quoted search
 string.  NLINES has the same meaning as in `occur'."
   (interactive
-   (list
-    (cond
-     (isearch-word (word-search-regexp isearch-string))
-     (isearch-regexp isearch-string)
-     (t (regexp-quote isearch-string)))
-    (if current-prefix-arg (prefix-numeric-value current-prefix-arg))))
+   (let* ((perform-collect (consp current-prefix-arg))
+	  (regexp (cond
+		   (isearch-word (word-search-regexp isearch-string))
+		   (isearch-regexp isearch-string)
+		   (t (regexp-quote isearch-string)))))
+     (list regexp
+	   (if perform-collect
+	       ;; Perform collect operation
+	       (if (zerop (regexp-opt-depth regexp))
+		   ;; No subexpression so collect the entire match.
+		   "\\&"
+		 ;; Get the regexp for collection pattern.
+		 (isearch-done nil t)
+		 (isearch-clean-overlays)
+		 (let ((default (car occur-collect-regexp-history)))
+		   (read-string
+		    (format "Regexp to collect (default %s): " default)
+		    nil 'occur-collect-regexp-history default)))
+	     ;; Otherwise normal occur takes numerical prefix argument.
+	     (when current-prefix-arg
+	       (prefix-numeric-value current-prefix-arg))))))
   (let ((case-fold-search isearch-case-fold-search)
 	;; Set `search-upper-case' to nil to not call
 	;; `isearch-no-upper-case-p' in `occur-1'.