Vi (перевод)
Глава 16 Vi
vi (1) – это стандартный текстовый редактор в Unix, и хотя изучение его не так важно, как когда-то, но это всё ещё стоящая цель. Доступно несколько версий vi, например, vi, elvis, vile и vim. Одна из них доступна на любой Unix системе, так же как и на Linux. Все они включают в себя одинаковый базовый набор команд, поэтому изучение одного клона сделает легче изучение остальных. Поскольку в настоящее время в Linux дистрибутивах есть большое количество различных тестовых редакторов, то множество людей больше не использует vi. Однако он остаётся самым универсальным текстовым редактором в Unix и Unix-подобных машинах. Овладение vi означает, что вы больше не будете испытывать дискомфорт на Unix машине с хотя бы одним мощным текстовым редактором.
vi включает в себя определённый набор удобных возможностей: выделение синтаксиса, форматирование кода, мощный механизм поиска и замены, макросы и т. д. Эти особенности делают vi особо привлекательным для программистов и web-разработчиков. Системные администраторы оценят автоматизацию и объединение с оболочкой, которое также возможно.
В Slackware по умолчанию установлен elvis. Такие версии как vim и qvim будут доступны, если вы установите соответствующие пакеты. qvim – это оконная версия vim, в которой есть панели, меню и диалоговые окна.
16.1 Запуск vi.
vi может быть запущен из командной строки разными способами. Самый простой:
% vi |
Рисунок 16-1. Сеанс vi
Эта команда запускает vi с пустым файлом. Вы увидите в основном пустой экран. vi теперь находится в режиме команд, ожидая ваших действий. Режимы обсуждаются в разделе 16.2. Для того чтобы выйти из vi наберите следующее:
:q |
Если в файл не было внесено никаких изменений, вы выйдете из vi. Если же есть изменения, то он предупредит вас о том, что они есть, и скажет как игнорировать их. Игнорирование изменений обычно означает добавление восклицательного знака после ‘q’:
:q! |
Восклицательный знак обычно заставляет vi выполнить команду. Мы детально обсудим эту и другие комбинации команд позже.
Вы также можете запустить 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 отобразит данный файл и расположит курсор на указанной строке. Если вы укажете строку, которая идёт после конца файла, то он расположит курсор на последней строке. Это очень помогает программистам: они могут сразу перейти к строчке, которая вызвала ошибку, без её поиска.
16.2 Режимы
vi работает в различных режимах, которые используются для выполнения различных заданий. Когда вы запускаете vi, оказываетесь в командном режиме. Теперь вы можете набирать разные команды для управления текстом, передвигаться по файлу, сохранять, завершать работу и изменять режим. Редактирование текста происходит в режиме вставки. Вы можете быстро переключаться между режимами разнообразным сочетанием клавиш, которые описаны ниже.
16.2.1 Командный режим
Вначале вы находитесь в командном режиме. Из него вы не можете напрямую вводить текст или редактировать его. Однако вы можете управлять текстом, искать, сохранять, загружать новые файлы и выходить из vi. Это только представление командного режима. Для описания различных команд смотрите раздел 16.7.
Возможно, самая часто используемая команда в командном режиме – это переключение в режим вставки. Этого можно достигнуть нажав клавишу i. Курсор изменяет форму и внизу экрана появляется надпись INSERT (обратите внимание, что это происходит не во всех клонах vi). С этого момента все напечатанные символы вводятся в имеющийся файл и отображаются на экране. Для того чтобы переключиться обратно в командный режим, нажмите клавишу ESCAPE.
Командный режим также используется при перемещении по файлу. На некоторых системах вы можете использовать стрелки для перемещения. На других системах вам придётся использовать более традиционные клавиши “hjkl”. Вот простая таблица, которая показывает, как эти клавиши используются для передвижения:
| h | сдвиг влево на один символ |
| j | сдвиг вниз на один символ |
| k | сдвиг вверх на один символ |
| l | сдвиг вправо на одни символ |
Просто нажмите клавишу, чтобы переместиться. Как вы увидите позже, если клавишу совместить с указанием числа, то можно перемещаться по тексту значительно быстрее.
Множество команд, которые вы будете использовать в командном режиме, начинаются с двоеточия. Например, выход – это :q, как обсуждалось ранее. Двоеточия просто обозначает, что это команда, а “q” сообщает vi, что надо завершить работу. Другие команды начинаются с цифры, за которой следует буква. Перед такими командами не надо ставить двоеточия, и они используются для управления текстом.
Например, удаление одной строки из файла достигается командой dd. Это удалит строку, на которой стоит курсор. Набрав 4dd, вы удалите строку, на которой стоит курсор и три после неё. В общем, число сообщает vi, сколько раз необходимо выполнить команду.
Вы можете совместить число с указанием направления перемещения для того чтобы передвинуться на несколько символов сразу. Например, 10k переместит курсор на десять строк вверх.
Командный режим также может использоваться для вырезания, вставки текста и чтения других файлов в текущий файл. Копирование достигается с помощью кнопки y (y от слова yank). Копировать данную строчку можно комбинацией yy, цифра перед командой указывает, сколько линий копировать. Потом переместитесь к месту вставки и нажмите p. Текст будет вставлен на строчку, следующую за текущей.
Вырезка делается комбинацией dd, а p может быть использовано для вставки вырезанного текста в файл. Чтение текста из другого файла довольно простая процедура. Просто нажмите :r, потом пробел и имя файла, который содержит требуемый текст для вставки. Содержимое файла будет вставлено в файл на строчке после курсора. Более сложные клоны vi даже могут дополнять имя файла, как это делается в оболочке (прим. перев.: имеется в виду нажатие Tab).
Последнее, что мы рассмотрим - это поиск. Командный режим допускает как простой поиск, так и более сложные команды поиска-замены, которые требуют мощную версию регулярных выражений. Детальное обсуждение регулярных выражений находится вне контекста этой главы, так что в этом разделе будут оговорен только простой поиск.
Вы попадаете в простой поиск, нажав клавишу / и текст, который вы будете искать после неё. 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, что надо сохранить данный файл и выйти в оболочку.
Если вы хотите сохранить файл, который помечен как read-only (только для чтения), вы можете сделать это добавляя к команде восклицательный знак вот так:
:w! |
Однако, могут быть случаи, когда нельзя изменять файл (например, вы пытаетесь редактировать файл, которым владеет другой пользователь). Когда это произойдет, vi сообщит, что не может сохранить файл. Если вы действительно хотите отредактировать файл, то выйдите и отредактируйте файл как root или (предпочтительнее) как владелец файла.
16.5 Выход из vi
Выйти из vi можно с помощью команды :wq, которая сохранит текущий файл перед выходом. Вы также можете завершить работу без сохранения с помощью команды :q или (чаще) :q!. Последняя используется, когда вы изменили файл, но не хотите сохранять какие-либо изменения.
Иногда ваша система или vi могут рухнуть. Однако, как elvis, так и vim предпримут меры для уменьшения вреда для любых открытых файлов. Оба этих редактора время от времени сохраняют открытые файлы во временные. Файл обычно называется так же, как и открытый, но с точкой в начале. Это делает файл скрытым.
Этот временный файл будет уничтожен сразу же, как вы нормально завершите работу с редактором. Это означает, что временная копия будет с вами, если что-нибудь произойдёт. Когда вы войдете снова чтобы редактировать файл, вас спросят, что предпринять. В большинстве случаев большое количество вашей несохраненной работы может быть восстановлено. elvis также пошлет вам письмо (от Graceland, как это ни странно :), сообщающее о наличии резервной копии.
16.6 Конфигурация vi
Ваш клон vi может быть настроен несколькими путями.
Определенный набор команд может быть введен в командном режиме для того чтобы настроить vi на ваше усмотрение. В зависимости от вашего редактора, вы можете включать особенности, которые сделают работу легче (например, подсветка синтаксиса, автозамена и т. д.), настраивать макросы для автоматического выполнения работы, включать замены текста и т. д.
Практически все эти команды могут быть положены в конфигурационный файл в вашей домашней директории. Для elvis это .exrc, а для vim - .vimrc. Это могут быть такие команды как информация о настройке, замены текста, макросы и т. д.
Обсуждение всех этих опций и различий между редакторами - довольно сложная тема. Для подробной информации просмотрите мануал или веб сайт вашего редактора. Некоторые редакторы (например, vim) содержат много информации внутри редактора, её можно просмотреть с помощью команды :help или другой похожей. Вы также можете посмотреть книгу от O’Reilly “Learning the vi Editor” Lamb’а и Robbins’а.
Множество обычных программ в Linux загрузят текстовый файл в vi по умолчанию. Например, редактирование вашего crontabs запустит vi по умолчанию. Если вам не нравится vi и вы хотите, чтобы загружался другой редактор, всё, что вам нужно сделать - это установить переменную окружения VISUAL на тот редактор, который вы предпочитаете. Для информации по установке переменных окружения смотрите раздел Переменные окружения в Главе 8. Если вы хотите быть убежденными в том, что ваш редактор будет редактором по умолчанию каждый раз, когда вы входите в систему, добавьте установку VISUAL в ваш .bash_profile или .bashrc.
16.7 Команды Vi
Этот раздел является кратким справочником по командам vi. Некоторые из них обсуждались выше, но есть и много новых.
Таблица 16-1. Перемещение
| Операция | Команда |
|---|---|
| влево, вниз, вверх, вправо | h, j, k, l |
| В конец строки | $ |
| В начало строки | ^ |
| В конец файла | G |
| В начало файла | :1 |
| На строку 47 | :47 |
| Операция | Команда |
|---|---|
| Удаление строки | dd |
| Удаление пяти строк | 5dd |
| Замена символа | r |
| Удаление символа | x |
| Удаление десяти символов | 10x |
| Отмена последнего действия | u |
| Объединить текущую и следующую линии | J |
| Заменить “old” на “new”, глобально | %s’old’new’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 |
