2009-03-24 13 views
44

Raz na jakiś czas chcę zastąpić wszystkie wystąpienia wartości jak:Emacs: wyrażenie regularne zastąpienie aby zmienić wielkość

<BarFoo> 

z

<barfoo> 

czyli nie wyrażenie regularne zastąpienie wszystkich rzeczy wewnętrzne nawiasy kątowe z ich odpowiednikami w kształcie małych liter.

Ktoś ma ładny fragment Lispa, który to robi? Można bezpiecznie założyć, że mamy do czynienia tylko z wartościami ASCII. Punkty premiowe za wszystko, co jest na tyle ogólne, aby uzyskać pełne wyrażenie regularne, i nie zajmuje się tylko przykładem nawiasów ostrych. Jeszcze więcej punktów do odpowiedzi, która po prostu używa M-x query-replace-regexp.

Dzięki,

Dom

Odpowiedz

64

Spróbuj M-x query-replace-regexp z "<\([^>]+\)>" jako ciąg wyszukiwania i "<\,(downcase \1)>" jako zamiennik.

Powinno to działać w przypadku Emacsa 22 i nowszych, patrz: Steve Yegge blog post, aby uzyskać więcej informacji o tym, w jaki sposób można używać wyrażeń Lisp w ciągu zastępczym.

dla wcześniejszych wersji Emacs można spróbować coś takiego:

(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

To cool! Nie byłem świadomy \,() w wyrażeniach regularnych Emacs. – emk

+1

Powoduje to błąd "Niepoprawne użycie' \ "w tekście zastępującym" –

+1

Regexp powinien być "<\\([^>] + \\)>", a zamiennik nie działa zgodnie z oczekiwaniami, jeśli szukany ciąg pasuje do znacznika we wszystkich literach. –

Powiązane problemy