3.2 Редактирование текстовых файлов в vi (Editing Text Files in vi)¶
При первом запуске vi вы сразу заметите, что его интерфейс сильно отличается от того, к чему вы привыкли в других текстовых редакторах. Для знакомства с vi мы рассмотрим следующие темы:
- Открытие файлов в
vi - Режимы
vi - Работа в режиме вставки
- Работа в режиме командной строки
- Работа в командном режиме
Открытие файлов в vi¶
Чтобы открыть файл из приглашения командной строки оболочки для редактирования в vi, введите vi имя_файла. Например, предположим, что в домашнем каталоге пользователя есть файл myfile.txt. Если файл находится в текущем каталоге, достаточно ввести vi myfile.txt в приглашении командной строки — файл загрузится в редактор vi. Если файл находится в другом каталоге, необходимо указать полный путь к нему. Например, если текущий каталог /tmp, а нужно открыть файл /home/rtracy/myfile.txt, следует ввести vi /home/rtracy/myfile.txt.
Также можно создать новый текстовый файл с помощью vi. Для этого введите vi с именем создаваемого файла в приглашении командной строки. Если путь не указан, файл будет создан в текущем каталоге; если путь указан — в соответствующем каталоге.
Например, на рис. 3-3 текущим каталогом является /home/rtracy, и в приглашении командной строки введена команда vi yourfile.txt. Обратите внимание: в интерфейсе редактора открыт пустой файл, о чём свидетельствует надпись «[New File]» в нижней части экрана. Важно учитывать, что при создании нового файла в vi файл не записывается на диск до тех пор, пока вы его не сохраните. До момента сохранения весь введённый текст хранится только в буфере памяти. Если не сохранить файл — он будет потерян.

Рис. 3-3. Создание нового файла в vi.
Теперь рассмотрим режимы vi.
Режимы vi¶
До этого момента всё было понятно, не правда ли? Большинство студентов, которых я обучаю работе с vi, без труда справляются с открытием или созданием файла. Однако после открытия файла начинается путаница. Причина в том, что vi использует четыре различных рабочих режима (mode):
- Командный режим (command mode)
- Режим командной строки (command-line mode)
- Режим вставки (insert mode)
- Режим замены (replace mode)
По умолчанию vi открывает или создаёт файл в командном режиме (command mode), иногда называемом нормальным (normal) режимом. Вы, вероятно, заметили на предыдущих рисунках, что интерфейс vi не содержит выпадающих меню для выполнения операций с файлом (запись, поиск, закрытие). Вместо этого для решения этих задач необходимо использовать команды в командном режиме и режиме командной строки.
Камень преткновения для большинства студентов состоит в том, что в командном режиме и режиме командной строки редактировать файл напрямую невозможно! Если не угадать правильную клавишу, нажатия никак не отображаются на экране при попытке изменить текст. Для редактирования нужно сначала перейти в режим вставки (insert mode). Перейти в режим вставки можно, нажав любую из следующих клавиш:
iInsertsoa
После нажатия любой из этих клавиш можно непосредственно редактировать текст файла. О том, что редактор находится в режиме вставки, свидетельствует надпись «-- INSERT --» в нижней части интерфейса vi. Это показано на рис. 3-4.

Рис. 3-4. Редактор vi в режиме вставки.
Повторное нажатие Insert переключит vi в режим замены (replace mode). Режим вставки аналогичен режиму вставки в текстовом процессоре: вводимый текст вставляется в позицию курсора, а весь существующий текст после курсора сдвигается на один символ вправо при каждом нажатии клавиши.
Режим замены, напротив, аналогичен режиму перезаписи: новые символы замещают уже существующие. Вернуться в режим вставки можно повторным нажатием Insert.
Находясь в режиме вставки, можно добавлять, изменять и удалять текст в файле. Однако выполнять файловые операции в этом режиме нельзя. Например, если вы внесли изменения в файл и хотите сохранить их, сделать это в режиме вставки не получится — сначала нужно вернуться в командный режим, нажав Esc. На рис. 3-5 показан переход из режима вставки обратно в командный режим.

Рис. 3-5. Переключение обратно в командный режим в vi.
В командном режиме можно вводить различные команды для удаления строк текста или поиска по файлу. Кроме того, в командном режиме доступен переход в режим командной строки, откуда можно сохранить файл или выйти из редактора. Эти команды будут рассмотрены далее в данном разделе. Чтобы вернуться в режим вставки, нажмите i, Insert или s.
Теперь, когда вы знаете, как открыть файл в vi и как переключаться между режимами, рассмотрим редактирование текста в режиме вставки.
Работа в режиме вставки¶
После открытия файла в vi и перехода в режим вставки текст можно редактировать так же, как и в любом другом текстовом редакторе. Обратите внимание: в левой части экрана отображается несколько строк с символами тильды (~). Эти символы не являются частью файла — они просто указывают на то, что соответствующие строки в файле отсутствуют. По мере добавления строк тильды пропадают одна за другой.
Для перемещения курсора по тексту используются клавиши-стрелки, а также Page Up, Page Down, Home и End. Добавить текст можно простым вводом символов с клавиатуры. Для удаления текста нажмите Delete или Backspace.
Завершив редактирование, вернитесь в командный режим нажатием Esc. Из командного режима также можно перейти в режим командной строки. Рассмотрим возможности режима командной строки.
Работа в режиме командной строки¶
Как уже было сказано, vi не предоставляет меню для выполнения стандартных файловых операций. Вместо этого необходимо вводить команды в режиме командной строки (command-line mode). В этом разделе мы рассмотрим основные команды и их назначение.
Для перехода в режим командной строки необходимо сначала войти в командный режим (если вы находились в режиме вставки), а затем ввести двоеточие (:). При этом в нижней части экрана появится приглашение командной строки, как показано на рис. 3-6.

Рис. 3-6. Приглашение командной строки в режиме командной строки vi.
В этом приглашении можно вводить команды для выполнения файловых операций. Одной из наиболее важных является запись файла на диск — она выполняется командой w. Не забудьте нажать Enter после ввода команды. После ввода w в нижней части экрана появится сообщение о том, что файл записан на диск:
Ввод w имя_файла запишет содержимое в файл с другим именем. Кроме того, доступны следующие команды режима командной строки:
:exit— сохраняет текущий файл и закрываетvi.:wq— также сохраняет текущий файл на диск и закрываетvi.:q— закрываетviбез сохранения текущего файла. Применимо только если файл не был изменён. Если файл изменён, необходимо использовать:q!.:w!— перезаписывает текущий файл принудительно.:e!— отменяет изменения, внесённые после последнего сохранения.
Ещё одна полезная возможность редактора vi — встроенная проверка синтаксиса. Она может оказаться незаменимой при написании сценариев или редактировании конфигурационных файлов: ничто не раздражает сильнее, чем неработающий сценарий или демон из-за пропущенной точки с запятой или закрывающей скобки. Проверку синтаксиса можно включить или отключить командой syntax в режиме командной строки. Нажмите Esc для перехода в командный режим, затем введите :syntax on или :syntax off. Например, для включения проверки синтаксиса введите:
После этого различные элементы сценария или конфигурационного файла будут выделены разными цветами. Синтаксические ошибки будут подсвечены контрастным цветом, что позволит легко их обнаружить. Пример использования проверки синтаксиса vi при редактировании конфигурационного файла демона показан на рис. 3-7.

Рис. 3-7. Использование проверки синтаксиса в vi.
В дополнение к командам режима командной строки существуют команды, вводимые непосредственно в командном режиме. Рассмотрим их далее.
Работа в командном режиме¶
Команды командного режима (command mode) не вводятся в строке приглашения — перед ними не нужно ставить двоеточие (:). Если вы находитесь в режиме вставки, нажмите Esc для возврата в командный режим. После этого можно использовать следующие команды:
dw— удаляет слово, следующее сразу после курсора, включая пробел после него. Текст сохраняется в буфере памяти.de— удаляет слово, следующее сразу после курсора, без пробела после него. Текст сохраняется в буфере памяти.d$— удаляет текст от позиции курсора до конца строки. Текст сохраняется в буфере памяти.dd— удаляет текущую строку целиком. Текст сохраняется в буфере памяти.p— вставляет текст из последней операции удаления после текущей позиции курсора.u— отменяет последнее действие.D— удаляет остаток текущей строки начиная с позиции курсора.yy— копирует строку, в которой находится курсор, в буфер.a— добавляет текст после курсора.A— добавляет текст в конец строки.C— изменяет текст от курсора до конца строки.cw— заменяет текущее слово новым текстом начиная с символа под курсором до нажатияEsc.cc— изменяет всю строку целиком.ZZ— сохраняет текущий файл и завершаетvi.h— перемещает курсор на один символ влево.j— перемещает курсор на одну строку вниз.k— перемещает курсор на одну строку вверх.l— перемещает курсор на один символ вправо.0— перемещает курсор в начало текущей строки.Ctrl-g— отображает строку состояния в нижней части интерфейса с именем файла, его статусом, общим числом строк и текущей позицией курсора. Пример результата:
/искомый_текст— выполняет поиск следующего вхождения указанного текста. Например,/initнайдёт следующее вхождение «init» после позиции курсора. Нажатиеnпосле запуска поиска переходит к следующему вхождению. На рис. 3-8 показан результат ввода команды/5901в командном режиме — первое вхождение числа 5901 выделено.?искомый_текст— выполняет поиск предыдущего вхождения указанного текста.

Рис. 3-8. Поиск текста в vi.
Как видите, vi — простой, но вполне мощный текстовый редактор. Единственный его недостаток — интерфейс, который непросто освоить. Однако после некоторой практики работа с vi станет совершенно естественной. Потренируемся в использовании vi в следующем упражнении.
Упражнение 3-1. Использование редактора vi
В этом упражнении вы будете практиковаться в использовании редактора vi для создания файлов и работы с текстом. Упражнение можно выполнить на виртуальной машине, прилагаемой к книге. Для получения корректно настроенного окружения запустите снимок состояния 3-1.
Видео. Посмотрите видео к упражнению 3-1: там показано, как выполнить это задание.
Выполните следующие шаги:
-
Если вы ещё не сделали этого, загрузите систему Linux и войдите в неё под именем пользователя
studentс паролемstudent. -
При необходимости откройте сеанс терминала.
-
Текущим каталогом должен быть домашний каталог вашего пользователя. Проверить это можно, введя
pwdв приглашении командной строки. В данном примере учётная запись пользователя называетсяrtracy, поэтому текущий каталог отображается как/home/rtracy: -
В приглашении командной строки введите
vi test.txt. Редакторviдолжен запуститься с открытым новым файломtest.txt. -
Нажмите клавишу
Insert. Вы должны перейти в режим вставки. -
Введите в файл следующий текст:
-
Сохраните файл, выполнив следующее:
a. Нажмите
Escдля возврата в командный режим.b. Введите
:w. Должно появиться сообщение о том, что файл записан. -
Выйдите из
vi, введя:exit. -
Снова загрузите
test.txtвvi, введяvi test.txtв приглашении командной строки. -
Отобразите строку состояния, нажав
Ctrl-gв командном режиме. -
С помощью клавиш-стрелок переместите курсор к первому символу первого слова в первой строке файла.
-
Найдите все вхождения текста «at», выполнив следующее:
a. В командном режиме введите
/at. Первое вхождение должно быть выделено.b. Перейдите к следующему вхождению, нажав клавишу
n.c. Продолжайте нажимать
n, пока не достигнете конца файла. -
Потренируйтесь в удалении текста:
a. В командном режиме с помощью клавиш-стрелок установите курсор на первую букву слова
legere.b. Удалите слово
legereвместе со следующим за ним пробелом, нажавdw.c. С помощью клавиш-стрелок переместите курсор к точке в конце последней строки.
d. Вставьте содержимое буфера памяти после точки, нажав
p. -
Выйдите из файла без сохранения изменений, введя
:q!.
Теперь у вас достаточно навыков для управления типичной системой Linux с помощью vi.