2009-03-24 12 views
44

Chaque fois que dans un certain temps, je veux remplacer toutes les occurrences de valeurs telles que:Emacs: expression régulière remplacement pour changer la casse

<BarFoo> 

avec

<barfoo> 

-à-dire ne une expression régulière remplacer de toutes choses équerres intérieures avec son équivalent en minuscules.

Quelqu'un at-il un bon extrait de Lisp qui le fait? Il est prudent de supposer que nous ne traitons que des valeurs ASCII. Des points bonus pour tout ce qui est assez générique pour prendre une expression régulière complète, et ne gère pas seulement l'exemple des crochets. Encore plus de points bonus à une réponse qui utilise juste M-x query-replace-regexp.

Merci,

Dom

Répondre

64

Essayez avec M-x query-replace-regexp"<\([^>]+\)>" comme la chaîne de recherche et "<\,(downcase \1)>" comme le remplacement. Emacs 22 et versions ultérieures, voir Steve Yegge blog post pour plus de détails sur la façon dont les expressions Lisp peuvent être utilisées dans la chaîne de remplacement.

Pour les versions antérieures d'Emacs, vous pouvez essayer quelque chose comme ceci:

(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

C'est cool! Je n'étais pas au courant de \,() dans les expressions régulières d'Emacs. – emk

+1

Cela m'obtient l'erreur "Utilisation invalide de \" dans le texte de remplacement " –

+1

Regexp devrait être" <\\([^>] + \\)> "et le remplacement ne fonctionne pas comme prévu si la chaîne de recherche correspond à balise en majuscules. –

Questions connexes