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/
next prev parent 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.