Запрос-замена Emacs с текстовым преобразованием
Вопрос
Я хочу найти в файле любой текст, соответствующий регулярному выражению формы т[A-Z]
ты (т. е. совпадение т за которым следует заглавная буква и еще одно совпадение ты, и преобразуйте совпавший текст так, чтобы заглавная буква была строчной.Например, для регулярного выражения x[A-Z]y
xAy
становится
xay
и
xZy
становится
xzy
Emacs' query-replace
функция допускает обратные ссылки, но AFAIK не позволяет преобразовать совпадающий текст.Есть ли встроенная функция, которая это делает?Есть ли у кого-нибудь короткая функция Elisp, которую я мог бы использовать?
ОБНОВЛЯТЬ
У @Marcel Levy есть это: \,
в выражении замены вводится (произвольное?) выражение Elisp.Например, решение вышеизложенного:
M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase \1)z
Решение
Это выглядит как Стив Йегге на самом деле уже опубликовал ответ на этот вопрос несколько лет назад: «Блестящий и новый:Эмакс 22». Прокрутите вниз до раздела «Изменение регистра в строках замены», и вы увидите его пример кода с использованием replace-regexp
функция.
Общий ответ заключается в том, что вы используете «\» для вызова любого выражения Лиспа как части строки замены, как в \,(capitalize \1)
.Читая текст справки, кажется, что он доступен только в интерактивном режиме, но кажется, что это единственное место, где это будет наиболее необходимо.
Другие советы
Альтернативой qrr в этом случае является запись макроса и его воспроизведение.(isearch-forward-regexp, выберите символ, нижний регистр-регион.) Мне проще находить макросы на лету, так как вы немедленно получаете обратную связь, если ваше регулярное выражение неверно.
Я бы сделал это и с помощью макроса, но только потому, что выполнение кода из строки замены регулярного выражения мне очень неинтуитивно.Если вы пишете пакетный скрипт или что-то, что должно выполняться очень быстро, \ — это, безусловно, лучший вариант.