all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Juri Linkov <juri@jurta.org>
To: "Lennart Borgman \(gmail\)" <lennart.borgman@gmail.com>
Cc: emacs-devel@gnu.org
Subject: Re: `Q' in Dired - be able to skip the rest of one file and move onto the next
Date: Sun, 20 Jul 2008 03:33:54 +0300	[thread overview]
Message-ID: <87wsjhgzrh.fsf@jurta.org> (raw)
In-Reply-To: <487C53DF.9010808@gmail.com> (Lennart Borgman's message of "Tue,  15 Jul 2008 09:38:07 +0200")

>> I see that this useful feature is not yet implemented, so I have
>> made a patch that implements multi-file query-replace UI.
>
> Thanks for implementing this.

I now have a better patch where all multi-file processing was moved to
`perform-replace', so external packages like etags.el only need to add
`multi-query-replace-map' as the `map' argument of `perform-replace'.

Index: lisp/progmodes/etags.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/progmodes/etags.el,v
retrieving revision 1.211
diff -c -r1.211 etags.el
*** lisp/progmodes/etags.el	7 Jun 2008 02:37:37 -0000	1.211
--- lisp/progmodes/etags.el	20 Jul 2008 00:27:14 -0000
***************
*** 1865,1871 ****
  			      ;; to the beginning of it so perform-replace
  			      ;; will see it.
  			      (goto-char (match-beginning 0))))
! 	tags-loop-operate `(perform-replace ',from ',to t t ',delimited))
    (tags-loop-continue (or file-list-form t)))
  \f
  (defun tags-complete-tags-table-file (string predicate what) ; Doc string?
--- 1865,1872 ----
  			      ;; to the beginning of it so perform-replace
  			      ;; will see it.
  			      (goto-char (match-beginning 0))))
! 	tags-loop-operate `(perform-replace ',from ',to t t ',delimited
! 					    nil multi-query-replace-map))
    (tags-loop-continue (or file-list-form t)))
  \f
  (defun tags-complete-tags-table-file (string predicate what) ; Doc string?

Index: lisp/replace.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/replace.el,v
retrieving revision 1.273
diff -c -r1.273 replace.el
*** lisp/replace.el	29 Jun 2008 16:09:08 -0000	1.273
--- lisp/replace.el	20 Jul 2008 00:32:42 -0000
***************
*** 1372,1377 ****
--- 1372,1391 ----
  `exit', `act-and-exit', `edit', `delete-and-edit', `recenter',
  `automatic', `backup', `exit-prefix', and `help'.")
  
+ (defvar multi-query-replace-map
+   (let ((map (make-sparse-keymap)))
+     (set-keymap-parent map query-replace-map)
+     (define-key map "Y" 'automatic-all)
+     (define-key map "N" 'exit-current)
+     map)
+   "Keymap that defines additional bindings for multi-buffer operations.
+ It extends its parent map `query-replace-map' with new bindings to
+ operate on a set of buffers/files.  The difference with its parent map
+ is the additional answers `automatic-all' to replace all remaining
+ matches in all remaining buffers with no more questions, and
+ `exit-current' to skip remaining matches in the current buffer
+ and to continue with the next buffer in the sequence.")
+ 
  (defun replace-match-string-symbols (n)
    "Process a list (and any sub-lists), expanding certain symbols.
  Symbol  Expands To
***************
*** 1527,1532 ****
--- 1541,1547 ----
           (stack nil)
           (replace-count 0)
           (nonempty-match nil)
+ 	 (multi-file nil)
  
           ;; If non-nil, it is marker saying where in the buffer to stop.
           (limit nil)
***************
*** 1548,1553 ****
--- 1563,1573 ----
        (goto-char (min start end))
        (deactivate-mark))
  
+     ;; If last typed key in previous call of multi-file perform-replace
+     ;; was `automatic-all', don't ask more questions in next files
+     (when (eq (lookup-key map (vector last-input-char)) 'automatic-all)
+       (setq query-flag nil multi-file t))
+ 
      ;; REPLACEMENTS is either a string, a list of strings, or a cons cell
      ;; containing a function and its first argument.  The function is
      ;; called to generate each replacement like this:
***************
*** 1705,1710 ****
--- 1725,1732 ----
  			((eq def 'exit)
  			 (setq keep-going nil)
  			 (setq done t))
+ 			((eq def 'exit-current)
+ 			 (setq multi-file t keep-going nil done t))
  			((eq def 'backup)
  			 (if stack
  			     (let ((elt (pop stack)))
***************
*** 1744,1757 ****
  				   real-match-data (replace-match-data
  						    t real-match-data)
  				   replaced t)))
! 			((eq def 'automatic)
  			 (or replaced
  			     (setq noedit
  				   (replace-match-maybe-edit
  				    next-replacement nocasify literal
  				    noedit real-match-data)
  				   replace-count (1+ replace-count)))
! 			 (setq done t query-flag nil replaced t))
  			((eq def 'skip)
  			 (setq done t))
  			((eq def 'recenter)
--- 1766,1780 ----
  				   real-match-data (replace-match-data
  						    t real-match-data)
  				   replaced t)))
! 			((or (eq def 'automatic) (eq def 'automatic-all))
  			 (or replaced
  			     (setq noedit
  				   (replace-match-maybe-edit
  				    next-replacement nocasify literal
  				    noedit real-match-data)
  				   replace-count (1+ replace-count)))
! 			 (setq done t query-flag nil replaced t)
! 			 (if (eq def 'automatic-all) (setq multi-file t)))
  			((eq def 'skip)
  			 (setq done t))
  			((eq def 'recenter)
***************
*** 1838,1844 ****
  	(message "Replaced %d occurrence%s"
  		 replace-count
  		 (if (= replace-count 1) "" "s")))
!     (and keep-going stack)))
  
  (defvar replace-overlay nil)
  
--- 1861,1867 ----
  	(message "Replaced %d occurrence%s"
  		 replace-count
  		 (if (= replace-count 1) "" "s")))
!     (or (and keep-going stack) multi-file)))
  
  (defvar replace-overlay nil)

-- 
Juri Linkov
http://www.jurta.org/emacs/




  reply	other threads:[~2008-07-20  0:33 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-02  7:34 `Q' in Dired - be able to skip the rest of one file and move on to the next Drew Adams
2008-01-03  9:50 ` Richard Stallman
2008-01-03 10:11   ` Andreas Schwab
2008-01-03 10:27     ` Miles Bader
2008-01-03 16:17       ` Drew Adams
2008-01-03 15:56   ` Luc Teirlinck
2008-01-03 16:18     ` `Q' in Dired - be able to skip the rest of one file and move onto " Drew Adams
2008-01-03 21:32       ` Juri Linkov
2008-01-04  2:11         ` Bastien
2008-07-15  0:27           ` Juri Linkov
2008-07-15  7:38             ` Lennart Borgman (gmail)
2008-07-20  0:33               ` Juri Linkov [this message]
2008-01-05  5:54       ` Richard Stallman
2008-01-08  0:21         ` Juri Linkov
2008-01-08  0:33           ` Drew Adams
2008-01-08 19:08             ` Richard Stallman
2008-01-09  0:48             ` Juri Linkov
2008-01-09  1:47               ` Drew Adams
2008-01-08  2:12           ` Luc Teirlinck
2008-01-09  0:54             ` Juri Linkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87wsjhgzrh.fsf@jurta.org \
    --to=juri@jurta.org \
    --cc=emacs-devel@gnu.org \
    --cc=lennart.borgman@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.