vi — универсальный редактор для LINUX-систем

Консольный редактор vi (или какой-либо из его клонов) — непременный атрибут любой LINUX-системы, вызываемый по умолчанию при общесистемных настройках. И потому любой пользователь Linux должен иметь о нем представление, хотя для повседневной работы какой-либо иной редактор может оказаться более подходящим.

Существует несколько редакторов, основанных на vi, включающих дополнительные возможности, но полностью совместимых с ним по системе базовых команд. И потому знание vi обеспечит возможность работы с любым из его клонов. Более того, если в некоей LINUX-системе вместо vi используется какой-либо из редакторов-клонов, например, vim или elvis , в каталоге /bin всегда будет представлен файл vi , являющийся символической ссылкой на реальный исполнимый файл этого редактора. Поэтому vi или его аналог всегда может быть запущен командой

vi имя_файла

хотя реально при этом запускается, например, vim . Именно так происходит в дистрибутиве ASPLinux по умолчанию, где командами vi и vim запускается один и тот же редактор — vim ( Vi IMproved ), о котором и пойдет речь в этом разделе. Подчеркнем, что ниже термины vi и vim используются как синонимы, но везде имеется в виду vim . Хотя практически все описанные приемы относятся и к классическому vi .

Редактор vim может быть запущен из командной строки оболочки в консоли или окне эмулятора терминала X Window System, с именем файла (и указанием, при необходимости, полного пути до него) или без такового. В первом случае открывается существующий файл, если он существует, или создается новый — в текущем каталоге, или в каталоге, определенном в пути к нему. Например, команда

vi .bashrc

вызовет для редактирования конфигурационный файл оболочки bash из домашнего каталога пользователя, а команда

vi ~/mytext/newtext.txt

создаст новый текстовый файл newtext.txt в подкаталоге ~/mytetxt домашнего каталога пользователя (напомним только, что каталог ~/mytetxt должен уже существовать, иначе при записи файла последует сообщение об ошибке).

Команда vi (или vim ) без имени файла откроет редакторvimи выведет заставку (рис. 10.1), после чего можно или начать работу (как — будет сказано ниже) или получить справку, набрав с клавиатуры

:help

или нажав клавишу F1 (последнее может не сработать в терминальном окне).

Рис. 10.1: Заставка редактора vim

Настоятельно рекомендуем воспользоваться этой возможностью (рис. 10.2), так как работа в vi (и в vim) может оказаться непривычной для пользователя, в частности, попытка немедленно начать ввод текста будет неудачной. Потому следует сначала ознакомиться с режимами работы vi.

В vi существует три принципиально различныхрежима работы — командный режим (command mode), режим ввода (edit mode) и т.н. ex-режим, или режим построчного редактирования (ex mode). Без четкого понимания этого работа в vi просто невозможна.

Командный режим включается по умолчанию при загрузке vi. Это, собственно говоря, интерпретатор встроенного языка редактора. В этом режиме нажатия клавиш приводят не к вводу символов, а интерпретируются как внутренние команды навигации и редактирования. Например, нажатие клавиши|~h~|вызывает перемещение курсора на один символ влево, клавиши [l] — на один символ вправо, k — на строку вверх, j — на строку вниз и т.д.

Буквенные команды командного режима работают не только при латинской, но и при кириллической раскладке клавиатуры. Однако в этом случае они должны вводиться при нажатой клавише Alt

Соответственно, создание текста в командном режиме невозможно. Для этого следует перейти в режим ввода, для чего служат клавиши командного режима a (от append) и i (от insert). Здесь нажатия клавиш приводят к вводу обычныхбуквенно-цифровых символов (после текущей позиции курсора и перед ней, соответственно), позволяя создавать новый текст или редактировать имеющийся. Хотя последнее более эффективно в командном режиме, возврат в который осуществляется клавишей Esc|.

Для операций с документами (то есть файлами) предназначен ex-режим, вы-

Рис. 10.2: Встроенная система помощи редактора vim

зываемый клавишей [7] (командного режима; в режиме ввода нажатие этой клавиши вызывает ввод двоеточия). После этого дается команда ex-режима для следующихдействий:

• открытия существующего файла ( : е имя_файла — здесь и далее символ : означает команду ex-режима) если какой-либо файл перед этим уже загружен, он будет закрыт и замещен новым;

• вставки существующего файла в позицию курсора (:г имя_файла);

• записи файла (:w), в том числе под другим именем (:w имя_файла);

• выхода из сохраненного файла (:q);

• выхода из редактора vi с предварительным сохранением измененного файла (:х).

Возможно совмещение команд ex-режима, например, :wq — выход с предварительным сохранением измененного файла (что аналогично команде :х).

Команды отправляются на исполнение нажатием клавиши Enter], после чего происходит возврат в командный режим. Однако попытка, например, закрыть редактор без сохранения изменений в редактируемом документе (командой :q) или загрузить новый файл (командой : е), не сохранив предыдущий, вызовет сообщение об ошибке. Для принудительного выполнения такихдействий команды :q и : е должны использоваться в сочетании с символом ! . Например, команда :q! закроет редактор vi, не сохранив изменений в текущем файле.

Рис. 10.3: Редактор vim в режиме ввода (обратите внимание на надпись - INSERT -внизу экрана)

Действия ex-режима частично дублируются в режиме командном. Так, для закрытия же файла (с предварительным сохранением изменений) используется последовательность ZZ командного режима, что является эквивалентом команды :wq ex-режима.

Определение текущего режима в vim несколько усовершенствовано по сравнению с исходным vi. Переход в режим ввода индицируется появлением надписи INSERT внизу экрана (рис. 10.3). При возврате в командный режим (нажатием клавиши Esc|) она исчезает. Повторное нажатие Esc в командном режиме вызывает звуковой сигнал, служащий косвенной его индикацией. Нахождение в ex-режиме фиксируется символом : в нижней части экрана.

Такая система работы может показаться запутанной начинающему пользователю. Однако она имеет глубокое внутреннее обоснование. Редактор vi создавался изначально как кросс-платформенный, который обязан работать на любыхтипахреальных и виртуальныхтерминалов. И потому все действия в нем можно осуществить, не покидая основной, алфавитно-цифровой, части клавиатуры, без обращения к дополнительным клавишам — стрелкам управления курсором, Home|, End|, PageUpI, PageDownI, Ins|, Del|, BackspaceI.

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

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

насчитывается много десятков) можно разделить на три группы:

• команды навигации,

• команды редактирования,

• команды перехода (в режим ввода).

Команды навигации служат для перемещения курсора по тексту. В консольном режимеASPLinuxдля этого могут быть использованы и обычные клавиши управления курсором (стрелки, PageUp I/I PageDown I, Home|/[~End|). Однако уже в различныхпрограммах эмуляции терминала в графическом режиме их поведение неоднозначно и зависит от настроек, а в другихLINUX-системах может быть иным. К тому же внутренние команды дают больше возможностей для навигации по тексту, чем клавиши стандартныхклавиатур.

Так, в vi можно использовать клавиши\h\и [Т], Щ и R, действие которых эквивалентно нажатиям клавиш Left и Right I, Up и Down|, соответственно. Но, кроме того, с помощью парных клавиш [w] и [w] можно переместиться вперед, соответственно, на т.н. «маленькое» слово (то есть отделенное пробелом или любым знаком препинания, символами - или +) и на «большое» слово (то есть обязательно отделенное пробелом). Пара клавиш [ь] и [в] выполняет аналогичное перемещение назад, а клавиши [е] и [Ё] перемещают курсор в конец следующего «маленького» или «большого» слова.

Вообще, для многихкоманд vi характерно наличие парных эквивалентов — в нижнем и верхнем регистрах одной клавиши ([w] и [w], [e] и [Ё]); действие второй команды из пары как бы расширяет действие первой.

Возможны также перемещения в предыдущее (](|) и последующее ([У]) предложение, в начало (|~н~|) и конец (|~l~|) экрана, в начало (|~о]— ноль) и конец (|~$~|) строки и т.д. — список навигационныхкоманд приближается к 30. Иными словами, нажатием одной клавиши или, в крайнем случае, двухклавишной комбинации (|Ctrl|+|~f~|- на следующую экранную страницы, Ctrl|+|~в~|— на предыдущую) можно переместиться в абсолютно любое заранее определенное место текстового документа.

Команды навигации vi могут использоваться с численными аргументами.

Например, команда 5h переместит курсор на 5 символов влево (считая символ в позиции курсора, а команда Зк — на три строки вверх.

Для навигации по тексту могут использоваться клавиши rj[] (минус) для перемещения на одну строку вверхи [+] (плюс) для перемещения на одну строку вниз. Особенно эффективны они в сочетании с численными аргументами: последовательность\Т\[+] перемещает курсор на семь строк вперед, а [Г][з]|3] — на тринадцать строк назад (в обоихслучаях включая строку в позиции курсора).

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

Так, наряду с удалением единичного символа в позиции курсора (Гх~|) или перед ней ([х~|), возможно удаление слова (|~d~|pw~|), строки (|~d~j[d]) или ее части перед ([d]рр~|) или после ([d] [g]) курсора, предложения (|~d~| |~)~|) или

абзаца ([d]|7]).

Как и навигационные команды, команды редактирования могут использоваться с численными аргументами. Так, последовательность [sj [d] [d] удалит текущую строку и еще пять строк вниз. А с помощью последовательности [У] [d~| fw] можно удалить три слова подряд (включая то, на котором находится курсор).

Не меньше команд отвечает за копирование фрагментов, ихвставку и замену. Например, последовательность ГуЛ [w] копирует «маленькое» слово, Гу![w~|—«большое» ГуП ГуП - строку, руП [У] — предложение, руП [JJ — абзац. Клавишей же ГрП удаленный или скопированный фрагмент вставляется в позицию курсора.

Действие ошибочно введенныхкоманд редактирования может быть отменено клавишей [u] (undo). Вторичный ввод этой команды приведет к отмене предыдущего действия, и так далее. Для возврата ошибочно отмененной операции используется комбинация клавиш Ctrl|+|~R~|.

Описание всехкоманд редактирования заняло бы слишком много места. Подчеркнем лишь, что, как и в случае с навигацией, нажатием одной-двухклавиш можно удалить, скопировать, вставить и переместить текстовый блок практически любого размера — от единичного символа до произвольного ихколичества (строки, предложения, абзаца, экранной страницы). Команды перехода могут рассматриваться как подмножество команд редактирования, после которыхвозможен ввод новыхсимволов и ихпоследовательностей. Кроме уже упомянутых [а] и [Т] (ввод после и перед курсором), к ним относятся:

• [а] — ввод текста в конец строки,

• QTJ — ввод в начало строки,

• [о] — создание новой строки под текущей с возможностью ввода в нее текста,

• [о] — создание новой строки над текущей, в которую также можно ввести текст.

Как и большинство прочихкоманд редактора vi, команды перехода могут использоваться с числовыми аргументами. Так, если нажать последовательно [JJ [а] и после этого ввести некоторую последовательность символов, по

выходе в командный режим (клавишей Esc ) она будет повторена трижды. Аналогично, ввод текста после набора числа (клавиши 0 - 9 ) с последующим нажатием O введет указанное количество идентичныхстрок.

Редактор vi располагает средствами поиска и замены текстовыхфрагментов, в том числе и с использованием регулярныхвыражений. Для этого предназначена команда ex-режима :s ( substitute ). Она дается в форме

:999s/text1/text2/опция

где 999 — количество строк, в которыхоперации поиска и замены должны осуществляться (без указания его действие команды распространяется только на текущую строку). Если поиск и замену необходимо выполнить по всему тексту документа, дается команда :%s .

Следует подчеркнуть, что если не указать заменяющего текста (и опций замены), все текстовые фрагменты, указанные в качестве заменяемого текста, будут просто удалены. Во избежание этого используются опции команды :s . Так, опция /c предписывает запрос подтверждения на замену для каждого найденного фрагмента.

И поиск, и замена в vi возможны только для последовательности символов, составляющиходну строку (то есть не содержащей символа LF ). Заменяющая последовательность символов также должна образовывать единую строку.

Возможности редактора vi описанным не исчерпываются. В частности, он (вернее, его клон vim ) поддерживает язык макрокоманд и допускает ихпротоколирование. В комплекте с редактором (в каталоге /usr/share/vim/vim60z ) имеется большое количество такихмакросов. Там же находится и детальная документация по их применению.

Еще материалы по теме: