Справочник по редактору VI
Автор Administrator   
14.06.2008 г.

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

Вступление

О, сколько раз я видел людей, в истерике ломающих клавиатуры, произносящих массу знакомых слов и спрашивающих: "А можно как-нибудь файл в винде отредактировать и засунуть обратно в 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>. Уфф... Мы сделали это!

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

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

    В принципе, для начала работы с 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? Тогда читайте дальше.

    Редактирование командной строки в 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? Тогда открывайте следующую страницу.

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

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