Редактор vi (либо его более современная версия vim — VI IMproved) существует во всех реализациях Unix. Кроме того, редактор vi используется многими программами в качестве «дежурного» редактора. Это связано с тем, что vi умеет делать очень много при весьма скромных размерах и почти нулевых требованиях к ресурсам компьютера.иду
Однако при своих размерах vi может редактировать несколько файлов одновременно; делать подсветку синтаксиса множества языков программирования; осуществлять поиск и замену текста; выделять блоки текста, сохранять их в нескольких буферах и вставлять по требованию, и многое другое.
С другой стороны, из-за необходимости иметь небольшой размер (а также в силу исторических традиций) vi имеет весьма своеобразный интерфейс (см. рисунок).
несколько файлов одновременно; делать подсветку синтаксиса множества языков программирования; осуществлять поиск и замену текста; выделять блоки текста, сохранять их в нескольких буферах и вставлять по требованию, и многое другое. С другой стороны, из-за необходимости иметь небольшой размер (а также в силу исторических традиций) \texttt{vi} имеет весьма своеобразный интерфейс (как показано на рисунке 1). \begin{figure}[tb] {}\hrulefill{}\vspace*{-5mm} \input{vi_example} \vspace*{-5mm}{}\hrulefill{} \caption{Рабочий экран редактора \texttt{vi}.}\label{vi} \end{figure} ~ ~ ~ ~ ~ ~ ~ -- INSERT -- 47,3 Bot |
Рисунок 1. Рабочий экран редактора vi. Символы «~» отмечают строки экрана, следующие за последней строкой редактируемого текста. |
Основная часть экрана отдана области, в которой отображается текст и производится его редактирование. Кроме того, на рисунке видна строка внизу экрана, в которой отображается состояние редактора, положение курсора в тексте, отображаются вводимые команды и сообщения редактора. Необычность vi-интерфейса заключается в наличии нескольких режимов работы редактора, каждый из которых отвечает за какое-то определённое действие, связанное с редактированием текста. При этом нажатие одной и той же клавиши может приводить к разному результату в зависимости от режима, в котором находится vi.
Основные режимы работы редактора vi
Обычный режим (Normal mode).
Режим, в котором осуществляются основные операции редактирования: перемещение по тексту; удаление символов, слов, предложений; поиск и замена. Также в этом режиме производятся операции по открытию файла для редактирования, его сохранению на диске, выход из редактора. Режим используется по умолчанию.
Возврат в обычный режим из любого другого осуществляется нажатием клавиши <Esc>.
Все действия в обычном режиме осуществляются с помощью команд, которые можно разделить на два типа по способу ввода: команды, которые начинаются с символа «:» (двоеточие), требуют ввода клавишей <Enter> по окончании набора; остальные команды выполняются непосредственно после нажатия соответствующей клавиши или клавиатурной последовательности.
Выход из редактора осуществляется командой :q, если в буферах редактора нет несохранённых фрагментов текста. При наличии таких фрагментов редактор выведет сообщение об этом в нижней строке. Если мы действительно хотим выйти из редактора без сохранения изменений, следует набрать более сильную команду :q!.
Если редактируемый фрагмент является файлом и уже имеет имя, то сохранить его можно командой :w. Можно выйти из редактора с сохранением редактируемых фрагментов, объединив команды: :wq. Команда сохранения является весьма гибкой. Так, мы можем сохранить текст в файл с заданным нами именем (команда :w имя), сохранить фрагмент текста, начиная со строки n1 до строки n2 (:n1,n2w имя).
Также имеется возможность проверить, существует ли файл с таким именем в текущем каталоге с помощью команды :!ls и изменить текущий каталог (:cd имя).
Начать редактирование нового файла можно командой :e имя (команда может быть усилена восклицательным знаком — :e имя, — начать новое редактирование без сохранения текущего буфера). Ещё одна интересная возможность — вставить файл в редактируемый буфер по месту, определяемому указателем. Это достигается командой :r имя.
При вводе имён файлов и каталогов можно использовать дополнение имени с помощью клавиши табуляции (<Tab>). Однако в отличие от оболочки, в редакторе vi дополнение производится не до совпадающей части имён, а до первого встретившегося имени. Вторая полезная возможность — история команд. После вызова командной строки (клавиша <:>) клавишами <?> (стрелка вверх) и <?> (стрелка вниз) мы можем перемещаться по списку набранных команд, редактировать ранее набранные команды и выполнять их.
Перемещение по тексту может осуществляться очень избирательно. Имеется возможность переместиться на один символ, слово, предложение, строку, абзац, экран. В следующей таблице собраны команды, отвечающие за перемещение по тексту.
Таблица 1. Команды редактора vi для перемещения по тексту в обычном режиме. | |
Команда | Описание |
---|---|
l (эль) или <?> или <Пробел> | Следующий символ (перемещение вправо). |
h или <?> | Предыдущий символ (перемещение влево). |
k или <?> | Предыдущая строка (перемещение вверх). |
j или <?> | Следующая строка (перемещение вниз). |
$ или <End> | Конец строки. |
0 (ноль) или <Home> | Начало строки. |
L (<Shift>+<L>) | Последняя строка экрана. |
M | Средняя строка экрана. |
H | Первая строка экрана. |
F | Следующий экран. |
B | Предыдущий экран. |
G | Последняя строка текста. |
nG | n-ная строка текста. |
^G (<Ctrl>+<G>) | Информация о положении в тексте. |
+ или <Enter> | Первый непробельный символ следующей строки. |
- | Первый непробельный символ предыдущей строки. |
e | Конец текущего слова. |
b | Начало слова. |
w | Следующее слово. |
) | Начало следующего предложения текущего абзаца. |
( | Начало текущего предложения. |
} | Начало следующего абзаца. |
{ | Начало текущего абзаца. |
Многие команды допускают использование «повторителя» — целого числа перед вводом команды, указывающего количество повторений вызываемой команды. Так, команда 3w вызовет переход к третьему слову от текущего, а 15( — переход на пятнадцать предложений назад.
vi обладает не менее богатыми возможностями поиска по тексту. Команды поиска собраны в таблицу.
Таблица 2. Команды редактора vi для организации поиска и замены (обычный режим) | |
Команда | Описание |
---|---|
fсимвол | Поиск в текущей строке соответствующего символа справа от курсора. |
Fсимвол | Поиск в текущей строке соответствующего символа слева от курсора. |
/образец | Поиск образца вперёд по тексту. |
?образец | Поиск образца назад по тексту. |
n | Повтор последнего поиска. |
N | Повтор последнего поиска в противоположном направлении. |
% | Поиск пары к текущей скобке. |
:s/образец/замена | Однократный поиск образца и замена его на замену вперёд по тексту. |
:s/образец/замена/g | Поиск и замена каждого образца в строке. |
:n1,n2s/образец/замена/g | Поиск и замена каждого образца в строках от n1 до n2. |
:%s/образец/замена/g | Поиск и замена каждого образца в тексте. |
После вызова «поисковой» командной строки (клавиши и <?>) появляется возможность перемещаться по истории поисков.
Также в обычном режиме производится часть операций удаления и операции вставки. Далее в таблице приведены команды, которые можно использовать для различного вида удалений текста.
Таблица 3. Команды редактора vi для удаления (обычный режим) | |
Команда | Описание |
---|---|
x или <Delete> | Удаление текущего символа. |
X или <Backspace> | Удаление предыдущего символа. |
dw | Удаление символов от текущей позиции до конца слова. |
D или d$ | Удаление символов от текущей позиции до конца строки. |
dd | Удаление текущей строки. |
Команда d означает удаление и может быть уточнена указанием типа удаления (например, d{ предписывает удалить текст от текущего положения курсора и до начала абзаца). Также команда может быть уточнена количественно с помощью повторителя: команда 5d) удалит пять следующих предложений, начиная с текущей позиции курсора.
Удалённый текст по умолчанию помещается в неименованный регистр. Неименованный регистр — это один из контейнеров vim для хранения удалённых или скопированных фрагментов текста. Кроме неименованного регистра, предназначенного для хранения последнего удалённого или скопированного фрагмента, существует ещё множество иных регистров.
Так, десять нумерованных регистров имеют имена от "0 до "9 и организуют «стек», в котором хранятся удалённые фрагменты: последний фрагмент в регистре "0, предпоследний — в регистре "1 и так далее. Каждая операция удаления последовательно сдвигает фрагменты в нумерованных регистрах, фрагмент из регистра "9 при этом утрачивается.
Двадцать шесть именованных регистров с именами от "a до "z используются только тогда, когда указаны пользователем и предназначены для длительного хранения фрагментов.
Использование регистров происходит в виде "имя действие, где имя — это буква или цифра именованного регистра, а действие задаётся командой d для удаления текста, y для копирования или p для вставки фрагмента из регистра. Если имя регистра не указано (или указано имя ""), действие производится с неименованным регистром.
Таким образом, команда y скопирует текущий символ в неименованный регистр, команда "add удалит текущую строку в регистр "a, а команда "ap вставит эту строку в текст.
Использование неименованного регистра позволяет с лёгкостью производить некоторые удобные операции. Так, команда xp поменяет местами текущий и следующий символы, а команда ddp — текущую и следующую строки.
Режим вставки (Insert mode).
Используется для вставки текста, в том числе, и набираемого с клавиатуры. В этом режиме в нижней строке экрана появляется сообщение --INSERT--, как это показано на первом рисунке.
Переключение в режим вставки может осуществляться несколькими способами. Так, команда a переключает в режим вставки, в котором текст начинает вводится справа от текущего положения курсора (со следующего символа), а команда i или клавиша <Insert> начинает ввод текста слева от курсора (то есть по его текущему положению).
Также имеется возможность начать вставку текста с начала текущей строки (команда I), с её конца (A) или вставить новую пустую строку и начать набор текста с неё. Команда o вставляет пустую строку после текущей, а команда O — перед ней.
Режим замещения (Replace mode).
В этом режиме происходит замена символов, отмеченных курсором, символами, вводимыми с клавиатуры. Режим помечается сообщением --REPLACE--.
Переход в режим замещения из основного режима производится командой R. Из режима вставки переключение в режим замещения производится нажатием клавиши <Insert>.
Также существует специальный режим замещения, который вызывается из основного режима командой r. Этот режим никак не помечается и позволяет заменить только один текущий символ, после чего происходит возврат в основной режим.
Визуальный режим (Visual mode).
Режим предназначен для выделения фрагментов текста, он помечается сообщением --VISUAL--.
Существует три варианта выделения фрагментов текста. Команда v позволяет выделять фрагмент посимвольно, начиная от текущего положения курсора. Команда V позволяет выделять фрагмент построчно. Команда ^V приводит к выделению фрагмента в виде прямоугольного блока.
После перехода в визуальный режим выделение фрагмента производится клавишами управления курсором (или соответствующими командами перемещения по тексту, совпадающими с командами основного режима).
С выделенным фрагментом допустимы все действия. Так, его можно скопировать в регистр (команда y), удалить (команда d, фрагмент переносится в соответствующий регистр), заменить. Например, команда «r?» (r+пробел) приведёт к тому, что каждый символ выделенного фрагмента будет замещён пробелом.
Vi в графической среде
Существует версия редактора vim для графической среды — gvim (GUI vim).
На рисунке ниже показано окно такого редактора. Основное его отличие от терминальной версии программы заключается в наличии меню и инструментальной панели, посредством которых можно выполнить многие команды. Кроме того, gvim позволяет более подробно настраивать цвета текста и редактора, а также подсветку синтаксиса.
Рисунок 2. Внешний вид gvim. |
Однако все приёмы редактирования и методы работы с редактором gvim полностью совпадают с приёмами и методами работы с терминальным vim.
Следует заметить, что редактор vim сильно перерос исходный vi в плане расширяемости. Так, например, vim поддерживает очень гибкую систему надстроек (plugins), которые подчас весьма сильно изменяют поведение редактора при работе с файлами определённого типа. Кроме того, в случае работы графического варианта gvim надстройки позволяют изменять содержимое меню для упрощения работы.