Работа с редактором vi

════Текстовым редактором (text editor) называют программу, которая предназначена для редактирования (составления и изменения) файлов, содержащих только текст, например: письмо, программа на языке C, системный конфигурационный файл. При том, что имеется много различных редакторов для системы Linux, единственный, чьё присутствие будет гарантировано в любой системе UNIX или Linux═ — это vi (visual editor). Редактор vi не является самым простым в использовании, и его интерфейс не очень понятен сам по себе. Однако ввиду своей распространённости, а отчасти и потому, что владение им в некоторых ситуациях необходимо, ему посвящается внимание в этой книге.

═══ Выбор текстового редактора обычно является вопросом индивидуального вкуса. Многие пользователи предпочитают пышный, мощный и наделённый подсказками редактор emacs. Этот редактор имеет больше функций, чем любая другая программа в мире UNIX. К примеру, в редакторе emacs имеется собственный встроенный диалект языка программирования LISP. Кроме того, у этого редактора имеется множество расширений (одно из них═ — программа искусственного интеллекта типа программы Eliza). Однако, поскольку сам редактор и файлы, которые его поддерживают, сравнительно велики, этот редактор может не быть установлен на некоторых системах. Напротив, редактор vi является небольшим и мощным, однако использовать его сложнее. Тем не менее, при знакомстве с редактором vi он в действительности оказывается очень простым.

В этом разделе даётся лишь введение в vi═ — мы будем обсуждать не все его функции, а лишь нужные для того, чтобы начать работать в нем. Дополнительную информацию можно получить из экранной документации к команде vi.

Основные понятия

В любой момент при работе в редакторе vi вы находитесь в одном из трёх режимов редактора: командный режим (command mode), режим ввода (insert mode) и режим последней строки (last line mode).

══ При запуске редактора vi вы оказываетесь в командном режиме. В этом режиме можно давать команды для редактирования файлов или перейти в другой режим. Например, вводя x в командном режиме мы удаляем символ, на который указывает курсор. Клавиши-стрелки перемещают курсор по редактируемому файлу. Как правило, команды, используемые в командном режиме, состоят из одного или двух символов.

════ Основной ввод и редактирование текста осуществляется в режиме ввода. При использовании редактора vi основное время, скорее всего, будет проводиться именно в этом режиме. Переход в режим ввода из командного режима осуществляется командой i (от слова insert). Находясь в режиме ввода, можно вводить текст в то место, куда указывает курсор. Выход из режима ввода в командный режим осуществляется клавишей Esc.

══Режим последней строки═ — это специальный режим, в котором редактору даются сложные команды. При вводе этих команд они отображаются в последней строке экрана (отсюда пошло название режима). Например, если ввести в командном режиме команду :, то осуществится переход в режим последней строки, и можно будет вводить такие команды, как wq (записать файл и покинуть редактор vi) или q! (выйти из редактора vi без сохранения изменений). В режиме последней строки обычно вводятся команды, название которых состоит из нескольких символов. В этом режиме в последнюю строку вводится команда, после чего нажимается клавиша Enter, и команда исполняется.

Запуск редактора vi

Наилучшим способом уяснить для себя все концепции редактора vi будет запустить его и отредактировать в нем некоторый файл. В приводимых ниже «экранчиках» будет показано всего несколько строк текста, как будто текстовый экран имеет по высоте всего 6 строк вместо 24. Синтаксис редактора vi таков:

vi filename

где filename — имя файла, который надо редактировать.

Запустим редактор vi и создадим новый файл по имени test командой

/home/larry# vi test

На экране будет примерно следующая картинка:

_
~ 
~ 
~ 
~ 
~ 
"test" [New file]

Колонка символов ~ обозначает пустые строки, иначе говоря, указывает, что мы находимся в конце файла. Символ _ обозначает курсор.

Ввод текста

Редактор vi сейчас находится в командном режиме. Нажмём клавишу i, и редактор перейдёт в режим ввода текста. Теперь вводим, например, следующий текст:

Now is the time for all good men to come to the meeting.
~ 
~ 
~ 
~ 
~

Введите любое количество строк, после каждой нажимая клавишу Enter. Исправлять опечатки можно с помощью клавиши Backspace. Для выхода из режима ввода и возвращения в командный режим нажмём клавишу Esc.

В командном режиме для движения по файлу можно использовать клавиши-стрелки. Если в файле всего одна строка, то при попытке нажать клавишу со стрелкой вверх либо вниз редактор, возможно, будет подавать звуковой сигнал.

Помимо команды i, есть ещё несколько способов вставить текст. Так, команда a начинает вставлять текст после текущего положения курсора, а не прямо в текущую. Например, приведём с помощью клавиш-стрелок курсор к пробелу, разделяющему слова good и men:

 Now is the time for all good men to come to the meeting. 
~ 
~ 
~ 
~ 
~

Нажмём теперь клавишу a (редактор перейдёт в режим ввода) и введём wo, после чего нажмём клавишу Esc и вернёмся в командный режим. На экране будет следующее:

Now is the time for all good women to come to the meeting. 
~ 
~ 
~ 
~ 
~

Для того, чтобы начать вводить текст со следующей строки, используем команду o. Нажмём эту клавишу и введём одну-две строки текста:

Now is the time for all good women to come to the meeting.
Afterwards, we'll go out for pizza and beer.
~ 
~ 
~ 
~

Удаление текста

В командном режиме нажатие клавиши x удаляет символ, на который указывает курсор. Если нажать клавишу x пять раз, то на экране останется:

Now is the time for all good women to come to the meeting.
Afterwards, we'll go out for pizza and
~ 
~ 
~ 
~

Теперь нажмём клавишу a и введём некоторый текст, после чего опять нажмём клавишу Esc:

Now is the time for all good women to come to the meeting.
Afterwards, we'll go out for pizza and Diet Coke.
~ 
~ 
~ 
~

Можно удалять целые строки командой dd (т. е. нажав клавишу d два раза подряд). Если курсор стоит на второй строке, и вы введёте команду dd, на экране останется следующее:

Now is the time for all good women to come to the meeting. 
~ 
~ 
~ 
~ 
~

Для того, чтобы удалить слово, на которое показывает курсор, можно использовать команду dw. Подведите курсор к слову good и введите dw. Результат будет следующим:

Now is the time for all women to come to the meeting. 
~ 
~ 
~ 
~ 
~

Изменение текста

══ Отдельные части текста можно заменять на другие; для этого используется команда R. Подведите курсор к первому символу в слове meeting, нажмите клавишу R и введите слово session.

Now is the time for all women to come to the session.
~
~
~
~

Действие команды R напоминает действие команд i и a, однако при команде R новый текст не вставляется, а стирает старый.

Команда r заменяет один символ, а именно тот, на который указывает курсор. Например, подведём курсор к началу слова Now, введём команду r и за ней букву C. На экране возникнет следующее:

Cow is the time for all women to come to the session.
~
~
~
~ 

С помощью команды ~ можно поменять регистр буквы, на которую указывает курсор (с верхнего на нижний и наоборот). Например, если подвести курсор к букве o в слове Cow и нажимать клавишу ~, то в конце концов возникнет:

COW IS THE TIME FOR ALL WOMEN TO COME TO THE SESSION.

Команды для движения курсора

══ Вы уже знаете, что передвигаться по экрану (и по документу) можно с помощью клавиш-стрелок. В дополнение можно для движения курсора использовать клавиши h, j, k и l. Они будут сдвигать курсор соответственно влево, вниз, вверх и вправо. Этими командами можно воспользоваться, если (по какой-нибудь причине) клавиши-стрелки действуют неправильно. Команда w перемещает курсор на начало следующего слова; команда b перемещает курсор на начало предыдущего слова.

Команда 0 (клавиша ноль) перемещает курсор на начало текущей строки, а команда $ перемещает курсор в её конец.

При редактировании больших файлов вам, возможно, захочется «перелистывать» целые экраны вперёд (т. е. вниз) и назад (вверх); для этого используются команды соответственно Ctrl-F и Ctrl-B.

Для того, чтобы переместить курсор в конец файла, используется команда G. Можно также поместить курсор на строку с данным номером; например, команда 10G поместит курсор на строку с номером 10. Для того, чтобы переместить курсор в начало файла, можно использовать команду 1G.

Команды движения курсора можно совмещать с другими командами, например, с командами удаления текста. Например, команда d$ удалит все, что находится между текущим положением курсора и концом строки; команда dG удалит все, что находится между текущим положением курсора и концом файла и т. д.

Сохранение изменений и выход из редактора vi

══════ Для выхода из редактора vi без сохранения изменений, сделанных в файле, используется команда :q!. Когда вводится команда :, курсор переходит на последнюю строку экрана, и таким образом редактор оказывается в режиме последней строки:

COW IS THE TIME FOR ALL WOMEN TO COME TO THE SESSION. 
~
~
~
:_

В этом режиме возможно вводить некоторые расширенные команды. Одна из них — команда q!, которой завершается работа с редактором vi без сохранения сделанных изменений. Команда :wq сначала сохраняет файл со сделанными изменениями, а затем выходит из редактора vi. Команда ZZ (выданная в командном режиме, т. е. без введения команды :) эквивалентна команде :wq. Если файл со времени последней модификации не изменялся, то время создания файла также не будет изменено. Напомним, что в режиме последней строки введение команды завершается клавишей Enter.

Чтобы сохранить файл, но не выходить из редактора vi, используется команда :w.

Переключение между файлами

══ Для того, чтобы приступить к редактированию другого файла, используется команда :e. Например, чтобы прекратить редактирование файла test и вместо этого начать редактирование файла foo, надо ввести команду

COW IS THE TIME FOR ALL WOMEN TO COME TO THE SESSION. 
~
~
~
:e foo_

Если команда :e будет введена без предварительного сохранения файла на диск, будет выдано сообщение об ошибке:

No write since last change (":edit!" overrides)

Это сообщение означает, что после последней модификации не было сохранения файла, и редактор vi отказывается приступить к редактированию другого файла. Сейчас можно либо сохранить сделанные изменения командой :w и затем вводить команду :e, либо использовать команду

COW IS THE TIME FOR ALL WOMEN TO COME TO THE SESSION. 
~
~
~
:e! foo_

Символ ! в последней команде сообщает редактору, что вы действительно хотите приступить к редактированию другого файла, не сохраняя изменения в прежнем.

Вставка содержимого других файлов

══ Включить в текущий файл содержимое другого файла можно командой :r. Например, команда

:r foo.txt

вставит содержимое файла foo.txt в текст начиная с текущего положения курсора.

Запуск команд оболочки

══ Из редактора vi можно выполнять команды оболочки. Команда :r! работает аналогично команде :r, но вместо содержимого другого файла она вставляет в редактируемый файл выдачу некоторой команды. Например, введя команду

:r! ls -F

мы получим следующее:

COW IS THE TIME FOR ALL WOMEN TO COME TO THE SESSION. 
letters/
misc/ 
papers/ 

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

:! ls -F

то команда ls -F будет исполнена, её результат будет выдан на экран, но выдача вставлена в файл не будет. Если используется команда

:shell

то редактор vi запускает сеанс (instance) командной оболочки, прерывая редактирование на время исполнения команд. Для выхода из оболочки и возвращения к редактированию надо ввести команду exit.

Помощь в работе с редактором vi

Как и в случае с любой программой в системе Linux в первую очередь следует обратиться к экранной документации к программе vi. Следует знать также, что редактор vi является пользовательским интерфейсом редактора ex, который выполняет многие из команд режима последней строки редактора vi. Поэтому, в дополнение к сказанному выше, можно также читать экранную документацию к редактору ex. Обычно (кроме режимов восстановления после системных сбоев) вам доступна более современная и улучшенная версия vi — vim, который имеет аналогичный vi интерфейс, поддерживает все команды vi и кроме того — массу дополнительных возможностей. Подробное руководство по vim можно получить, запустив этот редактор и отдав команду :help.