Поиск и замена – ЧАСТЬ 1

Как и в других редакторах, в Emacs есть команды для поиска случаев появления какойнибудь строки. Основная команда поиска необычна тем, что она является наращиваемой; она начинает поиск до того, как вы закончили набор строки поиска. Существуют также команды и для ненаращиваемого поиска, более похожие на аналогичные команды в других редакторах.

Кроме обычной команды replace-string, которая находит все случаи появления одной строки и заменяет  их другой, Emacs имеет более  сложную команду замены, названную query-replace, которая запрашивает в интерактивном режиме, в каких случаях надо произвести замену.

12.1  Наращиваемый поиск

Наращиваемый поиск начинается, как только вы набрали первый знак строки поиска. По мере того, как вы набираете строку поиска, Emacs показывает  вам, где эта строка (в том виде, в каком вы ее уже набрали) может быть найдена. Когда вы набрали достаточно знаков, чтобы определить желаемое место, вы можете остановиться. В зависимости от того, что вы собираетесь делать потом, вам может понадобиться, а может и не понадобиться прекратить поиск явно с помощью hRETi.

C-s             Наращиваемый поиск вперед (isearch-forward).

C-r             Наращиваемый поиск в обратном направлении (isearch-backward).

C-s начинает наращиваемый поиск. C-s считывает знаки с клавиатуры и располагает курсор в первом месте появления  знаков, которые вы набрали. Если вы наберете C-s и затем F, то курсор встанет справа после первой найденной ‘F’. Наберите О, и увидите, что курсор встал за первой найденной ‘FO’.  После еще одной О курсор встанет за первой ‘FOO’, находящейся за местом, с которого вы начали поиск. На каждом шаге текст буфера, совпадающий со строкой поиска, подсвечивается, если терминал может это сделать; текущая строка поиска обновляется на каждом шаге в эхо-области.

Если вы сделали ошибку в наборе строки поиска, то вы можете сбросить знаки с помощью hDELi.  Каждый  hDELi  отменяет последний знак строки поиска. Этого не происходит до тех пор, пока Emacs не будет готов считать следующий вводимый знак; сначала знак, который вы хотите сбросить, должен быть либо найден, либо нет. Если же вы не хотите ждать, пока это произойдет, используйте C-g так, как описано ниже.

Когда  вы будете удовлетворены  достигнутым местом, вы можете  набрать hRETi,  что остановит поиск, оставляя курсор там, куда его поместила команда поиска. Любая команда, не имеющая специального значения при поиске,  также  останавливает поиск и затем выполняется сама. Таким образом, набор C-a привел бы к выходу из поиска и затем передвинул бы курсор в начало строки. hRETi  необходим только в том случае, если следующая команда, которую вы хотите набрать, является печатным знаком, hDELi, hRETi  или другим управляющим знаком, имеющим особое значение  во время работы поиска (C-q, C-w, C-r, C-s, C-y, M-y, M-r или M-s).

Иногда вы ищете слово ‘FOO’ и находите его, но это не то, что вам нужно. Было второе

‘FOO’,  о котором вы забыли, находящееся перед тем, которое вы ищете.   В этом случае наберите C-s еще раз, чтобы продвинуться к следующему появлению строки поиска. Это можно проделывать неограниченное число раз. Если вы проскочили, то можете отменить некоторые число знаков C-s с помощью hDELi.

После выхода из поиска вы можете  снова искать ту же  самую строку, просто набрав C-s C-s: первый C-s — это ключ, который запускает наращиваемый поиск, а второй C-s означает “повтор поиска”.

Чтобы вы могли снова использовать  более ранние строки поиска, существует список поиска. Команды M-p и M-n передвигают по списку, чтобы вы могли подобрать нужную строку для повторного поиска. Эти команды оставляют выбранную строку поиска в минибуфере, где вы можете ее отредактировать. Для завершения редактирования  и начала поиска наберите C-s или C-r.

Если ваша строка вообще не найдена, то эхо-область говорит ‘Failing I-Search’. Курсор располагается  после того  места, где  Emacs нашел из вашей строки всё, что  смог. Таким образом, если вы ищете ‘FOOT’, а такой строки нет, вы можете увидеть курсор после

‘FOO’ в слове ‘FOOL’. С этого места вы можете сделать несколько вещей. Если ваша строка неправильно набрана, вы можете что-то стереть из нее и исправить. Если вы довольны найденным местом, вы можете  набрать hRETi  или любую другую команду Emacs, чтобы “принять то, что предложил этот поиск”, или вы можете набрать C-g, что уничтожит  из строки поиска знаки, которые не были найдены (‘Т’ в ‘FOOT’),  оставляя те,  что нашлись (‘FOO’  в ‘FOOT’).   Второй C-g в этом месте отменяет поиск полностью, возвращая точку туда, где она была, когда поиск начался.

Если строка поиска содержит заглавную букву, то поиск производится с учетом регистра. Если вы удалите заглавные буквы из строки поиска, эта особенность исчезает. См. Раздел 12.6 [Поиск и регистр], с. 95.

Если поиск был неудачным  и вы просите  повторить его, набирая C-s еще раз, то он начинается снова с начала буфера. Повторение неудачного поиска в обратном направлении при помощи команды C-r  начинает новый поиск с конца.  Такой поиск называется круговым.  Как  только это произошло, в подсказке поиска появляется  слово ‘Wrapped’. Если вы пройдете  через точку,  где начался поиск, это слово заменяется на ‘Overwrapped’, что означает, что вы снова проходите через уже виденные вами совпадения.

Знак “выхода” C-g поступает во время поиска особым образом.  Что именно он делает, зависит от статуса поиска. Если поиск нашел то, что вы хотели, и ожидает ввода, то C-g полностью отменяет поиск.  Курсор возвращается туда, откуда вы начали поиск.  Если C-g набирается, когда в строке поиска есть ненайденные знаки — Emacs все еще ищет их, или он не смог их найти — тогда эти ненайденные знаки сбрасываются из строки поиска. Сброс этих знаков делает поиск успешным, и он ждет дальнейшего ввода, таким образом, второй C-g отменит поиск полностью.

Чтобы найти символ перевода строки, введите C-j.  Для поиска другого управляющего знака, такого как control-S или возврат каретки, вы должны отменить их специальное значение, набирая перед ними C-q. Эта функция C-q аналогична ее назначению  как команды для вставки (см.  Раздел 4.1 [Вставка текста], с. 35): она заставляет трактовать следующий знак так, как в этом контексте трактовался бы любой “обычный” знак.  Вы также можете задать знак по его восьмиричному коду: введите C-q и затем последовательность восьмиричных цифр.

Вы можете изменить направление поиска на обратное при помощи C-r.  Вам следует поступить так, если поиск оказался неудачным, потому что место, с которого вы его начали, находилось слишком близко к концу файла. Повторение C-r продолжает поиск следующих случаев появления в обратном порядке, а C-s начинает поиск опять вперед. C-r в поиске может быть отменена при помощи hDELi.

Если вы заранее знаете, что вам нужно вести поиск в обратном порядке, то чтобы начать поиск, вы можете использовать C-r вместо C-s, так как C-r также является ключом, запускающим команду (isearch-backward) для поиска в обратном порядке. Обратный поиск находит совпадения, которые расположены  перед начальной точкой, так же как поиск вперед находит совпадения, начинающиеся  после точки, где поиск начался.

Знаки C-y и C-w могут использоваться в наращиваемом поиске для захвата текста из буфера в строку поиска. Это делает удобным поиск другого случая появления того текста, который находится в точке.  C-w копирует слово после точки в строку поиска, продвигая точку вперед через это слово. Следующая команда C-s для повторения поиска будет затем

искать строку, включающую это слово. C-y подобна C-w, только копирует в строку поиска весь остаток текущей строки.  И C-y, и C-w преобразуют копируемый текст к нижнему регистру, если поиск сейчас ведется без учета регистра; таким образом поиск остается регистронезависимым.

Команда M-y копирует в строку поиска текст из списка уничтожений. Она использует тот же текст, который был бы восстановлен командой C-y. См. Раздел 9.2 [Восстановление], с. 71.

Когда вы выходите из наращиваемого поиска, метка устанавливается в то место, где точка была до начала поиска. Это удобно для возврата к этому месту. В режиме Transient Mark наращиваемый поиск устанавливает метку, не активизируя ее,  если только метка уже не активна.

Чтобы настроить специальные знаки, которые понимает наращиваемый поиск, измените  их привязки в таблице ключей isearch-mode-map.  Для получения перечня привязок посмотрите документацию на isearch-mode с помощью C-h f isearch-mode hRETi.

12.1.1  Наращиваемый поиск  на медленном  терминале

Наращиваемый поиск на медленных терминалах использует модифицированный способ отображения, который разработан так, чтобы занимать как можно меньше времени. Вместо показа буфера в каждом месте, до которого добрался  поиск, он создает новое окно, состоящее из одиночной строки, и использует его для показа найденной строки. Это окно из одной строки вступает в игру, как только точка выходит за пределы текста, который уже находится на экране.

Когда вы прерываете поиск, однострочное окно убирается. Только в этот момент Emacs перерисовывает окно, в котором производился поиск, чтобы отобразить новое положение точки.

Такой стиль отображения используется, когда скорость терминала в бодах меньше или равна значению переменной search-slow-speed, чье начальное значение равно 1200.

Количество строк,  показываемых при поиске  на медленном  терминале,  управляется переменной search-slow-window-lines. Ее обычное значение равно единице.

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий