Как уже говорилось, редактор vi тесно связан с редактором ex, являясь по сути одним из режимов работы последнего. Поэтому ряд мощных команд, реализованных в ex, можно и полезно выполнять и из редактора vi.
Для выхода из vi в ex надо нажать клавишу (esc) для перехода в командный режим, если вы были в режиме текста, а затем нажать клавишу [:] (двоеточие). Будет напечатана подсказка редактора ex - двоеточие, приглашающая вводить команды редактора ex.
Поскольку ex - строчный редактор, вводится понятие номера строки и понятие текущей строки. Все строки текста занумерованы натуральными числами, начиная с единицы. Знак $ (доллар) означает номер последней строки текста.
Просмотр части текста на экране выполняется командой, состоящей из одного (для просмотра одной строки) или пары номеров - номера первой и номера последней строки части текста и символа P (print), который по умолчанию может быть опущен. Например:
: 1,5p program (input, output) ...... ...... : или просто :1,5
Для просмотра всего текста надо ввести:
: 1, $
Чтобы напечатать строки вместе с их номерами, надо в конце команды просмотра поставить знак # (диез), например:
: 6, $# 6 include <stdio.h> 7 ....... 8 ....... .........
Следует помнить, что нумерация строк относительна. При удалении одной строки все строки перенумеруются. После выполнения команды просмотра текущей строкой становится последняя просмотренная строка.
Команда глобального поиска начинается префиксом g (для глобального поиска по всему тексту) и печатает все строки, содержащие предъявляемый образец, например:
: g/speed; int speed; d = speed x time; output (speed).
Образец может быть любой частью текста и запоминается в специальном буфере искомого образца, отличном от буфера всего текста. Если префикс g не указан, ищется и печатается первая найденная строка, начиная от текущей:
: /speed; int speed.
Подстановка образца текста выполняется командой s (substitute), в которой указывается искомый образец и заменяющий образец, например:
: s/eed/ace/ int space;
Эта команда выполняет замену первого вхождения искомого образца в текущей строке.
Для замены всех вхождений в строке надо добавить флаг g (global - глобальный) в конце команды:
: s/wine/water/g water = water + shugar
Чтобы выполнить подстановки в нескольких строках, надо добавить префикс адресации или поиска строк по образцу. Например:
: 1,10s/wine/water/g
или
: 1, $s/wine/water/g
Примеры поиска по образцу:
: g/speed/s/eed/ace/g
или
: g/speed/s//space/g.
В последнем случае искомый образец берется из буфера искомого образца.
Возможен интерактивный режим выполнения глобальной команды подстановки, при котором редактор для каждой найденной строки перед выполнением подстановки требует подтверждения ее необходимости в форме ввода буквы y (yes). Для интерактивной формы в команде требуется использовать ключ c (confirmation):
: g/eed/s//ace/gc
int speed;
^^^ y
real need;
^^^
d = speed x time;
^^^ y
output (speed);
^^^ y
Здесь три замены произведутся, а одна - нет.
Отмена последней подстановки выполняется командой u (undo). Реализация команды u выполняется обратной подстановкой, поэтому повторная подача команды отменяет первую команду u.
Редактируемый файл находится в буфере редактирования. Чтение содержимого другого файла в буфер редактирования после указанной или текущей строки можно выполнить командой r, например:
0r preface.
Здесь содержимое файла чтения помещается в начале буфера редактирования (после несуществующей нулевой строки). В качестве файла чтения может быть файл стандартного вывода команды, например (пробел перед ! обязателен):
: r !date : 1, $p ---------- Fr Jan 12 09:33 PST 1986
Запись буфера редактирования или его части в указанный файл можно выполнить командой w, например:
: w newfile
или
: w >> oldfile
(добавление в существующий файл).
Попытка записи буфера в уже существующий файл сопровождается предупреждением и приглашением повторить команды с восклицательным знаком:
: w! oldfile
Если имя опущено, подразумевается редактируемый файл.
Пример записи части буфера редактирования:
: 1, 100w !lpr.
Здесь роль файла записи играет стандартный вывод команды (пробел перед знаком ! обязателен).
Если редактор был вызван для редактирования нескольких файлов, например:
$ vi .*,
или
$ ex *.c,
то переход к редактированию следующего файла выполняется командой n (next):
: n
Командой e (edit) можно вызвать на редактирование произвольный файл, указанный именем
: e another
Если в момент подачи команд n или e буфер редактирования предыдущего файла не был записан, выдается предупреждение, которое можно обойти, форсировав выполнение команд подачей восклицательного знака : n! и : e! соответственно.
Для этого используется префикс ! (восклицательный знак), например:
: !cc % ,
где % - ссылка на имя текущего редактируемого файла.
Два восклицательных знака:
: !!
повторяют предыдущую команду.
Выполняется командой vi, которой может предшествовать номер строки, высвечиваемой в начале экрана, например:
: 10 vi
В режиме vi доступны все средства редактора. Выход из режима vi выполняется подачей команды Q (большое).
Выход из редактора ex в режим команд системы выполняется командой q, например:
: q
Если буфер редактирования не был записан или еще не все файлы отредактированы, выдается предупреждение, которое можно обойти, подавая q с восклицательным знаком:
: q!
Команду выхода можно для удобства комбинировать с командой записи, например:
: wq
или
: wq!
если есть препятствия для записи или выхода.