Запрос-замена Emacs с текстовым преобразованием

StackOverflow https://stackoverflow.com/questions/57751

  •  09-06-2019
  •  | 
  •  

Вопрос

Я хочу найти в файле любой текст, соответствующий регулярному выражению формы т[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, выберите символ, нижний регистр-регион.) Мне проще находить макросы на лету, так как вы немедленно получаете обратную связь, если ваше регулярное выражение неверно.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top