Редактор vi — универсальный полноэкранный текстовый редактор в среде UNIX. Универсальность означает, что, во-первых, этот редактор есть во всех UNIX-подобных ОС и, во-вторых, этот редактор работает с практически любым видом терминала (ANSI, VT100, VT220, VT320, DEC, и т. д.). Эта универсальность выражается непривычным (для пользователей DOS) пользовательским интерфейсом: для управления редактором используются лишь «обычные» кнопки клавиатуры (алфавитно-цифровые символы и знаки препинания).
Имеющиеся на многих типах терминалов функциональные клавиши практически не используются. Если клавиатура терминала имеет стрелочные клавиши, то они используются, но в ограниченном контексте.
Режимы работы редактора
Ввод текста
В этом режиме все, что набирается на клавиатуре отображается на экране терминала и запоминается в буфере редактора.
В данном режиме нет возможности осуществлять операции редактирования текста, за исключением стирания последнего набранного символа (с помощью комбинации клавиш < Control-H> ).
Командный режим
В этом режиме символы клавиатуры выполняют специальные функции (перемещение курсора, стирание частей текста, и т. д.), то есть функции редактирования.
В данном режиме набираемые команды не отображаются на экране.
Режим командной строки
Режим командной строки позволяет производить более глобальные операции с текстом: записывать отредактированный текст в файл, считывать новый файл, выходить из vi, производить настройку редактора, поиск по шаблону, а также осуществлять некоторые функции редактирования.
Команды отображаются в нижней части экрана (в командной строке редактора).
Ввод текста
< Return> — создает пустую строку и переводит курсор в ее начало;
< Control-H> — уничтожает последний введенный символ (это действие не отображается на экране до выхода в командный режим);
< Control-[> или клавиша < Esc> — переводят редактор в командный режим.
В режиме ввода текста стрелочная клавиатура не работает.
Команды
i — переход в режим набора методом вставки перед текущим символом;
a — переход в режим набора методом вставки за текущим символом;
R — переход в режим набора текста методом набивки.
Перемещение курсора
h, j, k, l — на один символ (одну строку), как показано стрелками;
^ или 0 — в начало текущей строки;
$ — в конец текущей строки;
w — на слово вправо;
b — на слово влево;
} — на параграф вперед (параграф — это блок текста, отделенный пустой строкой);
{ — на параграф назад;
[[ — в начало текста;
]] — в конец текста.
Кнопки стрелочной клавиатуры также позволяют перемещаться по тексту.
Редактирование
dd — стирание текущей строки;
d<движение курсора> — стирание от текущего положения курсора до нового, задаваемого символом перемещения курсора. Нажатие кнопок стрелочной клавиатуры не является движением курсора и не может использоваться в комбинированных командах;
J — слияние текущей строки со следующей;
u — отмена последней команды;
. — повтор последней команды;
: — переход в режим командной строки.
Командная строка
:q или :q! — выход из редактора без сохранения изменений;
:x- выход из редактора с записью, если файл был модифицирован;
:w или w filename или w! filename — запись файла и возвращение в командный режим;
:e filename или :e! filename — загрузка файла filename;
:r filename — добавить содержимое указанного файла к редактируемому сразу за текущей строкой;
:set nu — включить нумерацию строк;
:set nonu — отключить нумерацию строк;
:!command — выполнить команду UNIX не покидая редактора;
:/word — выполнить поиск слова word в тексте;
:/ — повторить поиск слова word далее по тексту.
Блоки, буферы, окна редактирования. Повторители
Повторители
Командам и движениям курсора можно давать повторители (числа), например:
2w — передвинуть курсор на два слова вперед
10l — передвинуть курсор на десять символов вправо
d10l — стереть десять символов справа от курсора
2d10l — стереть двадцать символов справа от курсора
5J — слить пять последующих строк в одну
4. — повторить последнюю введенную команду четыре раза
Буферы vi
Редактор имеет три типа буферов: буфер стирания (0-9), неименованный буфер и именованные буферы (a-z).
В буферы стирания автоматически заносятся стираемые элементы. В буфере 0 хранится последний стертый элемент, в буфере 1 — предпоследний и т. д.
Занести в буфер:
yy — занести текущую строку в неименованный буфер;
yдвижение курсора — занести указанный движением курсора блок текста в неименованный буфер.
«ayy — занести текущую строку в именованный буфер a;
«Ayy — добавить текущую строку к содержимому именованного буфера a;
«by10j — занести последующие 10 строк в именованный буфер b.
Вставить из буфера:
p — вставить в текущую позицию содержимое неименованного буфера;
«ap — вставить в текущую позицию содержимое именованного буфера a;
«1p — вставить в текущую позицию содержимое буфера стирания 1.
Многооконное редактирование
Редактировать сразу несколько файлов можно либо пользуясь командной редактора :e filename, либо указав все необходимые файлы в командной строке при вызове редактора (например: vi file1 file2 file3). В последнем случае вы двигаетесь по списку файлов с помощью команд:
:n — переходим к следующему файлу в списке;
:rew — возвращаемся к редактированию первого файла в списке.
Именованные буферы сохраняют свое содержимое при переходе к редактированию другого файла.
Открыть/создать файл
vi mamapapa.txt — открыть один файл.
vi mama.txt papa.txt — открыть файл mama.txt, после выхода из него открыть файл papa.txt.
Файл открывается в командном режиме с помощью команды vi. Здесь мы можем просмотреть файл, переместиться по его содержимому, стереть текст, но внести изменения или ввести текст в этом режиме нельзя.
Создание файла происходит при помощи той же команды. Создание файла происходит в момент сохранения.
Для открытия или создания нового файла в командном режиме необходимо выполнить команду:
:e filename
Перед этим нужно сохранить предыдущий файл:
:w — сохраняет файл с существующим именем или :sav filename — «Сохранить как».
Дополнительные опции
Дополнительные возможности редактора:
Команда | Описание команды |
G | перейти в конец файла |
<number>G | перейти на конкретную строку <number> |
:<number> | перейти на <number> строк вперед |
:set nu[mber] | отобразить слева нумерацию строк (^ nonu[mber] — спрятать нумерацию) |
:set wrap | переносить длинные строки (:set nowrap — не переносить) |
:syntax on/off | включить/выключить подсветку синтаксиса |
:colorscheme <name> | задать цветовую тему (где <name> — имя темы, TAB работает как авто-дополнение) |
/мама | поиск текста «мама» в файле |
n | повторить поиск |
:h или :help | список возможной помощи (:viusage, :exusage) |
:set fileformat=dos :set fileformat=unix | привести концы строк в файле к виду dos или unix, соответственно |
:set ts=4 | задать размер табуляции в 4 пробела |