Emacs query-sostituire con testuali trasformazione
Domanda
Voglio trovare il testo in un file che corrisponde a una espressione della forma t[A-Z]
u (cioè, una partita t seguita da una lettera maiuscola e un altro match u, e trasformare il testo corrispondente, in modo che la lettera maiuscola è in minuscolo.Per esempio, per l'espressione regolare x[A-Z]y
xAy
diventa
xay
e
xZy
diventa
xzy
Emacs' query-replace
la funzione consente di back-riferimenti, ma, per quanto ne so non la trasformazione del testo corrispondente.C'è una funzione built-in che fa questo?Qualcuno ha una breve Elisp funzione potrei usare?
AGGIORNAMENTO
@Marcel Levy ha: \,
in una espressione di sostituzione introduce un (arbitrario?) Elisp espressione.E. g., la soluzione di cui sopra è
M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase \1)z
Soluzione
Sembra Steve Yegge in realtà già postato la risposta a questo un paio di anni fa: "Lucido e Nuovo:Emacs 22." Scorrere fino a "Modifica Caso in Stringhe di Sostituzione" e vedrai il codice di esempio utilizzando il replace-regexp
funzione.
La risposta generale è che è possibile utilizzare"\", per chiamare qualsiasi lisp espressione come parte della stringa di sostituzione, come in \,(capitalize \1)
.La lettura di un testo di aiuto, sembra che solo in modalità interattiva, ma che sembra l'unico posto in cui sarebbe più necessario.
Altri suggerimenti
Un'alternativa al qrr in questo caso è la registrazione di una macro e la riproduzione.(isearch-avanti-regexp, selezionare il carattere, downcase-regione). Trovo al volo macro più facile, dal momento che si ottiene un feedback immediato se la tua regexp è sbagliato.
Mi piacerebbe farlo con una macro, ma solo perché l'esecuzione di codice all'interno di una stringa di sostituzione di un'espressione regolare è molto intuitivo per me.Se si sta scrivendo un batch script o qualcosa che ha bisogno di andare molto veloce, \, è sicuramente la strada da percorrere.