Я хочу найти в файле любой текст, который соответствует регулярному выражению в форме т[A-Z]ты (т. Е. Соответствие т, за которым следует заглавная буква, и другое совпадение ты, и преобразовать совпавший текст так, чтобы заглавная буква была строчной. регулярное выражение x[A-Z]y
xAy
становится
xay
и
xZy
становится
xzy
Функция query-replace в Emacs допускает обратные ссылки, но, AFAIK, не преобразование совпадающего текста. Есть ли встроенная функция для этого? Есть ли у кого-нибудь короткая функция Elisp, которую я мог бы использовать?
ОБНОВИТЬ
У @Marcel Levy это есть: \, в выражении замены вводит (произвольное?) Выражение Elisp. Например, решение вышеизложенного:
M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase )z





Похоже, что Стив Егге на самом деле уже опубликовал ответ на этот вопрос несколько лет назад: "Shiny and New: Emacs 22." Прокрутите вниз до «Изменение регистра в заменяемых строках», и вы увидите его пример кода с использованием функции replace-regexp.
Общий ответ заключается в том, что вы используете "\" для вызова любого выражения lisp как части строки замены, как в \,(capitalize ). Читая текст справки, кажется, что это только в интерактивном режиме, но кажется, что это единственное место, где это будет наиболее необходимо.
Альтернативой qrr в этом случае является запись макроса и его воспроизведение. (isearch-forward-regexp, выберите символ, downcase-region.) Я считаю, что макросы «на лету» проще, так как вы сразу получаете обратную связь, если ваше регулярное выражение неверно.
Я бы сделал это и с макросом, но только потому, что выполнение кода из строки замены для регулярного выражения для меня очень неинтуитивно. Если вы пишете пакетный сценарий или что-то, что должно выполняться очень быстро, \, безусловно, ваш путь.