Справка по редактору vi

vi — это консольный текстовый редактор. Фактически стандартный для всевозможных вариантов Linux и Unix. Так что тому, кто собирается серьезно заниматься администрированием таких ОС, уметь обращаться с этой программой крайне желательно. Проблема в том, что работа с 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.

Add a Comment