Vi: предок

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

В действительности с Mandrake Linux поставляется vim VI iMproved (VI улучшенный), но в этом разделе мы будем называть его Vi .

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

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

$ vi file1 file2

Вы увидите следующее Рисунок 4.4. Начальная позиция в VIM.

Рисунок 4.4. Начальная позиция в VIM

Начальная позиция в VIM

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

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

  • o или O: чтобы вставлять текст соответственно ниже и выше текущей линии.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • d: для удаления (Delete (удалить));

  • y: для копирования (Yank), мы рассмотрим это в следующем разделе.

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

Эффект определяет то, с какой группой символов работает команда. Вот команды эффекта, соответствующие перемещениям, которые вводятся в командном режиме:

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

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

  • ^, 0, $: к следующему не пустому символу текущей строки, в начало текущей строки, в конец текущей строки;

  • f<x>: к следующему появлению символа <x>; например, fe перенесет курсор к следующему встречающемуся символу e;

  • /<string>, ?<string>: к следующему совпадению строки или регулярного выражения (regexp) <string>, и то же самое назад в файле; например, /foobar перемещает курсор пока не появится следующее слово foobar;

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

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

К каждому из этих символов эффекта или командам перемещения можно добавлять номер повторения. Для G это ссылается на номер в файле. На этой основе вы можете создавать все варианты комбинаций.

Несколько примеров:

  • 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, перед копированием текстового блока.

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

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

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

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

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

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

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

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

VIM, после того, как скопирован текстовый блок

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

Выход из Vi

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

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

  • :q! выйти без сохранения.

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



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

[12] ... если курсор стоит в начале первого слова!

[13] y6w дословно обозначает: “ Выдернуть (Yank) 6 слов ”.