Emacs запрос-замена с текстовым преобразованием - PullRequest
9 голосов
/ 12 сентября 2008

Я хочу найти любой текст в файле, который соответствует регулярному выражению в форме t [A-Z] u (то есть совпадение t , за которым следует заглавная буква и другое совпадение u , и преобразуйте сопоставленный текст таким образом, чтобы заглавная буква была строчной. Например, для регулярного выражения x[A-Z]y

xAy

становится

xay

и

xZy

становится

xzy

Функция Emacs 'query-replace допускает обратные ссылки, но AFAIK не преобразование сопоставленного текста. Есть ли встроенная функция, которая делает это? У кого-нибудь есть короткая функция Elisp, которую я мог бы использовать?

UPDATE

@ У Марселя Леви есть это: \, в выражении замены вводит (произвольно?) Выражение Elisp. Например, решение вышеупомянутого -

M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase \1)z

Ответы [ 3 ]

13 голосов
/ 12 сентября 2008

Похоже, Стив Йегге фактически уже опубликовал ответ на этот вопрос несколько лет назад: "Блестящий и новый: Emacs 22". Прокрутите вниз до "Изменение регистра в строках замены". "и вы увидите его пример кода с использованием функции replace-regexp.

Общий ответ заключается в том, что вы используете "\" для вызова любого выражения lisp как части строки замены, как в \,(capitalize \1). Читая текст справки, похоже, что он работает только в интерактивном режиме, но это единственное место, где это было бы наиболее необходимо.

1 голос
/ 16 сентября 2008

Альтернативой qrr в этом случае является запись макроса и его воспроизведение. (isearch-forward-regexp, выберите символ, downcase-region.) Я считаю, что макросы на лету легче, поскольку вы получаете немедленную обратную связь, если ваше регулярное выражение неверно.

0 голосов
/ 16 сентября 2008

Я бы сделал это и с макросом, но только потому, что выполнение кода из строки замены для регулярного выражения для меня не очень понятно. Если вы пишете пакетный скрипт или что-то, что должно выполняться очень быстро, \, это, безусловно, путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...