From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Tak Ota Newsgroups: gmane.emacs.devel Subject: Re: collect-string (was: simple useful functions) Date: Thu, 4 Nov 2010 13:27:09 -0700 Message-ID: <20101104.132709.29335017.Takaaki.Ota@am.sony.com> References: <20101104.113654.332196908.Takaaki.Ota@am.sony.com> <20101104.131820.01325185.Takaaki.Ota@am.sony.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Trace: dough.gmane.org 1288902455 28182 80.91.229.12 (4 Nov 2010 20:27:35 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Thu, 4 Nov 2010 20:27:35 +0000 (UTC) Cc: stephen@xemacs.org, emacs-devel@gnu.org To: Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Nov 04 21:27:29 2010 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1PE6PA-0007yQ-8H for ged-emacs-devel@m.gmane.org; Thu, 04 Nov 2010 21:27:28 +0100 Original-Received: from localhost ([127.0.0.1]:53628 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PE6P9-0001n1-6j for ged-emacs-devel@m.gmane.org; Thu, 04 Nov 2010 16:27:27 -0400 Original-Received: from [140.186.70.92] (port=49904 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PE6Oz-0001kn-RV for emacs-devel@gnu.org; Thu, 04 Nov 2010 16:27:19 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PE6Ox-0007IR-Sa for emacs-devel@gnu.org; Thu, 04 Nov 2010 16:27:17 -0400 Original-Received: from tx2ehsobe001.messaging.microsoft.com ([65.55.88.11]:51608 helo=TX2EHSOBE001.bigfish.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PE6Ox-0007IF-LU for emacs-devel@gnu.org; Thu, 04 Nov 2010 16:27:15 -0400 Original-Received: from mail152-tx2-R.bigfish.com (10.9.14.246) by TX2EHSOBE001.bigfish.com (10.9.40.21) with Microsoft SMTP Server id 14.1.225.8; Thu, 4 Nov 2010 20:27:14 +0000 Original-Received: from mail152-tx2 (localhost.localdomain [127.0.0.1]) by mail152-tx2-R.bigfish.com (Postfix) with ESMTP id 51CF2308192; Thu, 4 Nov 2010 20:27:14 +0000 (UTC) X-SpamScore: -20 X-BigFish: VPS-20(zz936eK154dM1432N98dNzz1202hzz8275bhz2fh2a8h61h) X-Forefront-Antispam-Report: KIP:(null);UIP:(null);(null);(null) Original-Received: from mail152-tx2 (localhost.localdomain [127.0.0.1]) by mail152-tx2 (MessageSwitch) id 1288902433848514_12003; Thu, 4 Nov 2010 20:27:13 +0000 (UTC) Original-Received: from TX2EHSMHS029.bigfish.com (unknown [10.9.14.242]) by mail152-tx2.bigfish.com (Postfix) with ESMTP id BFF8217D8054; Thu, 4 Nov 2010 20:27:13 +0000 (UTC) Original-Received: from mail7.fw-bc.sony.com (160.33.98.74) by TX2EHSMHS029.bigfish.com (10.9.99.129) with Microsoft SMTP Server (TLS) id 14.0.482.44; Thu, 4 Nov 2010 20:27:12 +0000 Original-Received: from mail1x.bc.in.sel.sony.com ([43.144.65.112]) by mail7.fw-bc.sony.com (Switch-3.4.2/Switch-3.3.2mp) with ESMTP id oA4KRBgV021844 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Thu, 4 Nov 2010 20:27:11 GMT Original-Received: from localhost (tak-vaio-z790-043191018003.am.sony.com [43.191.18.3]) by mail1x.bc.in.sel.sony.com (Switch-3.4.2/Switch-3.4.2) with ESMTP id oA4KRAcG008539; Thu, 4 Nov 2010 20:27:11 GMT In-Reply-To: <20101104.131820.01325185.Takaaki.Ota@am.sony.com> X-Mailer: Mew-6.3.50 on Emacs-23.2.1 (i386-mingw-nt6.1.7600 built on 2010-06-30) X-Reverse-DNS: mail7.fw-bc.sony.com X-detected-operating-system: by eggs.gnu.org: Windows 2000 SP2+, XP SP1+ (seldom 98) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:132374 Archived-At: And here is the change log update. 2010-11-04 Takaaki Ota * replace.el (occur-1): Add string collection feature when NLINES is zero or negative integer value. -Tak Thu, 04 Nov 2010 13:18:20 -0700: Tak Ota wrote: > The documentation can be something like this. I just added the last > paragraph below. > > -Tak > > `M-x occur' > Prompt for a regexp, and display a list showing each line in the > buffer that contains a match for it. To limit the search to part > of the buffer, narrow to that part (*note Narrowing::). A numeric > argument N specifies that N lines of context are to be displayed > before and after each matching line. Currently, `occur' can not > correctly handle multiline matches. > > The buffer `*Occur*' containing the output serves as a menu for > finding the occurrences in their original context. Click > `Mouse-2' on an occurrence listed in `*Occur*', or position point > there and type ; this switches to the buffer that was > searched and moves point to the original of the chosen occurrence. > `o' and `C-o' display the match in another window; `C-o' does not > select it. > > After using `M-x occur', you can use `next-error' to visit the > occurrences found, one by one. *note Compilation Mode::. > > When the numeric argument N is 0 or negative the buffer `*Occur*' > collects all the matched strings. When N is 0 the entire text > matched is collected. When N is negative the text in the -Nth > parenthesized expression in the regexp is collected. > > > Thu, 04 Nov 2010 11:36:54 -0700: Tak Ota wrote: > > > Thu, 4 Nov 2010 06:58:20 -0700: Stefan Monnier wrote: > > > > > >> How about rename the command as collect-occur instead of > > > >> collect-string and document it as next? > > > > Wrong namespace. IMO, the name should *start* with occur (but Stefan > > > > and Yidong are final authorities on that). > > > > > > Agreed, namespace cleanliness is one of my favorite forms of > > > anal retentiveness. > > > > > > The way I see it, the suggested collect-string is a variant of occur > > > where the result buffer contains none of the regexp matches's context. > > > So it would make sense to integrate it very tightly with `occur', > > > i.e. make M-x occur do the job of collect-strings for some particular > > > value of its argument NLINES. Currently, NLINES is assumed to be > > > a number and all values of that number have a useful meaning, so we'd > > > have to add this new feature via a non-number value of NLINES. > > > > > > E.g. C-u M-x occur could do the collect-string thingy (which is still an > > > incompatible change since some people may like to use C-u M-x occur to get > > > 4 lines of context, but you can make omelets without breaking eggs). > > > > > > > > > Stefan > > > > > > > Now I am convinced. How about the change below? In conventional > > occur zero or negative value for nlines is meaningless correct? We > > can use that for collection purpose. i.e. C-u 0 M-x occur does the > > collection of the matching pattern. C-u -1 M-x occur performs the > > collection of the recorded pattern 1. > > > > -Tak > > > > (defun occur-1 (regexp nlines bufs &optional buf-name) > > (unless (and regexp (not (equal regexp ""))) > > (error "Occur doesn't work with the empty regexp")) > > (unless buf-name > > (setq buf-name "*Occur*")) > > (let (occur-buf > > (active-bufs (delq nil (mapcar #'(lambda (buf) > > (when (buffer-live-p buf) buf)) > > bufs)))) > > ;; Handle the case where one of the buffers we're searching is the > > ;; output buffer. Just rename it. > > (when (member buf-name (mapcar 'buffer-name active-bufs)) > > (with-current-buffer (get-buffer buf-name) > > (rename-uniquely))) > > > > ;; Now find or create the output buffer. > > ;; If we just renamed that buffer, we will make a new one here. > > (setq occur-buf (get-buffer-create buf-name)) > > > > (if (or (null (integerp nlines)) > > (> nlines 0)) > > ;; nlines is not zero or negative so perform nomal occur > > (with-current-buffer occur-buf > > (occur-mode) > > (let ((inhibit-read-only t) > > ;; Don't generate undo entries for creation of the initial contents. > > (buffer-undo-list t)) > > (erase-buffer) > > (let ((count (occur-engine > > regexp active-bufs occur-buf > > (or nlines list-matching-lines-default-context-lines) > > (if (and case-fold-search search-upper-case) > > (isearch-no-upper-case-p regexp t) > > case-fold-search) > > list-matching-lines-buffer-name-face > > nil list-matching-lines-face > > (not (eq occur-excluded-properties t))))) > > (let* ((bufcount (length active-bufs)) > > (diff (- (length bufs) bufcount))) > > (message "Searched %d buffer%s%s; %s match%s for `%s'" > > bufcount (if (= bufcount 1) "" "s") > > (if (zerop diff) "" (format " (%d killed)" diff)) > > (if (zerop count) "no" (format "%d" count)) > > (if (= count 1) "" "es") > > regexp)) > > (setq occur-revert-arguments (list regexp nlines bufs)) > > (if (= count 0) > > (kill-buffer occur-buf) > > (display-buffer occur-buf) > > (setq next-error-last-buffer occur-buf) > > (setq buffer-read-only t) > > (set-buffer-modified-p nil) > > (run-hooks 'occur-hook))))) > > ;; nlines is zero or negative integer perform collect-string > > (with-current-buffer occur-buf > > (setq nlines (- nlines)) > > (fundamental-mode) > > (let ((inhibit-read-only t) > > (buffer-undo-list t)) > > (erase-buffer) > > (while active-bufs > > (with-current-buffer (car active-bufs) > > (save-excursion > > (goto-char (point-min)) > > (while (re-search-forward regexp nil t) > > (let ((str (match-string nlines))) > > (if str > > (with-current-buffer occur-buf > > (insert str) > > (or (zerop (current-column)) > > (insert "\n")))))))) > > (setq active-bufs (cdr active-bufs)))) > > (display-buffer occur-buf)))))