help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How can I enter query-replace in GNU Emacs using a repeatable funct


From: bolega
Subject: Re: How can I enter query-replace in GNU Emacs using a repeatable function based on values in the line currently at point. - Super User
Date: Wed, 08 Dec 2010 15:15:40 -0000
User-agent: G2/1.0

On Jun 21, 9:18 am, Tim Visher <tim.vis...@gmail.com> wrote:
> On Mon, Jun 21, 2010 at 11:00 AM, Tim Landscheidt
>
>
>
> <t...@tim-landscheidt.de> wrote:
> > Tim Visher <tim.vis...@gmail.com> wrote:
>
> >> I'd like to take the following data and query-replace occurences of
> >> each word identifier with the corresponding numeric identifier using
> >> some sort of repeatable function.
>
> >>     -1 ACT/CNS
> >>     -2 AG NFC
> >>     -3 AID
> >>     -4 BBG
> >>     -5 BIA
> >>     -6 BLM
> >>     -7 BOC
> >>     -8 BPD
> >>     -9 CCC
> >>     -10 CDC
> >>     -11 Census
>
> >> In other words, with point at
>
> >>     -1 ACT/CNS
> >>     ^
>
> >> I'd like to be able to hit a key and launch into the following command
>
> >>     query-replace RET ACT/CNS RET -1 RET
> >> [...]
>
> > From my experience, the easiest way to do that is to copy
> > the lines to a temporary buffer, hack up a small lisplet:
>
> > | (dolist (line '(("-1"  "ACT/CNS")
> > |                 ("-2"  "AG NFC")
> > |                 ("-3"  "AID")
> > |                 ("-4"  "BBG")
> > |                 ("-5"  "BIA")
> > |                 ("-6"  "BLM")
> > |                 ("-7"  "BOC")
> > |                 ("-8"  "BPD")
> > |                 ("-9"  "CCC")
> > |                 ("-10" "CDC")
> > |                 ("-11" "Census")))
> > |   (query-replace (car line) (cdr line) nil (point-min) (point-max)))
>
> > and then evaluate that in the original buffer with M-x :.
>
> >  While it is possible to create a proper "one-key command"
> > as you intended, chances are that it is very cumbersome and
> > that you will have to change it soon afterwards when your
> > requirements shift just a little bit. Directly programming
> > in Emacs Lisp is much easier and more flexible.
>
> > Tim
>
> That worked perfectly. Thanks, Tim.
>
> --
>
> In Christ,
>

Its new for me so I write the documentation here

(defmacro dolist (spec &rest body)
  "(dolist (VAR LIST [RESULT]) BODY...): loop over a list.
Evaluate BODY with VAR bound to each `car' from LIST, in turn.
Then evaluate RESULT to get return value, default nil."
  (let ((temp (gensym "--dolist-temp--")))
    (list 'block nil
          (list* 'let (list (list temp (nth 1 spec)) (car spec))
                 (list* 'while temp (list 'setq (car spec) (list 'car temp))
                        (append body (list (list 'setq temp
                                                 (list 'cdr temp)))))
                 (if (cdr (cdr spec))
                     (cons (list 'setq (car spec) nil) (cdr (cdr spec)))
                   '(nil))))))


I think the readability and rememberability would be improved by
writing it as

(dolist
 (foreach
  '( ("" "")
     ("" "")
     ("" "")))
  (save-excursion (replace-string (car foreach) (cdr foreach))))

Bolega




reply via email to

[Prev in Thread] Current Thread [Next in Thread]