unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: David Kastrup <dak@gnu.org>
Subject: Re: multiple search strings in query-replace-regexp
Date: Sat, 07 Oct 2006 10:40:39 +0200	[thread overview]
Message-ID: <8564ewy0vs.fsf@lola.goethe.zz> (raw)
In-Reply-To: 8764ewpme3.fsf@trick.ulm.malte.spiess

Malte Spiess <i1tnews@arcor.de> writes:

> David Kastrup <dak@gnu.org> writes:
>
>> "Florian Kaufmann" <sensorflo@gmail.com> writes:
>>
>>> that works only for multiple searches at once, but not for multiple
>>> search-replace at once.
>>>
>>> replace all foo by bar
>>> replace all rock by house
>>> replace all metal by goa
>>>
>>> :-) and so on
>>
>> With Emacs 22:
>>
>> C-M-% \(foo\)\|\(rock\)\|metal RET
>> \,(cond (\1 "bar") (\2 "house") ("goa")) RET
>
> Doesn't work with Emacs 21.4.1 :-(...

Emacs 22 is about to enter pretest (I'd guess within a week), so there
is little reason not to join the testers if one would like the
features.

> Looks pretty impressive though!
> Does \, cause to execute lisp stuff?

Yes.  The doc string spells this out, but the manual is a bit more
verbose:

   The remainder of this subsection is intended for specialized tasks
and requires knowledge of Lisp.  Most readers can skip it.

   You can use Lisp expressions to calculate parts of the replacement
string.  To do this, write `\,' followed by the expression in the
replacement string.  Each replacement calculates the value of the
expression and converts it to text without quoting (if it's a string,
this means using the string's contents), and uses it in the replacement
string in place of the expression itself.  If the expression is a
symbol, one space in the replacement string after the symbol name goes
with the symbol name, so the value replaces them both.

   Inside such an expression, you can use some special sequences.  `\&'
and `\N' refer here, as usual, to the entire match as a string, and to
a submatch as a string.  N may be multiple digits, and the value of
`\N' is `nil' if subexpression N did not match.  You can also use `\#&'
and `\#N' to refer to those matches as numbers (this is valid when the
match or submatch has the form of a numeral).  `\#' here too stands for
the number of already-completed replacements.

   Repeating our example to exchange `x' and `y', we can thus do it
also this way:

     M-x replace-regexp <RET> \(x\)\|y <RET>
     \,(if \1 "y" "x") <RET>

   For computing replacement strings for `\,', the `format' function is
often useful (*note Formatting Strings: (elisp)Formatting Strings.).
For example, to add consecutively numbered strings like `ABC00042' to
columns 73 to 80 (unless they are already occupied), you can use

     M-x replace-regexp <RET> ^.\{0,72\}$ <RET>
     \,(format "%-72sABC%05d" \& \#) <RET>


> Btw: Shouldn't
>
> C-M-% \(foo\|rock\)\|metal RET
> \,(cond (\1 "bar") (\1 "house") ("goa")) RET
>
> work, too?

No.  It would replace either "foo" or "rock" with "bar", and "metal"
with "goa".

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

  reply	other threads:[~2006-10-07  8:40 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-10-06 11:17 multiple search strings in query-replace-regexp Florian Kaufmann
2006-10-06 11:27 ` Malte Spiess
2006-10-06 11:41   ` Florian Kaufmann
2006-10-06 11:51     ` David Kastrup
2006-10-06 21:45       ` Ilya Zakharevich
2006-10-06 22:01         ` David Kastrup
2006-10-07  3:45           ` Ilya Zakharevich
     [not found]           ` <200610070345.k973jLj2011358@powdermilk.math.berkeley.edu>
2006-10-07  7:41             ` David Kastrup
2006-10-07  8:57               ` Ilya Zakharevich
2006-10-07  9:11                 ` David Kastrup
2006-10-07 22:04                   ` Ilya Zakharevich
2006-10-08 13:47                     ` Mathias Dahl
2006-10-08 20:55                       ` Kim F. Storm
     [not found]                       ` <mailman.7905.1160340972.9609.help-gnu-emacs@gnu.org>
2006-10-12 15:44                         ` Mathias Dahl
2006-10-09  6:07                     ` Stefan Monnier
2006-10-09 21:53                       ` Ilya Zakharevich
2006-10-09 22:21                         ` David Kastrup
2006-10-10  3:39                           ` Ilya Zakharevich
2006-11-23 19:23                         ` Stefan Monnier
2006-10-07  8:20       ` Malte Spiess
2006-10-07  8:40         ` David Kastrup [this message]
2006-10-06 12:41 ` Peter Dyballa
     [not found] ` <mailman.7806.1160138473.9609.help-gnu-emacs@gnu.org>
2006-10-06 14:14   ` Florian Kaufmann
2006-10-06 15:14     ` David Kastrup
2006-10-06 15:29       ` Florian Kaufmann
2006-10-06 15:47         ` David Kastrup

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

  List information: https://www.gnu.org/software/emacs/

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

  git send-email \
    --in-reply-to=8564ewy0vs.fsf@lola.goethe.zz \
    --to=dak@gnu.org \
    /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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).