Компания ALT Linux
Опубликован: 14.12.2004 | Доступ: свободный | Студентов: 12603 / 1647 | Оценка: 4.19 / 3.84 | Длительность: 18:18:00
ISBN: 978-5-9556-0019-1
Лекция 15:

Текстовый редактор Vi

< Лекция 14 || Лекция 15: 12345 || Лекция 16 >

Перемещение по тексту

Команд в командном режиме немало – почти все буквы и множество сочетаний вида Ctrl+буква. Даже для перемещения влево, вниз, вверх и вправо на одну позицию зарезервированы буквы hjkl. Это, конечно же, на случай, если клавиши-стрелки у терминала отсутствуют или выдают невесть что. Клавиши h и l означают соответственно "влево" и "вправо" (вместо них можно использовать привычные Backspace и пробел), клавишу j можно рассматривать как крючок вниз; тогда k не нуждается в объяснениях. В vi очень много команд перемещения по тексту. Перемещение – это смена точки редактирования, которая чаще всего привязана к какому-нибудь элементу структуры текста: следующее слово, предложение, парная скобка и т. п. Управляемая командой машина может отыскать следующий структурный элемент куда лучше человека, которому свойственно ошибаться.

Например, перемещение по словам – w (word, переход на начало следующего слова), b ( b ack word, на начало предыдущего слова) и e (end, на конец текущего слова) – стоит доверить vi. Словами в этом случае считаются цепочки букв, цифр и знаков " _ " (похоже на определение идентификатора в языке Си). Прописные W, B и E считают словами цепочки любых неразделителей (похоже на определение параметра в shell). Перемещать курсор можно по предложениям (команды " ) " и " ( "). Предложения заканчиваются соответствующим знаком препинания и разделителем после него. Перемещение по абзацам – команды " } " и " { "(абзацы разделяются пустой строкой; именно пустой: строка, содержащая одни только пробелы или табуляции, не подходит).

Поиск шаблона в тексте – тоже команда перемещения. Задать шаблон и поискать его можно с помощью команды " / ". Для ввода шаблона vi использует командную строку, чтобы пользователю было видно, что он набирает. Шаблон – это, конечно, регулярное выражение, но можно выключить настройку magic ( :set nomagic ), тогда любой символ в шаблоне будет считаться обычным. Vi ищет вперед по тексту ; если шаблон не найден, выводится сообщение и поиск продолжается с начала файла. Поиск назад по тексту задается командой " ?". Повторный поиск того же самого шаблона в ту же сторону – команда n ( n ext), а поиск того же шаблона в другую сторону N.

Любая команда vi может иметь множитель. Множитель – это число, которое пользователь набирает в командном режиме непосредственно перед командой, и в результате команда выполняется указанное число раз. Число это не отображается на экране: подобно имени команды, множитель – это часть уже решенной пользователем мини-задачи редактирования; ее внешний вид имеет значение только для редактора, пользователя же интересует результат. Например, команда 10x удалит десять символов справа от курсора, а команда 7+ переместит курсор на семь строк вперед (" + " и " - " – команды перемещения на начало следующей или предыдущей строки). Команда G ( G o) без множителя – переход на последнюю строку файла (незаменима при дописывании текста ), а для перехода, допустим, на строку с номером 33 используется команда 33G.

В любом случае пользователь волен экспериментировать с одной командой, как ему заблагорассудится: даже в самой ортодоксальной версии vi есть команда uu ndo. Всякий может ошибиться: вместо 10 набрать 100, вместо z – x или неправильно составить шаблон для поиска с заменой. Если получившийся измененный текст не нравится – надо вернуть его в предыдущее состояние. Отменить можно только одно – последнее – действие с текстом. Если соблюдать некоторую внутреннюю дисциплину и не совершать необдуманных действий, одного уровня должно быть достаточно. В vim – современной версии vi, обладающей массой дополнительных возможностей, все-таки встроили бесконечный undo. На наш взгляд, это компромисс между дополнительным удобством и строгой дисциплиной.

Гнездовые команды

Основные команды редактирования viгнездовые. Гнездовая команда в самом простом виде состоит из действия и команды перемещения. В этом случае команда перемещения не изменяет положения курсора, а определяет фрагмент текста, к которому vi применит действие. Например, операция dw ( d elete w ord) состоит из действия d ( d elete) и команды w, в результате удалится одно слово. Другая гнездовая командаc ( c hange) – аналогична d ; единственное отличие – после выполнения c редактор переходит в режим вставки. Это очень важная команда vi, потому что с ее помощью можно исключить одно неудобство, свойственное практически всем текстовым редакторам с упрощенной концепцией управления.

Дело в том, что в типичном текстовом редакторе есть два режима ввода текставставка и замена. И в ситуации, когда одно слово надо заменить другим, пользователь должен или сначала удалить это слово (десять раз нажать клавишу Del ), а затем в режиме вставки вписать новое слово. Другой вариант – начать вписывать слово в режиме замены, а когда новое станет длиннее старого, переключиться в режим вставки. И в том и в другом случае человек вынужден все время контролировать себя: не удалил или не заменил ли он лишнего. А в редакторе vi для замены слова на что угодно подается команда cw ( c hange w ord), и оказывается, что самую неинтересную работу редактор уже за вас сделал и уже включил режим вставки ; остается только творческая часть – придумать, на что заменять удаленное. Обычный vi поставит (временно) в конце заменяемой области символ $ и при наборе текст до $ будет "заменяться" (на самом деле этот текст уже удален, просто vi до поры не убирает его с экрана терминала), а после – вставляться. В vim такое свойство можно включить одним из значений настройки cpoptions, но по умолчанию он сразу удаляет заменяемый участок текста.

Перемещением в гнездовой команде может быть не только w, а любая команда перемещения. Например, довольно удобны команды вида c/шаблон (изменить текст от курсора до найденного шаблона) или d100G (удалить строки от текущей до сотой). Между прочим, аббревиативность команд vi позволяет читать их полные имена: например, предыдущая команда читается delete 100 Go, а какая-нибудь c7w – change 7 words.

Остроумна гнездовая команда " !". После команды перемещения она спросит в командной строке имя утилиты–фильтра (напомним, что фильтр в UNIX – это программа, которая читает со стандартного ввода и пишет на стандартный вывод). Строки, определяемые командой перемещения, vi передаст этой утилите и результат подставит вместо них. Так что отсортировать все строки до конца файла проще простого: достаточно ввести команду !Gsort. Есть гнездовые команды > и <, которые сдвигают группу строк на один стандартный шаг ( vi -настройка shiftwidth ).

< Лекция 14 || Лекция 15: 12345 || Лекция 16 >
Max Akt
Max Akt

Я прохожу курс "Операционная система Unix" и после тестов, вижу в отчете, что этот тест сдало еще 25 человек. Почему так мало, это ведь реально хороший и полезный урок. Здесь естьи теория и практичесские материалы. Сам курс написан хорошо, живым языком. И здесь я получил ответы на вопросы по Linux, которые боялся спросить. Наверное это из-за того, что в названии курса написано не Linux, а Unix и это многих отпугивает.

Andranik Avakian
Andranik Avakian

41. УК РФ и Комментарии (ст. 273)

М. 2000 г. Издательство: ALT Linux, Институт Логики

Уголовный Кодекс РФ и комментарии к нему?

По ссылке открывается сайт документации Linux, раздел Linux Installation and Getting Started