Spec-Zone.ru › Elisp

Поиск и замена

Если вы хотите найти все совпадения для регулярного выражения в части буфера и заменить их, наиболее гибкий способ — написать явный цикл, используя 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 макрос.

Не-nil region-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

Удалить рассматриваемый текст, а затем ввести рекурсивный режим редактирования для его замены.

recenter
scroll-up
scroll-down
scroll-other-window
scroll-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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API