Terminal

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

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