Поиск и замена
Если вы хотите найти все совпадения для регулярного выражения в части буфера и заменить их, наиболее гибкий способ — написать явный цикл, используя re-search-forward и replace-match, как показано ниже:
(while (re-search-forward "foo[ \t]+bar" nil t) (replace-match "foobar"))
См. Замена совпавшего текста для описания replace-match.
Возможно, удобнее ограничить замены определённой областью. Функция replace-regexp-in-region делает именно это.
- Функция: replace-regexp-in-region regexp replacement &optional start end
-
Эта функция заменяет все вхождения regexp на replacement в области текста буфера между start и end; start по умолчанию — позиция точки, а end — последняя доступная позиция буфера. Поиск regexp регистрозависимый, а replacement вставляется без изменения регистра букв. Строка replacement может использовать те же специальные элементы, начинающиеся с ‘\’, что и
replace-matchделает. Функция возвращает количество заменённых вхождений илиnil, если regexp не найден. Функция сохраняет позицию точки.(replace-regexp-in-region "foo[ \t]+bar" "foobar")
- Функция: replace-string-in-region string replacement &optional start end
Эта функция работает аналогично
replace-regexp-in-region, но ищет и заменяет литеральные строки string вместо регулярных выражений.
Emacs также имеет специальные функции для замены совпадений в строке.
- Функция: replace-regexp-in-string regexp rep string &optional fixedcase literal subexp start
-
Эта функция копирует string и ищет в нём совпадения для regexp, и заменяет их на rep. Она возвращает изменённую копию. Если start не
nil, поиск совпадений начинается в этой позиции в string, и возвращаемое значение не включает первые start символов string. Чтобы получить всю преобразованную строку, нужно конкатенировать первые start символов string с возвращаемым значением.Эта функция использует
replace-matchдля замены, и передаёт необязательные аргументы fixedcase, literal и subexp вreplace-match.Вместо строки, rep может быть функцией. В этом случае,
replace-regexp-in-stringвызывает rep для каждого совпадения, передавая текст совпадения в качестве единственного аргумента. Она собирает возвращаемое значение rep и передаёт егоreplace-matchв качестве строки замены. Данные совпадения на этом этапе являются результатом сопоставления regexp с подстрокой string.
- Функция: string-replace from-string to-string in-string
Эта функция заменяет все вхождения from-string на to-string в in-string и возвращает результат. Она может вернуть один из своих аргументов без изменений, константу или новую строку. Регистр учитывается, а свойства текста игнорируются.
Если вы хотите написать команду по образцу query-replace, вы можете использовать perform-replace для выполнения работы.
- Функция: perform-replace from-string replacements query-flag regexp-flag delimited-flag &optional repeat-count map start end backward region-noncontiguous-p
-
Эта функция является ядром
query-replaceи связанных команд. Она ищет вхождения from-string в тексте между позициями start и end и заменяет некоторые или все из них. Если start являетсяnil(или опущено), используется точка, а для end используется последняя доступная часть буфера. (Если необязательный аргумент backward неnil, поиск начинается с end и идёт назад.)Если query-flag
nil, она заменяет все вхождения; в противном случае она спрашивает пользователя, что делать с каждым из них.Если regexp-flag не
nil, тогда from-string рассматривается как регулярное выражение; в противном случае оно должно соответствовать буквально. Если delimited-flag неnil, то рассматриваются только замены, окружённые границами слов.Аргумент replacements определяет, чем заменять вхождения. Если это строка, используется эта строка. Это также может быть список строк, которые используются циклически.
Если replacements является списком,
(function . data), это означает вызов function после каждого совпадения для получения строки замены. Эта функция вызывается с двумя аргументами: data и число выполненных замен.Если repeat-count не
nil, это должно быть целое число. Тогда это указывает, сколько раз использовать каждую строку в списке replacements перед циклическим переходом к следующей.Если from-string содержит прописные буквы, тогда
perform-replaceсвязываетcase-fold-searchсnil, и она использует replacements без изменения регистра.Обычно, макрос
query-replace-mapопределяет возможные ответы пользователя для запросов. Аргумент map, если неnil, указывает используемый вместоquery-replace-mapмакрос.Не-
nilregion-noncontiguous-p означает, что область между start и end состоит из несмежных фрагментов. Самый распространённый пример — прямоугольная область, где фрагменты разделены символами новой строки.Эта функция использует одну из двух функций для поиска следующего вхождения from-string. Эти функции задаются значениями двух переменных:
replace-re-search-functionиreplace-search-function. Первая вызывается, когда аргумент regexp-flag неnil, вторая — когда онnil.
- Переменная: query-replace-map
-
Эта переменная хранит специальный макрос, который определяет допустимые ответы пользователя для
perform-replaceи команд, которые его используют, а такжеy-or-n-pиmap-y-or-n-p. Этот макрос необычен по двум причинам:- Связки с клавишами — не команды, а символы, имеющие смысл для функций, использующих этот макрос.
- Префиксные клавиши не поддерживаются; каждая связка с клавишей должна соответствовать однократной последовательности нажатий. Это потому, что функции не используют
read-key-sequenceдля получения ввода; вместо этого они читают одно событие и ищут его «вручную».
Вот значимые связки для query-replace-map. Несколько из них имеют смысл только для query-replace и аналогичных функций.
act-
Выполнить рассматриваемое действие — другими словами, «да».
skip-
Не выполнять действие для этого вопроса — другими словами, «нет».
exit-
Ответьте на этот вопрос «нет» и откажитесь от всего ряда вопросов, предположив, что ответы будут «нет».
exit-prefix-
Как
exit, но добавьте нажатую клавишу кunread-command-events(см. Дополнительные сведения о вводе событий). act-and-exit-
Ответьте на этот вопрос «да» и откажитесь от всего ряда вопросов, предположив, что последующие ответы будут «нет».
act-and-show-
Ответьте на этот вопрос «да», но покажите результаты — не переходите к следующему вопросу сразу.
automatic-
Ответьте на этот и все последующие вопросы в ряду «да», без дальнейшего взаимодействия с пользователем.
backup-
Вернуться к предыдущему месту, где был задан вопрос.
undo-
Отменить последнюю замену и перейти к месту, где была выполнена эта замена.
undo-all-
Отменить все замены и вернуться к месту, где была выполнена первая замена.
edit-
Ввести рекурсивный режим редактирования для обработки этого вопроса — вместо любого другого действия, которое обычно выполнялось бы.
edit-replacement-
Редактировать замену для этого вопроса в минибуфере.
delete-and-edit-
Удалить рассматриваемый текст, а затем ввести рекурсивный режим редактирования для его замены.
recenterscroll-upscroll-downscroll-other-windowscroll-other-window-down-
Выполнить указанную операцию прокрутки окна, а затем задать тот же вопрос снова. Только
y-or-n-pи связанные с ним функции используют этот ответ. quit-
Немедленно выйти. Только
y-or-n-pи связанные с ним функции используют этот ответ. helpПоказать некоторую справку, а затем задать вопрос снова.
- Переменная: multi-query-replace-map
-
Эта переменная хранит макрос, который расширяет
query-replace-map, предоставляя дополнительные связки с клавишами, которые полезны при замене в нескольких буферах. Дополнительные связки:automatic-all-
Ответьте на этот и все последующие вопросы в ряду «да», без дальнейшего взаимодействия с пользователем, для всех оставшихся буферов.
exit-currentОтветьте на этот вопрос «нет» и откажитесь от всего ряда вопросов для текущего буфера. Перейдите к следующему буферу в последовательности.
- Переменная: replace-search-function
Эта переменная определяет функцию, которую
perform-replaceвызывает для поиска следующей строки для замены. Её значение по умолчанию —search-forward. Любое другое значение должно называть функцию с 3 аргументами: первые 3 аргументаsearch-forward(см. Поиск строк).
- Переменная: replace-re-search-function
Эта переменная определяет функцию, которую
perform-replaceвызывает для поиска следующего регулярного выражения для замены. Её значение по умолчанию —re-search-forward. Любое другое значение должно называть функцию с 3 аргументами: первые 3 аргументаre-search-forward(см. Поиск регулярных выражений).
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Search-and-Replace.html