2009-03-24 13 views
44

Ogni tanto un po 'voglio sostituire tutte le istanze di valori come:Emacs: espressione regolare sostituzione di cambiare caso

<BarFoo> 

con

<barfoo> 

cioè non un'espressione regolare sostituzione di tutte le cose parentesi angolari all'interno con il suo equivalente minuscolo.

Qualcuno ha un bel frammento di Lisp che fa questo? È lecito ritenere che si tratti solo di valori ASCII. Punti bonus per tutto ciò che è abbastanza generico da assumere un'espressione regolare completa e non si limita a gestire l'esempio delle parentesi angolari. Ancora più punti bonus per una risposta che utilizza solo M-x query-replace-regexp.

Grazie,

Dom

risposta

64

Prova M-x query-replace-regexp con "<\([^>]+\)>" come la stringa di ricerca e "<\,(downcase \1)>" come la sostituzione.

Questo dovrebbe funzionare per Emacs 22 e versioni successive, vedere questo Steve Yegge blog post per ulteriori dettagli su come le espressioni Lisp possono essere utilizzate nella stringa di sostituzione.

Per le versioni precedenti di Emacs si potrebbe provare qualcosa di simile:

(defun tags-to-lower-case() 
    (interactive) 
    (save-excursion 
    (goto-char (point-min)) 
    (while (re-search-forward "<[^>]+>" nil t) 
     (replace-match (downcase (match-string 0)) t)))) 
+6

Che figata! Non ero a conoscenza di \,() nelle espressioni regolari di Emacs. – emk

+1

Mi viene visualizzato l'errore "Uso non valido di' \ 'nel testo sostitutivo " –

+1

Regexp deve essere" <\\([^>] + \\)> "e la sostituzione non funziona come previsto se la stringa di ricerca corrisponde al tag in maiuscolo. –