12. СРЕДСТВА РЕДАКТОРА EX, ДОПОЛНЯЮЩИЕ ВОЗМОЖНОСТИ РЕДАКТОРА VI

Как уже говорилось, редактор vi тесно связан с редактором

ex, являясь по сути одним из режимов работы последнего. Поэ-

тому ряд мощных команд, реализованных в ex, можно и полезно

выполнять и из редактора vi.

 

12.1. Выход из vi в ex

Для выхода из vi в ex надо нажать клавишу (esc) для пере-

хода в командный режим, если вы были в режиме текста, а за-

тем нажать клавишу [:] (двоеточие). Будет напечатана подс-

казка редактора ex - двоеточие, приглашающая вводить команды

редактора ex.

 

12.2. Просмотр строк текста

Поскольку ex - строчный редактор, вводится понятие номера

строки и понятие текущей строки. Все строки текста занумеро-

ваны натуральными числами, начиная с единицы. Знак $ (дол-

лар) означает номер последней строки текста.

Просмотр части текста на экране выполняется командой,

состоящей из одного (для просмотра одной строки) или пары

номеров - номера первой и номера последней строки части

текста и символа P (print), который по умолчанию может быть

опущен. Например:

 

 

- 108 -

: 1,5p

program (input, output)

......

......

:

или просто :1,5

Для просмотра всего текста надо ввести:

: 1, $

Чтобы напечатать строки вместе с их номерами, надо в кон-

це команды просмотра поставить знак # (диез), например:

: 6, $#

6 include <stdio.h>

7 .......

8 .......

.........

Следует помнить, что нумерация строк относительна. При

удалении одной строки все строки перенумеруются. После вы-

полнения команды просмотра текущей строкой становится пос-

ледняя просмотренная строка.

12.3. Поиск строк по образцу текста

Команда глобального поиска начинается префиксом g (для

глобального поиска по всему тексту) и печатает все строки,

содержащие предъявляемый образец, например:

: g/speed;

int speed;

d = speed x time;

output (speed).

 

 

- 109 -

Образец может быть любой частью текста и запоминается в

специальном буфере искомого образца, отличном от буфера все-

го текста. Если префикс g не указан, ищется и печатается

первая найденная строка, начиная от текущей:

: /speed;

int speed.

 

12.4. Подстановка образца текста

Подстановка образца текста выполняется командой 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

 

 

- 110 -

или

: 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

Здесь три замены произведутся, а одна - нет.

 

12.5. Отмена последней подстановки

Отмена последней подстановки выполняется командой u

(undo). Реализация команды u выполняется обратной подстанов-

кой, поэтому повторная подача команды отменяет первую коман-

ду u.

 

 

- 111 -

 

12.6. Чтение и запись файлов в буфере редактирования

Редактируемый файл находится в буфере редактирования.

Чтение содержимого другого файла в буфер редактирования пос-

ле указанной или текущей строки можно выполнить командой r,

например:

0r preface.

Здесь содержимое файла чтения помещается в начале буфера

редактирования (после несуществующей нулевой строки). В ка-

честве файла чтения может быть файл стандартного вывода ко-

манды, например (пробел перед ! обязателен):

: r !date

: 1, $p

----------

Fr Jan 12 09:33 PST 1986

Запись буфера редактирования или его части в указанный

файл можно выполнить командой w, например:

: w newfile

или

: w >> oldfile

(добавление в существующий файл).

Попытка записи буфера в уже существующий файл сопровожда-

ется предупреждением и приглашением повторить команды с

восклицательным знаком:

: w! oldfile

Если имя опущено, подразумевается редактируемый файл.

 

 

- 112 -

Пример записи части буфера редактирования:

: 1, 100w !lpr.

Здесь роль файла записи играет стандартный вывод команды

(пробел перед знаком ! обязателен).

 

12.7. Вызов на редактирование следующего или нового файла

Если редактор был вызван для редактирования нескольких

файлов, например:

$ vi .*,

или

$ ex *.c,

то переход к редактированию следующего файла выполняется ко-

мандой n (next):

: n

Командой e (edit) можно вызвать на редактирование произ-

вольный файл, указанный именем

: e another

Если в момент подачи команд n или e буфер редактирования

предыдущего файла не был записан, выдается предупреждение,

которое можно обойти, форсировав выполнение команд подачей

восклицательного знака : n! и : e! соответственно.

 

12.8. Выполнение команды системы внутри редактора ex

Для этого используется префикс ! (восклицательный знак),

например:

: !cc % ,

 

 

- 113 -

где % - ссылка на имя текущего редактируемого файла.

Два восклицательных знака:

: !!

повторяют предыдущую команду.

 

12.9. Переход в режим редактора vi

Выполняется командой vi, которой может предшествовать но-

мер строки, высвечиваемой в начале экрана, например:

: 10 vi

В режиме vi доступны все средства редактора. Выход из ре-

жима vi выполняется подачей команды Q (большое).

 

12.10. Выход из редактора ex

Выход из редактора ex в режим команд системы выполняется

командой q, например:

: q

Если буфер редактирования не был записан или еще не все

файлы отредактированы, выдается предупреждение, которое мож-

но обойти, подавая q с восклицательным знаком:

: q!

Команду выхода можно для удобства комбинировать с коман-

дой записи, например:

: wq

или

: wq!

если есть препятствия для записи или выхода.