Menu

Глава 16. Редактор Vi

Содержание
16.1. Запуск vi
16.2. Режимы
16.3. Открытие файлов
16.4. Сохранение файлов
16.5. Выход из vi
16.6. Настройка vi
16.7. Клавиши vi

vi(1) - это стандартная программа Unix для редактирования текста, и хотя мастерство в рабое с ним сегодня не является настолько важной задачей, как это было раньше, оно всё ещё очень ценится. Существует несколько версий (клонов) vi: vi, elvis, vile и vim. Одна из них доступна практически во всех версиях Unix, а также и в Linux. Все эти версии обладают одинаковыми наборами основных функций и команд, поэтому, изучив один из клонов, вы с лёгкостью перейдёте на другой. Из-за наличия на сегодняшний день большого разнообразия текстовых редакторов, доступных в дистрибутивах Linux и версиях Unix, многие люди больше не используют vi. Тем не менее он всё ещё остаётся наиболее универсальным текстовым редактором в Unix и Unix-подобных системах. Мастерство владения vi означает, что вам не никогда не придётся сидеть за Unix-машиной и чувствовать себя неуютно, имея в своём распоряжении хотя бы один мощный текстовый редактор.

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

В Slackware Linux версией vi по умолчанию является elvis. Другие версии, включая vim и gvim, будут будут доступны, если вы установили соответствующие пакеты. gvim - это версия vim для X Window, имеющая панели инструментов, отделяемые меню и диалоговые окна.

16.1. Запуск vi

vi может быть запущен из командной строки различными способами. Самый простой из них:

% vi

Рисунок 16-1. Сеанс vi.

При этом будет запущен vi с пустым буфером. В большинстве случаев вы увидите просто пустой экран. Это так называемый “командный режим”, в котором от вас ожидаются какие-либо действия. Описания различных режимов работы vi смотрите в Разд. 16.2. Чтобы выйти из vi, наберите следующее:

:q

При условии, что вы не сделали в файле никаких изменений, эта команда закроет vi. Если были сделаны изменения, вы будете предупреждены об этом и дана информация о том, как проигнорировать их. Игнорирование изменений означает добавление восклицательного знака после “q”:

:q!

Обычно восклицательный знак означает принудительное выполнение какого-то действия. Позже мы подробнее рассмотрим это и другие комбинации клавиш.

Вы также можете запустить vi вместе с уже существующим файлом. Например, файл /etc/resolv.conf можно открыть таким образом:

% vi /etc/resolv.conf

И, наконец, vi можно запустить на определённой строке файла. Это особенно полезно для программистов, когда сообщение об ошибке содержит номер строки, на которой вылетела программа. Например, вы можете запустить vi на 47-й строке /usr/src/linux/init/main.c:

% vi +47 /usr/src/linux/init/main.c

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

16.2. Режимы

vi работает в различных режимах, которые используются для выполнения различных задач. При первом запуске vi вы попадаете в командный режим. В нём вы можете выполнять различные команды для работы с текстом, перемещения по файлу, сохранения, выхода и изменения режимов. Редактирование текста выполняется в режиме вставки. Вы можете быстро переключаться между режимами с помощью разнообразных комбинаций клавиш, описанных ниже.

16.2.1. Командный режим

Сначала вы попадаете в командный режим. В этом режиме вы не можете вводить текст или редактировать уже существующий. Однако вы можете манипулировать текстом, выполнять поиск, выходить, сохранять, загружать новые файлы и др. Данную информацию следует рассматривать только как знакомство с командным режимом. Описания различных команд смотрите в Разд. 16.7.

Наверное самой часто используемой командой в командном режиме является переключение в режим вставки. Оно осуществляется нажатием на клавишу i. Курсор изменяет свой вид, а в нижней части экрана появляется надпись -- INSERT -- (или -- ВСТАВКА --) (учтите, что это не происходит во всех клонах vi). Теперь все ваши нажатия на клавиатуре будут вставляться в текущий буфер и отображаться на экране. Чтобы вернуться назад в командный режим, нажмите клавишу ESCAPE.

Командный режим также позволяет вам перемещаться по файлу. В некоторых системах вы можете использовать для этого клавиши со стрелками. В других системах вам может потребоваться использовать более традиционные клавиши: “hjkl”. Вот перечень этих клавиш и их использование для перемещения:

h перемещение влево на один символ
j перемещение вниз на один символ
k перемещение вверх на один символ
l перемещение вправо на один символ

Чтобы переместиться, просто нажмите клавишу. Как вы позже увидите, эти клавиши можно комбинировать с числами, чтобы использовать их более эффективно.

Многие из команд, которые вы увидите в командном режиме, начинаются с двоеточия. Например, выход - это :q, как уже упоминалось выше. Двоеточие означает, что это команда, а “q” говорит vi выйти. Другие команды представляют собой необязательные числа, следующие после буквы. Эти команды не содержат в начале двоеточия и используются в основном для работы с текстом.

Например, удаление в файле одной строки выполняется нажатием dd. При этом будет удалена строка, в которой находится курсор. Выполнение команды 4dd сообщит vi удалить строку, в которой находится курсор и три строки после неё. В общем случае числа сообщают vi, сколько раз нужно выполнить команду.

Вы можете комбинировать числа с клавишами перемещения, чтобы переместиться за один раз на нужное количество символов. Например, 10k выполнит перемещение вверх на десять строк.

Командный режим можно также использовать для вырезания и вставки текста и считывания других файлов в текущий буфер. Копирование текста выполняется с помощью клавиши y (y означает yank - резкий рывок). Копирование текущей строки выполняется командой yy, а перед ней может следовать число для копирования большего количества строк. Затем переместите курсор в нужное место и нажмите p. Текст будет вставлен в строку сразу после текущей.

Вырезание текста выполняется командой dd, а p можно использовать для вставки вырезанного текста назад в файл. Прочитать текст из другого файла также является простой процедурой. Просто наберите :r, и через пробел добавьте имя файла, содержащего текст для вставки. Содержимое файла будет вставлено в текущий буфер в строку после курсора. Более сложные клоны vi даже обладают возможностью автозавершения имён файлов как в командном процессоре.

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

Простой поиск выполняется нажатием на клавишу /, после чего вводится искомый вами текст. vi будет искать его от текущего положения курсора до конца файла, остановившись на первом найденном совпадении. Учтите, что неполные совпадения также вызовут остановку поиска. Например, поиск слова “the” приведёт к остановке на словах “then”, “therefore” и т.д. Это происходит вследствие того, что все эти слова содержат “the”.

После того, как vi найдёт первое совпадение, вы можете продолжить поиск до следующего совпадения, нажав на клавишу / и Enter. Вы также можете выполнять поиск по файлу в обратном направлении, заменив слэш на ?. Например, поиск по файлу в обратном направлении слова “the” выполняется с помощью команды ?the.

16.2.2. Режим вставки

Вставка и замена текста выполняется в режиме вставки. Как уже упоминалось выше, чтобы перейти в этот режим, надо в командном режиме нажать клавишу i. После этого весь набираемый вами текст будет вставляться в текущий буфер. Нажатие на клавишу ESCAPE вернёт вас назад в командный режим.

Замена текста осуществляется несколькими способами. В командном режиме нажатие на r позволит вам заменить один символ под курсором. Просто введите новый символ и он заменит тот, что находится под курсором. Затем вы снова будет возвращены в назад в командный режим. Нажатие на клавишу R позволит вам заменить любое количество символов. Чтобы выйти из этого режима и вернуться в командный режим, просто нажмите ESCAPE.

Существует ещё один способ для переключения между режимами вставки и замены. Нажатие на клавишу INSERT в командном режиме переведёт вас в режим вставки. При работе в этом режиме клавиша INSERT служит переключателем между режимами вставки и замены. Нажатие на неё один раз позволит вам заменять текст. Ещё одно нажатие вернёт вас назад в режим вставки.

16.3. Открытие файлов

vi позволяет вам открывать файлы в командном режиме, а также сразу указывать открываемый файл при запуске из командной строки. Пример открытия файла /etc/lilo.conf:

:e /etc/lilo.conf

Если вы сделали изменения в текущем буфере и не сохранили их, vi предупредит вас об этом. Вы всё ещё можете открыть файл, не сохраняя текущий буфер, набрав команду :e!, а через пробел добавив имя файла. В общем случае предупреждения vi можно проигнорировать, добавив после команды восклицательный знак.

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

Некоторые клоны vi (например, vim) позволяют открывать несколько буферов одновременно. К примеру, чтобы открыть файл 09-vi.sgml из своего домашнего каталога одновременно с другим уже открытым файлом, надо выполнить следующую команду:

:split ~/09-vi.sgml

Новый файл будет показан в верхней половине экрана, а старый - в нижней половине. Существует много команд для управления разделением экрана и многие из них в чём-то похожи на команды Emacs. Лучшим источником поиска информации об этих командах является страница руководства для вашего клона vi. Обратите внимание, что многие клоны не поддерживают разделение экрана, поэтому вы можете вообще не увидеть поддержки этой функции.

16.4. Сохранение файлов

В vi существует несколько способов сохранения файлов. Если вам нужно сохранить содержимое текущего буфера в файл randomness, наберите следующую команду:

:w randomness

После того, как вы сохранили файл в первый раз, для повторного его сохранения наберите просто :w. Все изменения будут записаны в файл. После сохранения файла вы будете возвращены назад в командный режим. Если вам нужно сохранить файл и выйти из vi (очень распространённая ситуация), вам нужно набрать :wq. Эта команда говорит vi сохранить текущий файл и вернуться назад в командный процессор.

Может случиться так, что вам нужно сохранить файл, помеченный атрибутом “только для чтения”. Тогда вы можете сохранить его, добавив восклицательный знак после команды записи:

:w!

Однако вы всё-таки можете столкнуться с ситуацией, когда вы не сможете выполнить запись в файл (например, если вы пытаетесь отредактировать файл, владельцем которого является другой пользователь). В этом случае vi сообщит вам, что он не может сохранить файл. Если вам действительно нужно отредактировать файл, вам понадобится вернуться назад и отредактировать его под root'ом или (что есть более предпочтительным) под владельцем этого файла.

16.5. Выход из vi

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

Иногда может случиться так, что ваша машина зависнет или vi “вылетит”. Однако для минимизации потерь в таких случаях и elvis, и vim принимают определённые меры. Оба редактора время от времени сохраняют открытые буферы во временный файл. Этот файл обычно называется так же как и оригинальный файл, но с точкой в начале имени. Это делает такой файл скрытым.

Этот временный файл удаляется после нормального завершения работы редактора. Это означает, что временная копия будет всё ещё доступна, если что-то вылетит или зависнет. Когда вы снова вернётесь к редактированию файла, вам будут предложены на выбор варианты действий. В большинстве случаев может быть восстановлена большая часть несохранённой работы. elvis также отправит вам письмо (из Graceland'а как ни странно :), сообщающее вам, что есть резервная копия.

16.6. Настройка vi

Выбранный вами клон vi может быть настроен различными способами.

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

Почти все эти команды могут быть указаны в конфигурационном файле в вашем домашнем каталоге. elvis использует файл .exrc, а vim - .vimrc. Большинство команд, которые могут быть выполнены в командном режиме, могут быть указаны в конфигурационном файле. Это может быть конфигурационная информация, замены текста, макросы и др.

Рассмотрение всех этих параметров и их различий в версиях редактора представляет собой сложную и трудоёмкую задачу. Дополнительную информацию смотрите на странице руководства или на веб-сайте своего редактора vi. Некоторые редакторы (например, vim) содержат исчерпывающую встроенную справку, которая может быть вызвана командой :help или чем-то похожим. Вы также можете обратиться к книге “Learning the vi Editor” Ламба (Lamb) и Роббинса (Robbins) от издательства O'Reilly.

Многие общие программы в Linux по умолчанию загружают текстовый файл в vi. Например, редактирование crontab'ов выполняется по умолчанию в vi. Если вас не устраивает vi и вы хотели бы использовать вместо него другой редактор, вам нужно установить переменную окружения VISUAL, указав в ней предпочитаемый редактор. Информация об установке переменных доступна в 8-й главе в разделе под названием “Переменные окружения”. Если вы хотите, чтобы этот редактор устанавливался как используемый по умолчанию при каждом вашем входе в систему, добавьте команду установки переменной VISUAL в свой файл .bash_profile или .bashrc.

16.7. Клавиши vi

Этот раздел представляет собой краткий справочник по общим командам vi. Некоторые из них уже были рассмотрены ранее, а некоторые окажутся для вас новыми.

Таблица 16-1. Перемещение

Действие Клавиши
Влево, вниз, вверх, вправо h, j, k, l
В конец строки $
В начало строки ^
В конец файла G
В начало файла :1
На строку 47 :47

Таблица 16-2. Редактирование

Действие Клавиша
Удаление строки dd
Удаление пяти строк 5dd
Замена символа r
Удаление символа x
Удаление десяти символов 10x
Отмена последнего действия u
Объединение текущей и следующей строк J
Замена старого на новое, глобально %s'старое'новое'g

Таблица 16-3. Поиск

Действие Клавиша
Поиск “asdf” /asdf
Поиск “asdf” в обратном направлении ?asdf
Повтор последнего поиска в прямом направлении /
Повтор последнего поиска в обратном направлении ?
Повтор последнего поиска в том же направлении n
Повтор последнего поиска в обратном направлении N

Таблица 16-4. Сохранение и выход

Действие Клавиша
Выйти :q
Выйти без сохранения :q!
Записать и выйти :wq
Записать без выхода :w
Перезагрузить открытый в данный момент файл :e!
Записать буфер в файл asdf :w asdf
Открыть файл hejaz :e hejaz
Загрузить файл asdf в буфер :r asdf
Загрузить вывод команды ls в буфер :r !ls
Hosted by uCoz