Справочник по редактору VI


Всем бьющимся головой о монитор посвящается…

Вступление

О, сколько раз я видел людей, в истерике ломающих клавиатуры, произносящих массу знакомых слов и спрашивающих: "А можно как-нибудь файл в винде отредактировать и засунуть обратно в UNIX?

А может, в UNIX есть какой-нибудь человеческий редактор?" "Есть. Это vi " — обычно отвечаю я, но иногда всё-таки вспоминаю, как сам, открыв в первый раз файл в этом редакторе, так и не смог с ним ничего сделать. В ответ на мои потуги терминал то издевательски пищал, то что-то делал, но совсем не то, что я ожидал! И только через какое-то время (наверное, несколько недель) у меня открылись чакры. И после этого я даже в встроенном редакторе Norton Commander пытался для сохранения файла нажать <ESC>:wq и тупо смотрел на появляющееся окошко… Да, переход из DOS в UNIX — это всегда ломка, и часто болезненная. Но ничего, болезни роста прошли, и сейчас я одинаково (неуклюже) умею редактировать тексты как в "винде", так и в UNIX. А постольку, поскольку я ленив, и мне надоело каждый раз объяснять, как работает vi, я решил написать об этом.

Для удобства читателей статья разбита на несколько разделов:

  • Общая информация — интерфейс, управляющие кнопки, режимы работы редактора.
  • Пример редактирования файла — "живой" пример работы с vi
  • Список команд — если вы не хотите читать всякую "муть", смотрите таблицы
  • Редактирование командной строки в ksh — как работать в Korn Shell
  • Всякая всячина — ссылки на документацию, проект VIM и т.д.
  • Общая информация

    Общее описание редактора

    Текстовый редактор vi появился тогда же, когда появился UNIX — в 1970-е. Это и обуславливает его "странноватый" пользовательский интерфейс. Тогда существовала масса разнообразных текстовых (ASCII) терминалов, с разными возможностями и разным количеством и составом функциональных кнопок, а уж графических оболочек тогда и вообще не было. И редактор vi по тем временам был просто шикарным — это полноэкранный текстовый редактор, с мощными встроенными функциями, с поддержкой макросов, с буферами обмена… Сравните с однострочными редакторами, в которых в один момент времени видно только одну строку! А vi — он потому и vi, что "visual". Редактор vi — именно текстовый редактор, в нём можно только редактировать текст, в нём нельзя вставлять никакие таблички, картинки, использовать разные шрифты… но то, что он умеет,он действительно умеет!

    Что нужно редактору vi для работы? Кнопки на клавиатуре с буквами и цифрами, пробел, <SHIFT>, <ENTER> (куда же без них), кнопка <ESC> (самая важная!), иногда кнопка <CTRL> и… всё! Не нужны функциональные кнопки (они в принципе не работают), стрелки (могут и работать), мышь (забудьте про это животное)… ах да, есть ещё <BACKSPACE>, хотя без него тоже можно обойтись.

    Но всё-таки, зачем мучаться, учить команды, может, всё-таки есть текстовый редактор под UNIX "попроще?" Да, есть такие, даже бесплатные, но… вы уверены, что они установлены на той системе, на которой вам надо отредактировать пару строк в файле? Или вы хотите таскать их с собой на дискете? А вот редактор vi в UNIX-системе есть. Точно. И освоить его не очень уж сложно (по опыту, через пару дней уже начинают более-менее кнопки правильные нажимать).

    Режимы работы vi

    И как тогда с ним (редактором) работать? Да всё очень просто: когда вы работаете с vi, он находится в одном из двух режимов: 1) режим ввода команд и 2) режим ввода текста. После запуска редактора вы попадаете в режим ввода команд, а чтобы начать вводить текст надо… правильно — ввести соответствующую команду! Понабирали вы буковки и увидели, что набрали что-то не то. Вам надо отредактировать текст (удалить символы, набрать вместо них другие, перейти курсором к другой строке и т.д.). Что вам надо сделать? Ввести команду. А как вернуться в режим ввода команд? А для этого как раз и существует волшебная кнопка <ESC>! Нажали её — и всё, что вы набираете дальше, уже не попадает в основной экран, это уже команды. Как же они выглядят, эти команды? Да это те-же самые буквы на клавиатуре, только теперь они по другому воспринимаются! Например, если вы нажмёте xi, находясь в режиме ввода, то на экране появятся буквы xi. А если вы наберёте xi в режиме команд, то удалится текущий символ (команда x) и вы вернётесь в режим ввода (команда i). Как видно из этого примера, не надо перед каждой командой нажимать <ESC> достаточно нажать её один раз. Кстати, если вы нажмёте <ESC>, и так находясь в командном режиме, ничего страшного не произойдёт. Терминал пискнет (если умеет), а редактор останется в том же командном режиме. Для удобства можно приказать редактору vi показывать режим работы — для этого надо набрать команду :show mode<ENTER> (само-собой разумеется, сначала надо нажать <ESC>), тогда в самой нижней строке экрана будет гореть "INPUT", еслредактор нажодится в режиме ввода текста. Кстати, сколько вариантов UNIX, столько и вариантов vi — в некоторых версиях такая подсказка появляется по умолчанию, а в некоторых — показывают и режим ввода команд (COMMAND).

    Ещё немного про команды

    Команды, когда вы их вводите, на экране не отображаются, <ENTER> после них набирать не нужно — вы сразу видите их результат. Но есть и исключение. Это — так называемые "команды строчного редактора". Как их отличить? Да очень просто — они начинаются с "двоеточия" (:). Такие команды отображаются в нижней строке экрана (включая двоеточие), завершать их нужно кнопкой <ENTER>, кнопкой <BACKSPACE> можно удалять (посимвольно). Это команды поиска и замены текста, работы с файлами, выхода из редактора, управляющие команды (set). Перечитайте ещё раз предыдущую часть "Режимы работы vi" и найдите отличия.
    Кстати, у vi, конечно же, есть конфигурационный файл. Он называется .exrc и находится в домашнем каталоге. Зачем он нужен? Туда можно вписать управляющие команды (set …) и они автоматически будут срабатывать при старте редактора. Команды вписываются в этот файл построчно, без ":set", например, если вы хотите видеть режим работы редактора и номера строк файла, впишите в этот файл строки "show mode" и "number". А как записать команды в этот файл? Разумеется, при помощи vi!

    Дальше мы увидим пример редактирования файла и список команд vi.

     

    Пример редактирования файла

    Чтобы вам примерно стало понятно, как это всё работает, рассмотрим небольшой пример редактирования файла.

    Нам надо набрать в vi небольшой текст:

    Twas brilling, and the slithy toves
    Did gyre and gimble in the wabe;
    All mimsy were the borogoves,
    And the mome raths outgrebe.
    Through the Looking-Glass, and What Alice Found There

    Отлично, запускаем vi: (дальше всё, что мы набираем на клавиатуре, выделено).

    $vi alice

    Появился пустой экран… нет, не совсем пустой — в первом столбце на каждой строке мы видим "тильду" (~). Это признак "строки за концом файла" — а у нас файл пока пустой и все строки такие.
    Vi empty

    Мы находимся в командном режиме, Даём команду ввода текста: i
    и вводим текст:
    Twas brilling, and the slithy toves<ENTER>
    Did gyre and gimble in the wabe;<ENTER>
    All mimsy were the borogoves,<ENTER>
    And the mome raths outgrebe.<ENTER>
    Through the Looking-Glass, and What Alice Found There<ENTER>

    Сохраним дело рук своих: <ESC>:w<ENTER>
    VI screen
    (в строке статуса появилась надпись: "alice" [New file] 6 lines, 183 characters) и полюбуемся… Ой, а в последней строке четверостишься должно быть слово outgrаbe, а не outgrebe! Исправляем ошибку.

    Поднимаемся на две строки вверх (кк) и переходим к нужному симовлу (четыре раза нажали w, чтобы перейти к четвёртому слову и пять раз — l, чтобы перейти к нужной букве (это буква "e" в середине слова "outgrebe"). Заменяем её на букву "a": ra
    VI screen

    Вроде всё? Нет, мы забыли указать автора этого замечательного произведения. Мы по прежнему в режиме ввода команд. Нажимаем o (вставили пустую строку, перешли в неё и оказались в режиме ввода текста) и пишем: Lewis Carroll. Отделим имя автора от текста пустой строкой: <ESC>O (мы нажали <ESC>, чтобы вернуться в командный режим и заглавное O, чтобы вставить строку выше курсора). Похоже, текст готов. Нажимаем <ESC>:wq (после команды O мы оказались в режиме ввода, поэтому мы и нажали <ESC>)
    VI screen
    и жмём <ENTER>. Уфф… Мы сделали это!

    Следующий раздел — список команд, и это ещё не всё…

    {mospagebreak}

    Список команд

    В принципе, для начала работы с vi достаточно запомнить десяток основных команд. Вот они — в первой таблице. Вы можете распечатать её и приклеить к монитору. Но перед этим — важное замечание: как Вы думаете, какая команда самая распространённая? Правильно, удалить неверно введённцй, ой, введённый символ. Это команда х. Только вот какая незадача — она удаляет символ над курсором, а когда Вы ввели этот неправильный символ, курсор уже ушёл вперёд. Так что же — надо для удаления символа нажимать hx? Нет, так как при переходе в командный режим (нажатии <ESC>) курсор автоматически переходит на один символ назад — на только что набранный символ. Это происходит всегда, ведь vi не может догадаться, что именно Вы хотите сделать, и происходит это именно при переходе в командный режим, то есть повторное нажатие <ESC> не переместит курсор.

    Основные команды vi
    vi filename Вызов редактора vi для редактирования файла filename
    a Добавить текст после курсора (переход в режим ввода)
    <ESC> Перейти из режима ввода в командный режим
    h Переместить курсор на один символ влево
    j Переместить курсор вниз на одну строку
    k Переместить курсор вверх на одну строку
    l Переместить курсор на один символ вправо
    x Удалить символ
    WWW.AIXPORTAL.RU — узнать всё об AIX
    :w Записать в файл
    :q Завершить работу с vi
    :q! Завершить работу с vi без сохранения файла
    :wq Записать буфер в файл и завершить работу с vi
    ZZ Записать буфер в файл и завершить работу с vi

    Обратите внимание на базовые команды перемещения курсора — hjkl. Вполне вероятно, в терминале будут работать и стрелки, но эти команды стоит запомнить — они Вам пригодятся при работе в командной строке ksh. А запомнить их просто — это обычная "распальцовка" — влево-вниз-вверх-вправо.
    hjkl fingers

    У vi есть масса возможностей. В следующих таблицах команды сгруппированы по предназначению. Кстати, любую команду vi можно выполнить несколько раз — для этого надо перед командой указать число повторений. Например, 10k — перейти на 10 строк вверх, а 10o (эта команда будет дальше) — вставить 10 строк ниже курсора. Полезная подсказка?

    Позиционирование курсора
    h Переместить курсор на один символ влево
    j Переместить курсор вниз на одну строку
    k Переместить курсор вверх на одну строку
    l Переместить курсор на один символ вправо
    $ Переместить курсор на последний символ в строке
    0(ноль) Переместить курсор на первый символ в строке
    ^ Переместить курсор на первый не пустой символ в строке
       
    w Переместить курсор к началу следующего слова
    W Переместить курсор к началу следующего слова, не учитывая все знаки пунктуации
       
    1G Перейти к первой строке в файле
    G Перейти к последней строке в файле
    nG Перейти к строке номер n в файле
    :set num Показывать номера строк в файле
    :set nonum Не показывать номера строк в файле
       
    ^f Прокрутить экран вперёд на полное окно.
    ^b Прокрутить экран назад на полное окно.

     

    Поиск и замена текста по шаблону (*)
    /pattern<ENTER> Поиск вперёд в буфере до первого появления шаблона pattern.
    ?pattern<ENTER> Поиск назад в буфере до первого появления шаблона pattern.
    n Повторить последнюю команду поиска
       
    :s/pattern/new_text/<ENTER> Заменить первое появление шаблона pattern в текущей строке на new_text
    :s/pattern/new_text/g<ENTER> Заменить каждое появление шаблона pattern в текущей строке на new_text
    :g/pattern/s//new_text/g<ENTER> Заменить каждое появление шаблона pattern в файле на new_text

    * В шаблоне (pattern) работают регулярные выражения (RE — Regular Expressions). Подробнее про регулярные выражения можно найти в IBM AIX InfoCenter.

    Ввод, удаление и замена текста
    a Создать текст после курсора (переход в режим ввода)
    A Создать текст в конце текущей строки (переход в режим ввода)
    i Создать текст перед курсором (переход в режим ввода)
       
    o Вставить новвую строку ниже текущей строки и перейти в неё (переход в режим ввода)
    O Вставить новвую строку выше текущей строки и перейти в неё (переход в режим ввода)
       
    <BACKSPACE> В режиме ввода: удалить текущий символ
    x Удалить текущий символ
    dw Удалить слово над курсором (текст помещается во временный буфер)
    dW Удалить слово и пунктуацию над курсором (текст помещается во временный буфер)
    dd Удалить текущую строку (текст помещается во временный буфер)
    rx Заменить текущий символ на символ x
    R Перейти в режим ввода с заменой текста

     

    Дополнительные команды
    u Отменить последнюю команду
    . Повторить последнюю команду
    j Соединить текущую строку со строкой, расположенной ниже
    yy Скопировать строку во временный буфер
    p Поместить содержимое временного буфера, полученное с помощью команды y или команд удаления, в текст после курсора
    :show mode<ENTER> Показывать режим работы vi в строке статуса (командный или ввода)

     

    Работа с файлами и выход из редактора
    ZZ Записать текст в файл и завершить работу с vi
    :wq<ENTER> Записать текст в файл и завершить работу с vi
    :w<ENTER> Записать текст в файл
    :w!<ENTER> Записать текст в файл, даже при недостатке прав доступа (если вы владелец файла или root)
    :q<ENTER> Завершить работу с vi без записи текст в файл, если буфер не изменялся
    :q!<ENTER> Завершить работу с vi без записи текст в файл, даже если текст изменялся
    :w filename<ENTER> Записать текст в новый файл filename
    :w! filename<ENTER> Перезаписать содержимое текста в уже существующий файл filename

    Хотите узнать, г де ещё можно использовать команды vi? Тогда читайте дальше.

    {mospagebreak}

    Редактирование командной строки в ksh

    Ну что ж, выйдем из vi и вернёмся в командную строку. В тот самый, почему то нелюбимый многими, Korn Shell (ksh). "А можно поставить bash?" — начинают стонать они. Поставить-то можно, но в установке по умолчанию его нет. И научиться работать в ksh — дело чести любого админа AIX.

    Так как же в нём работать? Да элементарно — даём магическую команду "set -o vi" и получаем возможность работы с историей команд. Представьте себе, что Вы работаете с файлом (так оно и есть), но видите в один момент времени только одну строку. При этом изначально Вы находитесь в режиме ввода текста. Хотим вернуться к прошлой строке? <ESC> k — и вуаля — вот она! Переместиться по ней — h и l, удалить символ — х, вставить свой — i, ну и так далее. Работает и поиск (/). Вот тут-то Вам и пригодилась выученная заранее "распальцовка" — стрелки здесь работать не будут — это же не bash какой-нибудь!

    История команд, между прочим, ведётся в любом случае — работаете Вы с ней или нет. Файл с историей — $/.sh_history, размер файла (в командах) — переменная окружения $HISTSIZE.

    Само собой разумеется, что если Вы хотите всегда иметь эту чудесную возможность редактирования командной строки, вставьте команду set -o vi в файл $/.profile. Так и не научились работать с vi? Тогда используйте команду set -o emacs и… ищите документацию по этому, не менее замечательному редактору!

    Вам и этого мало? Нужна полная документация по vi? Тогда открывайте следующую страницу.

    {mospagebreak}

    В этой статье я не описал и половины возможностей редактора vi. Полную документацию по vi Вы можете найти в man pages (man vi), в AIX InfoCenter (тот же man, только в web), в книгах из серии "UNIX для начинающих", да и просто в Интернет.

    А если Вам так понравился vi (не сомневаюсь!), то Вы можете поставить его и на "винду"! Существует проект "VI IMproved (VIM)" — vi с окошками, менюшками… Зайдите на сайт http://www.vim.org, скачивайте и наслаждайтесь!

     

     

     

    Оставьте комментарий