vi — это консольный текстовый редактор. Фактически стандартный для всевозможных вариантов Linux и Unix. Так что тому, кто собирается серьезно заниматься администрированием таких ОС, уметь обращаться с этой программой крайне желательно. Проблема в том, что работа с vi совершенно непохожа на то, как мы действуем в редакторах с графическим интерфейсом. И, кроме того, тут нет никаких меню, панелей кнопок и даже подсказок. Команды нужно (О, ужас!) помнить.
Предлагаю два варианта справочных таблиц: «большой» (в который я постарался включить максимум информации) и «краткий» (с наиболее полезными, на мой взгляд, командами).
Содержание
- Запуск/завершение
- Статус
- Режимы
- Вставка текста
- Перемещение
- Удаление текста
- Копирование в буфер
- Изменение текста
- Вставка из буфера
- Буферы
- Маркеры
- Поиск/замена
- Регулярные выражения
- Счетчики
- Диапазоны
- Обращение к Shell
- Файлы
- Режимы VI
- Макросы
- Прочее
Совет: Перед любыми действиями с документом введите следующую команду:
:set showmode
Запуск и завершение VI
Запуск VI | |
vi filename | Открыть файл filename для редактирования |
view filename | Открыть файл filename для просмотра |
vi -r filename | Открыть последнюю сохраненную версию filename после аварийного выхода |
vi + n filename | Открыть filename и поместить курсор на строку n |
vi + filename | Открыть filename и поместить курсор на последнюю строку |
vi +/string filename | Открыть filename и поместить курсор на первое вхождение string |
vi filename file2 … | Открыть filename, затем file2 … Переход к следующему файлу — :n |
Завершение VI | |
ZZ или :wq или :х | Сохранить изменения и завершить VI |
:w | Сохранить изменения в текущем файле |
:w! | Безусловно сохранить текущий файл |
:w file | Сохранить текущий файл под именем file |
:w! file | Безусловно сохранить файл под именем file |
:n,mw file | Сохранить строки с n до m в file |
:n,mw >>file | Сохранить строки с n до m в конец file |
:q | Завершить VI, предупредив при необходимости сохранения |
:q! | Завершить VI без сохранения |
:e! | Начать редактирование снова (отменив несохраненные изменения) |
:we! | Сохранить и продолжить редактирование |
Статус
:.= | Номер текущей строки |
:= | Количество строк в файле |
CTRL-G | Имя файла, номер строки, общее число строк и положение в файле (%) |
l | Спецсимволы в текущей строке: tab (^l), backslash (\), backspace (^H), newline ($), bell (^G), formfeed (^L^) |
Режимы
VI работает в командном режиме и режиме ввода. Сразу после запуска редактор находится в командном режиме, в котором можно перемещаться по тексту, выполнять копирование и вставку текста из буфера. Режим ввода включается по командам вставки, дополнения, замены. Нажатие [ESC] возвращает редактор в командный режим. Большинство команд выполняется сразу после нажатия клавиши. Исключение — команды, начинающиеся с двоеточия, которые выполняются после нажатия [Return].
Вставка текста
i | Вставка перед курсором |
I | Вставка перед строкой |
a | Добавление за курсором |
A | Добавление после строки |
o | Новая строка после текущей |
O | Новая строка перед текущей |
r | Заменить символ на символ |
R | Замена символов (режим замены) |
CTRL-v char | вставка управляющих символов (например, ESC и CTRL) до нажатия ESC |
Внимание: коды CTRL-Q и CTRL-S обрабатываются операционной системой до передачи VI, поэтому их ввести невозможно. | |
:r file | Вставить содержимое file после текущей строки |
:nr file | Вставить содержимое file после строки n |
В режиме ввода: | |
CTRL-i или TAB | Вставить смещение вправо на shift width |
CTRL-d | Уменьшить смещение вправо на shift width |
CTRL-h или Backspace | Удалить предыдущий символ |
CTRL-w | Удалить предыдущее слово |
CTRL-u | Удалить предыдущую строку |
CTRL-x | Удалить от начала вставленного текста |
CTRL-v | Вставить следующий спецсимвол (т. е. для вставки CTRL-H нужно нажать CTRL-v CTRL-h) |
Перемещение по тексту
h | Влево |
j | Вниз |
k | Вверх |
l | Вправо |
«стрелки» | Перемещение по тексту (в больших файлах работает медленно, в некоторых конфигурациях может работать некорректно). |
w | К следующему слову |
W | К следующему слову (по пробелам) |
b | К началу слова |
B | К началу слова (по пробелам) |
^ | К первому непробельному символу строки |
+ или <cr> | К первому символу следующей строки |
— | К первому непробельному символу предыдущей строки |
e | К концу слова |
E | К концу слова (по пробелам) |
( | К началу предложения |
) | К концу предложения |
{ | К началу абзаца |
} | К концу абзаца |
Примечание: абзацы разделяются пустой строкой. | |
0 или | | К началу строки |
n| | К позиции n текущей строки |
$ | В конец строки |
1G | К первой строке файла |
G | К последней строке файла |
nG или :n | К n-ой строке файла |
fc | Вперед к символу c |
Fc | Назад к символу c |
H | К верхней строке экрана |
nH | К n-ой строке от начала экрана |
M | К средней строке экрана |
L | К нижней строке экрана |
nL | К n-ой строке от конца экрана |
CTRL-d | Прокрутка вниз на пол-экрана |
CTRL-f | Прокрутка вниз на экран |
CTRL-u | Прокрутка вверх на пол-экрана |
CTRL-b | Прокрутка вверх на экран |
CTRL-e | Прокрутка на строку вниз |
CTRL-y | Прокрутка на строку вверх |
CTRL-l | Обновить экран |
z <cr> | Сделать текущую строку верхней строкой экрана |
nz | Сделать строку n верхней строкой экрана |
z. | Сделать текущую строку средней строкой экрана |
nz. | Сделать строку n средней строкой экрана |
z- | Сделать текущую строку нижней строкой экрана |
nz- | Сделать строку n нижней строкой экрана |
% | К парной скобке: ( ), { }, [ ] |
Удаление текста
Большинство команд удаления образуются из символа d и команды перемещения. Например, dw удаляет слово. Другие команды удаления:
x | Удалить текущий символ |
nx | Удалить n символов вправо, начиная с текущего |
X | Удалить символ слева от курсора |
nX | Удалить n символов влево от курсора |
D | Удалить до конца строки |
d$ | Удалить от курсора до конца строки |
dd или :d | Удалить текущую строку |
ndw | Удалить следующие n слов, начиная с текущего |
ndb | Удалить предыдущие n слов, начиная с текущего |
ndd | Удалить следующие n строк, начиная с текущей |
:n,md | Удалить строки с n до m |
dMotion_cmd | Удалить все, что захватывает команда перемещения (например, dG удаляет текст от текущей позиции до конца файла, а d4 — до конца 4-го предложения). |
«(a-z)ndd | Вырезать n строк в именованный буфер (от a до z) |
«(a-z)dd | Вырезать текущую строку в именованный буфер (от a до z) |
«np | Отменить n-е из последних удалений (последние 9 удалений хранятся в буфере) |
«1pu.u. | Просмотр буфера удалений, пока не будет возвращено нужное (повторить — u.) |
Копирование в буфер
Подобно командам удаления, большинство команд копирования в буфер состоят из символа y и команды перемещения. Например, y$ помещает в буфер конец строки.
yy или :y | Копировать текущую строку |
nyy или nY | Копировать n строк |
yMotion_cmd | Копировать текст, захватываемый командой перемещения (например, yG копирует все от текущей позиции курсора до конца файла, а y4 — до конца текущего предложения) |
«(a-z)nyy | Копировать n строк в именованный буфер (от a до z) |
«(a-z)yy | Копировать текущую строку в именованный буфер (от a до z) |
Изменение текста
Команды изменения действуют как команды удаления с последующим переводом в режим ввода. Большинство из них состоит из символа c и команды перемещения. Например cw заменяет слово.
C | Заменить от курсора до конца строки |
cc или S | Заменить всю текущую строку |
xp | Обменять символ над курсором и следующий |
s | Заменить текущий символ |
cw | заменить текущее слово |
cMotion_cmd | Заменить текст, захватываемый командой перемещения |
<< или >> | Сдвинуть строку влево/вправо на shift width (по умолчанию — 8 позиций) |
n<< или n>> | Сдвинуть n строк влево/вправо на shift width (по умолчанию — 8 позиций) |
<Motion_cmd или >Motion_cmd | Сдвинуть строки, захватываемые командой перемещения, влево/вправо |
Вставка из буфера
p | Поместить текст из буфера после курсора |
P | Поместить текст из буфера перед курсором |
«(a-z)p или «(a-z)P | Поместить текст из буфера (от a до z) после/перед текущей строкой |
Буферы
Имя буфера может быть указано перед любой командой удаления, изменения, копирования или вставки. Префикс имеет вид «c, где c — любой символ нижнего регистра. Например, «adw удаляет слово и помещает его в буфер a. Затем его можно будет поместить в текст по команде «ap.
Маркеры
Именованный маркер можно установить на любой строке текста. Именем маркера может быть любой символ нижнего регистра. Маркеры могут использоваться как границы диапазонов.
mc | Установить на строку маркер c |
`c | К началу строки с маркером c |
‘c | К первому непробельному символу строки с маркером c |
Поиск/замена подстрок
/str | Поиск str вперед от курсора |
?str | Поиск str назад от курсора |
n | Повторить поиск в том же направлении |
N | Повторить поиск в обратном направлении |
% | Поиск парной скобки: ( ) [ ] или { } |
fc | Поиск символа c по текущей строке вперед |
Fc | Поиск символа c по текущей строке назад |
tc | Поиск символа c по строке вперед, курсор устанавливается на предыдущий символ |
Tc | Поиск символа c по строке назад, курсор устанавливается на предыдущий символ |
:set ic | Игнорировать регистр при поиске |
:set noic | Учиитывать регистр при поиске |
:n,ms/str1/str2/opt | Искать строку str1 со строки n до m (n и m могут быть опущены); заменить str1 на str2; с опциями opt. Возможные опции: g — глобальный, c — подтверждать замены (y — заменить, <cr> — не заменять), p — печатать измененные строки |
& | Повторить последнюю команду :s |
:g/str/cmd | Выполнить команду cmd для каждой строки, содержащей str |
:g/str1/s/str2/str3/ | Найти строку, содержащую str1, заменить str2 на str3 |
:v/str/cmd | Выполнить команду cmd для каждой строки, не содержащей str |
; | Повторить поиск |
, | Повторить поиск в обратном направлении |
Регулярные выражения
. (точка) | Любой символ, кроме «новой строки» |
* | 0 или более вхождений любого символа |
[…] | Любой из указанных символов |
[^…] | Любой из символов, кроме указанных |
\< | Строго в начале слова |
\> | Строго в конце слова |
^ | В начале строки |
$ | В конце строки |
\(…\) | Группа условий |
\n | Значение n-ой группы |
\ | Отмена значения спецсимвола (например, \$ позволяет искать символ $) |
\\ | Отмена особого действия символа \ |
[…] — Примеры | |
[A-Z] | Заглавные буквы от A до Z |
[a-z] | Строчные буквы от a до z |
[0-9] | Все цифры от 0 до 9 |
[./=+] | Множество, состоящее из . (точки), / (наклонной черты), = и + |
[-A-F] | Буквы от A до F и минус (минус должен быть указан первым) |
[0-9 A-Z] | Цифры, пробел и заглавные буквы |
[A-Z][a-zA-Z] | В первой позиции любая заглавная буква. Во второй позиции любая буква (заглавная или строчная) |
[a-z]{m} | Поиск m вхождений строчных букв |
[a-z]{m,n} | Поиск от m до n вхождений строчных букв |
Примеры регулярных выражений | |
/Hello/ | Строка, содержащая «Hello» |
/^TEST$/ | Строка, точно совпадающая с «TEST» |
/^[a-zA-Z]/ | Строка, начинающаяся с любой буквы |
/^[a-z].*/ | Первый символ строки — cтрочная буква a-z, за которой следует не менее одного символа |
/2134$/ | Строка, заканчивающаяся на «2134» |
/\(21|35\)/ | Строка, содержащая 21 или 35. Обратите внимание на ( ) и символ вертикальной линии для обозначения операции ИЛИ |
/[0-9][0-9]*/ | Строка, содержащая 1 или более цифр |
/^[^#]/ | Строка, начинающаяся не с «#» |
Заметьте: регулярные выражения чувствительны к регистру символов |
Счетчики
Практически перед любой командой можно указать количество ее повторений. Например, 5dw приведет к удалению 5 слов, а 3fe — к перемещению курсора вперед на 3-е вхождение символа «e». Подобным образом можно действовать и с командами вставки, например, вставить 100 одинаковых строк.
Диапазоны
Перед большинством команд, начинающихся с двоеточия, может быть указан диапазон строк, на которые эта команда будет действовать. Например, :3,7d служит для удаления строк 3-7. Диапазоны обычно используются с командой :s для замены в нескольких строках, например, :.,$s/pattern/string/g выполнит замены с текущей строки до конца файла.
:n,m | Строки с n до m |
:. | Текущая строка |
:$ | Последняя строка |
:’c | Строка с маркером c |
:% | Все строки файла |
:g/pattern/ | Все строки, содержащие pattern |
Обращение к Shell
:! cmd | Выполнить команду cmd; возможно использование спецсимволов:
% — имя текущего файла # — имя последнего обработанного файла |
!! cmd | Выполнить команду cmd; результат поместить в документ, начиная с текущей строки |
:!! | Выполнить последнюю команду интерпретатора команд |
:r! cmd | Reads and inserts output from cmd |
:f file | Переименовать текущий файл в «file» |
:w !cmd | Назначить текущий файл в качестве входного для команды cmd и исполнить ее |
:cd dir | Сменить рабочую директорию на dir |
:sh | Временно перейти в shell (Возврат в редактор -CTRL-d) |
:so file | Прочесть и исполнить команды файла file (file является сценарием shell) |
!Motion_cmd | Передать текст, захватываемый командой перемещения команде shell cmd |
!}sort | Отсортировать строки с текущей до конца абзаца |
Файлы
:w file | Записать в файл file |
:r file | Вставить содержимое file после текущей строки |
:n | К следующему файлу |
:p | К предыдущему файлу |
:e file | Редактировать файл file |
!!program | Заменить строку выходными данными program |
Режимы VI
Заметьте: вводится :set option для включения режима и :set nooption для выключения. Чтобы установить настройки для каждого запуска VI, в домашнем каталоге создается файл .exrc, содержащий данные команды без двоеточия перед ними.
:set ai | Автоматический отступ (по предыдущей строке) |
:set all | Вывести на экран все режимы |
:set ap | Выводить текущую строку после команд d c J m :s t u |
:set bf | Убирать из входных данных управляющие символы (кроме tab) |
:set dir=/tmp | Назначить /tmp каталогом временных файлов |
:set eb | Звуковой сигнал при ошибках |
:set ic | Игнорировать регистр при поиске |
:set lisp | Устанавливать отступы, как принято в Lisp |
:set list | Показывать символы табуляции (^l) и конца строки ($) |
:set magic | Позволить поиск спецсимволов (в регулярных выражениях спецсимволами будут считаться только ^ \ $ |
:set mesg | Разрешить вывод сообщений электронной почты |
:set nu :set number | Показывать номера строк |
:set report=n | Выводить сообщение, если команда изменяет более n строк (по умолчанию — 5) |
:set ro | Считать файлы «read only» |
:set scroll=n | Установить n строк для CTRL-d и z |
:set sh=shell_path | Установить shell (по умолчанию: /bin/sh) в shell_path |
:set showmode | Показывать текущий режим в нижней части экрана |
:set showmatch | Подсвечивать парную открывающую скобку при вводе закрывающей |
:set sw=n | Установить shift width в n знакомест |
:set term | Показать/установить тип терминала |
:set terse | Сокращать сообщения об ошибках |
:set timeout | Убрать односекундное ограничение для макросов |
:set tl=n | Sets significance of tags beyond n characters (0 means all) |
:set ts=n | Установить для текстового ввода размер табуляции в n |
:set wa | Исключить нормальную проверку перед записью |
:set warn | Предупреждать: «no write since last change» (последние изменения не сохранены) |
:set window=n | Установить число строк в текстовом окне в n |
:set ws | При поиске по окончании файла начинать сначала |
:set wm=n | Установить размер правого поля для автопереноса. Для отключения автопереноса n=0 |
Макросы
Примечания:
- Файл «.exrc» в домашнем каталоге может содержать набор макросов, используемый при каждом запуске VI (записываются аналогично командам определения макросов, но без двоеточия).
- Чтобы включить в макрос управляющий символ, например, ESC, следует предварительно нажать CTRL-v.
- Чтобы включить в макрос кавычки («), перед ними набирается \ (backslash).
- Неиспользуемые в vi клавиши: K V Z g q v * = [ ] @ # и функциональные.
Пример (выделены команды VI, которые будут включены в макрос):
:map v /I CTRL-v ESC dwiYou CTRL-v ESC ESC
Действие макроса: При нажатии v найти «I» (/I ESC), удалить слово (dw) и вставить «You» (iYou ESC). CTRL-v нужно для вставки кода ESC
:map key cmd_seq | Назначить клавише key исполнение макроса cmd_seq |
:map | Показать в строке состояния все имеющиеся макросы |
:unmap key | Удалить макрос |
:ab str string | При вводе сокращения str заменить его на string |
:ab | Показать все сокращения |
:una str | Отменить сокращение str |
Прочее
~ | Смена регистра символа над курсором |
J | Слияние следующей строки с текущей |
nJ | Слияние n строк |
. | Повторить последнюю команду, изменяющую текст |
u | Отменить последнее изменение |
U | Отменить все изменения в строке |
Основой данного материала явилась Advanced Vi Cheat Sheet, взятая с сайта http://www.lagmonster.org/. Информация дополнена и скорректирована с использованием книги: Стен Келли-Бутл. Введение в Unix (пер. с англ.).— М.: «ЛОРИ», 1995, а также Vi Russian FAQ.