Vi: предок
Пред. | Глава 4. Редактирование текста: Emacs и VI | След.

Vi: предок

Аннотация

Vi был первым из существующих полноэкранных редакторов. Это одна из основных программ, подвергающаяся нападкам со стороны противников UNIX®, в же время являющаяся одним из лучших аргументов его защитников: хотя Vi довольно сложен в изучении, он становится чрезвычайно мощным инструментом, когда человек набирается опыта в его использовании. При помощи нескольких нажатий клавиш пользователь Vi может "свернуть горы", и кроме Emacs немногие текстовые редакторы могут похвастаться тем же.

На самом деле версия, поставляемая с Mandrakelinux - это Vim (от VI iMproved), но в этой главе мы будем называть его Vi.

Если вы хотите более подробно изучить Vi, вы можете взглянуть на этот документы: Hands-On Introduction to the Vi Editor или Vim home page.

Режим вставки, командный режим, режим ex...

Чтобы начать изучение Vi, мы используем тот же набор команд, что и для Emacs. Поэтому давайте вернемся к нашим двум файлам и наберем:

$ vi file1 file2

На этом этапе вы обнаружите перед глазами окно, наподобие этого:

Рисунок 4.4. Исходная позиция в VIM

Сейчас вы находитесь в т.н. командном режиме с первым открытым файлом на экране. В этом режиме вы не можете вставить текст в файл. Для этого вы должны переключиться в режим вставки.

Вот несколько клавиатурных команд для вставки текста:

a и i: для вставки текста после курсора и перед ним (A и I вставляют текст в конце или начале текущей строки);

o и O: для вставки текста под текущей строкой и над ней.

В режиме вставки вы увидите строку --INSERT-- в нижней части экрана (так вы определяете, в каком режиме вы находитесь). Это единственный режим, который позволит вам вставить текст. Для возврата в командный режим, нажмите клавишу Esc.

В режиме вставки вы можете использовать клавиши Backspace и DEL для удаления текста по мере необходмости. Клавиши со стрелками позволят вам перемещаться по тексту в командном режиме и режиме вставки. В командном режиме имеются также и другие комбинации клавиш, которые мы рассмотрим позже.

Переключение в режим ex осуществляется путём нажатия в командном режиме клавиши :. В нижней левой части экрана появится : с курсором. Все, что вы введете до нажатия на клавишу Enter, Vi будет интерпретировать как команду ex. Если вы удалите введенную вами команду и сам символ :, вы будете возвращены в командный режим, а курсор вернется на исходную позицию в тексте.

Для сохранения изменений в файле, введите в командном режиме :w. Если вы хотите сохранить содержимое буфера в другой файл, введите :w <имя_файла>.

Обработка буферов

Для перемещения в одном и том же буфере между файлами, чьи имена были указаны в командной строке, введите :next для перехода к следующему файлу и :prev для перехода к предыдущему файлу. Вы также можете воспользоваться командой :e <имя_файла>, которая позволяет вам либо перейти к нужному файлу, если он уже открыт, либо открыть другой файл. Также вы можете использовать завершение имен файлов.

Также как и в Emacs, у вас на экране может быть несколько буферов. Для этого воспользуйтесь командой :split.

Чтобы сменить буфер, введите Ctrl+w j для перехода в нижний буфер, или Ctrl+w k для перехода в верхний буфер. Вы также можете использовать клавиши со стрелками вверх и вниз вместо j или k. Команда :close скрывает буфер, а команда :q его закрывает.

Вам следует знать, что если вы попытаетесь скрыть или закрыть буфер без сохранения сделанных изменений, команда не будет выполнена, а Vi выведет этого сообщение:

No write since last change (use! to override) (После последнего изменения не была выполнена запись (используйте ! для перекрытия))

В этом случае сделайте, как было сказано выше, и наберите :q! или :close!.

Редактирование текста и команды перемещения

В Vi кроме клавиш режима редактирования Backspace и DEL имеется много других команд для удаления, копирования, вставки и замены текста в командном режиме. Все приведенные ниже команды по сути делятся на две части: выполняемое действие и его эффект. Действиями могут быть:

c: заменить (Change). Редактор удаляет запрошенный текст и после выполнения этой команды возвращается в режим вставки.

d: удалить (Delete).

y: скопировать (Yank). Мы рассмотрим его в следующем разделе.

.: повторить последнее действие.

Эффект определяет группу символов, для которой применяется команда.

h, j, k, l: один символ слева, внизу, вверху и справа соответственно.[11]

e, b, w: конец, начало текущего слова и начало следующего слова соответственно.

^, 0, $: первый непустой символ, начало и конец текущей строки соответственно.

f<x>: следующий найденный символ <x>. Например, fe переместит курсор к следующему найденному символу e.

/<строка>, ?<строка>: следующая и предыдущая найденная строка или регулярное выражение <строка>. Например, /lafox перемещает курсор к следующему слову lafox.

{, }: начало и конец текущего параграфа соответственно.

G, H: конец файла, начало экрана.

Каждому из этих «эффективных» символов или каждой из команд перемещения может предшествовать номер повторения. Для команды G («Go») он означает номер строки в файле. Основываясь на этой информации, вы можете создавать любые варианты комбинаций.

Вот несколько примеров:

6b: переход на 6 слов назад;

c8fk: удаление всего текста до восьмого найденного символа k, а затем переход в режим вставки;

91G: переход на 91-ю строку файла;

d3$: удаление до конца текущей строки плюс следующие две строки.

Хотя многие из этих команд не очень наглядны, наилучшим способом для их запоминания будет практика. Однако, как видите, выражение «свернуть горы несколькими клавишами» не так уж и преувеличено.

Вырезание, копирование, вставка

В Vi имеется команда, которую мы уже видели при копировании текста - это команда y. Для вырезания текста используйте команду d. Для хранения текста выделяется 27 ячеек памяти или буферов: анонимная память и 26 ячеек с именами в виде букв алфавита в нижнем регистре.

Для использования анонимной ячейки памяти введите команду «как есть». Так, команда y12w скопирует в анонимную память 12 слов после курсора[12]. Используйте d12w, если вы хотите вырезать эту область.

Чтобы воспользоваться одной из 26 именованных ячеек памяти, введите перед командой последовательность "<x>, где <x> определяет имя ячейки памяти. Следовательно, чтобы скопировать те же самые 12 слов в ячейку памяти k, вы должны будете набрать "ky12w, или "kd12w, чтобы вырезать их.

Чтобы вставить содержимое анонимной памяти, используйте команды p или P (от слова Paste) для вставки текста после или до курсора соответственно. Чтобы вставить содержимое именованной ячейки памяти, таким же образом используйте "<x>p или "<x>P (например, "dp вставит после курсора содержимое ячейки памяти d).

Давайте рассмотрим пример:

Рисунок 4.5. VIM, перед копированием текстового блока

Чтобы выполнить это действие, мы:

повторно скопируем первые 6 слов предложения в ячейку памяти r (для примера): "ry6w[13];

перейдем в буфер file2, который находится снизу: Ctrl+w j;

вставим перед курсором содержимое ячейки памяти r: "rp.

Мы получили ожидаемый результат, как показано на Рисунок 4.6, «VIM, после копирования текстового блока».

Рисунок 4.6. VIM, после копирования текстового блока

Поиск текста очень прост: просто введите в командном режиме /, искомую строку и нажмите клавишу Enter. Например, /kyiv будет искать строку kyiv от текущей позиции курсора. Нажатие на n переместит вас к следующему найденному совпадению, а если вы достигните конца файла, снова поиск начнется с начала файла. Для поиска в обратном направлении вместо / используйте ?.

Выход из Vi

Команда для выхода - :q (на самом деле, как мы уже видели, она закрывает активный буфер, но если это единственный открытый буфер, вы завершите работу Vi). Имеется сокращенная клавиатурная команда, т.к. в большинстве случаев вы редактируете только один файл. Поэтому для выхода вы воспользуетесь:

:wq для сохранения изменений и выхода (более быстрым решением будет ZZ), или

:q! для выхода без сохранения.

Вам следует обратить внимание на то, что если у вас открыто несколько буферов, то :wq запишет и закроет только активный буфер.

[11] Сокращенная клавиатурная команда для dl (удаление одного символа справа) - x; сокращенная клавиатурная команда для dh - X; dd удаляет текущую строку.

[12] Но только, если курсор находится в начале первого слова!

[13] В буквальном смысле y6w означает: «Вырезать 6 слов».

Пред. | Уровень выше | След.
Emacs | Начало | Заключительное слово...