Макинтош и образование

Справка по редактору 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 или :x Сохранить изменения и завершить 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.