Это памятка по основам Vim (Vi). Маленькая инструкция для помощи читателям в более эффективном использовании редактора Vim (Vi). Эта часть содержит простые команды Vim (Vi).
Vim (Vi) — это ориентированный на использование в командной строке редактор, изначально созданный для операционной системы Unix.
Vim и Vi — это не одно и то же. Vim — это продвинутая версия Vi, которая при простом использовании ведёт себя также, но поддерживает разнообразные плагины, значительно расширяющие функционал редактора.
Если вы работаете в графическом окружении рабочего стола, вы можете использовать gvim.
Режимы
Vim (Vi) два режима: режим вставки и режим команд. Редактор загружается в командном режиме, в нём можно перемещать курсор, вставлять и удалять текст. Режим вставки включается командами вставки или изменения текста. [ESC] возвращает нас в командный режим (здесь вы можете выйти из программы, например, набрав :q!). Большинство команд выполняются сразу при вводе, за исключением команд с двоеточием, которые выполняются при нажатии [Enter].
Выход
: x
|
Выход, сохранение изменений
|
:q
|
Если не было сделано изменений
|
:wq
|
Выход и сохранить изменения, если они были сделаны
|
:q!
|
Выход и игнорировать какие-либо изменения
|
:w
|
Сохранение без выхода
|
Вставка текста
i
|
Вставка перед курсором
|
I
|
Вставка перед строкой
|
a
|
Добавление после курсора
|
A
|
Добавление после строки
|
o
|
Создать новую строку после текущий
|
O
|
Создать новую строку перед текущей
|
r
|
Заменить один символ
|
R
|
Заменить много символов
|
Движение
h
|
Двигаться влево
|
j
|
Двигаться вниз
|
k
|
Двигаться вверх
|
l
|
Двигаться вправо
|
w
|
Двигаться к следующему слову
|
W
|
Двигаться к следующему пробелу
|
b
|
Двигаться к началу слова
|
B
|
Двигаться к началу пробельного разделителя
|
e
|
Двигаться к концу слова
|
E
|
Двигаться к концу (деление по пробелам)
|
(
|
Двигаться на одно предложение назад
|
)
|
Двигаться на одно предложение вперёд
|
{
|
Двигаться на один параграф назад
|
}
|
Двигаться на один параграф вперёд
|
0
|
Двигаться на начало линии строки
|
$
|
Двигаться на конец строки
|
1G
|
Двигаться к первой строке файла
|
G
|
Двигаться к последней строке файла
|
nG
|
Двигаться к н-ной строке файла
|
:n
|
Двигаться к н-ной строке файла
|
fc
|
Move forward to c
|
Fc
|
Move back to c
|
H
|
Двигаться наверх экрана
|
M
|
Двигаться к середине экрана
|
L
|
Двигаться к низу экрана
|
%
|
Двигаться к парной скобке и обратно ( ), { }, [ ]
|
^g
|
Показать текущую строку и имя файла
|
Удаление текста
Почти все команды удаления выполняются набором d за которой следует движение. Например, dw удаляет слово. Ещё несколько примеров:
|
x
|
Удаляет символ справа от курсора
|
X
|
Удаляет символ слева от курсора
|
D
|
Удаляет до конца строки
|
dd
|
Удаляет текущую строку
|
:d
|
Удаляет текущую строку
|
Копирование текста
Наподобие удаления, все команды копирования выполняются через y за которой можно задать движение. Например, y$ копирует до конца строки. Ещё парочка команд копирования:
|
yy
|
Копирует текущую строку
|
:y
|
Копирует текущую строку
|
Изменение текста
Команда изменения - это команда удаления, которая переводит редактор в режим вставки. Она выполняется набором c за которой следует движение. Например, cw изменяет слово. Ещё немного изменения с этой командой:
|
C
|
Изменить до конца строки
|
cc
|
Изменить всю строку
|
Вставка текста
p
|
Вставить после позции или после строки
|
P
|
Вставить перед позицией или перед строкой
|
Буферы
Именные буферы могут быть заданы перед удалением, изменением, копированием или командой вставки. Обычно префикс имеет вид “c где c - любой символ нижнего регистра. например, “adw удаляет слово в буфер a. После этого из буфера можно вставить соответствующей командой “ap.
|
Маркеры
Именные маркеры могут быть установлены на любую строку в файле. Любая буква нижнего регистра может быть именем маркера. Маркеры могут быть также использованы в качестве пределов для диапазонов.
|
mc
|
Установить маркер c на эту строку
|
`c
|
Перейти к началу маркера c строки.
|
‘c
|
Перейти к непробельному символу маркера c строки.
|
Поиск строк
/строка
|
Поиск строки вперёд
|
?строка
|
Поиск строки назад
|
n
|
Поиск следующего вхождения строки
|
N
|
Поиск предыдущего вхождения строки
|
Замена
Поиск и замена выполняются командой :s. Часто она используется в комбинации с диапазоном или командой :g (ставится после).
|
:s/было/стало/флаги
|
Замена было на стало с учётом флагов
|
g
|
Флаг – Замена всех вхождений было
|
c
|
Флаг – Подтвердить замены
|
&
|
Повторить последнюю команду :s
|
Регулярные выражения
. (dot)
|
Любой одиночный символ кроме новой строки
|
*
|
Ноль или более любых символов
|
[…]
|
Любой одиночный символ из заданных в наборе (вместо точек)
|
[^…]
|
Любой одиночный символ кроме тех, которые заданы в наборе
|
^
|
Анкор - начало строки
|
$
|
Анкор - конец строки
|
\<
|
Анкор - начало слова
|
\>
|
Анкор - конец слова
|
\(…\)
|
Группировка - обычно используется для группировки условий
|
\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
Во второй позиции, набор, содержащий все буквы
|
Примеры регулярных выражений
/Hello/
|
Соответствует, если содержит Hello
|
/^TEST$/
|
Соответствует, если строка точно равна значению TEST
|
/^[a-zA-Z]/
|
Соответствует, если начинается с любой буквы
|
/^[a-z].*/
|
Соответствует, если первый символ строки a-z и есть один или более символов следующими за ним
|
/2134$/
|
Соответствует, если строка оканчивается на 2134
|
/\(21|35\)/
|
Соответствует, если строка содержит 21 или 35
Обратите внимание на использование ( ) с символом трубы для обозначения условия ‘или’
|
/[0-9]*/
|
Соответствует, если в строке есть ноль или большее количество цифр
|
/^[^#]/
|
Соответствует, если в строке первый символ не #
|
Обратите внимание:
1. Регулярные выражения чувствительны к регистру
2. Регулярные выражения используется где задан шаблон
|
Счётчики
Почти каждой команде может предшествовать число, которое определяет, сколько раз она должна быть выполнена. Например, 5dw удалит 5 слов, а 3fe переместит курсор на третье вхождение буквы e. Даже вставка может быть удобно повторена этим методом, скажите вставить 100 линий одного и того же.
|
Диапазоны
Диапазоны могут предшествовать большинству командам с двоеточиями и заставляют их быть выполненными на строке или на строках. Например :3,7d удалит строки 3-7. Диапазоны обычно комбинируются с командой :s для выполнения замены на нескольких строках, например так :.,$s/pattern/string/g для выполнения замены от текущей строки до конца файла.
|
:n,m
|
Диапазон – Строки n-m
|
:.
|
Диапазон – Текущая строка
|
:$
|
Диапазон – Последняя строка
|
:’c
|
Диапазон – Маркер c
|
:%
|
Диапазон – Все строки в файле
|
:g/pattern/
|
Диапазон –Все строки, которые содержат pattern
|
Файлы
:w файл
|
Записать в файл
|
:r файл
|
Прочитать файл после строки
|
:n
|
Перейти к следующему файлу
|
:p
|
Перейти к предыдущему файлу
|
:e файл
|
Редактировать файл
|
!!программа
|
Заменить строку выводом из программы
|
Другое
~
|
Переключает на большую и маленькую букву
|
J
|
Объединяет строки
|
.
|
Повторяет последнюю команду изменения текста
|
u
|
Отменяет последнее изменение
|
U
|
Отменяет все изменения на строке
|
^R
|
Отмена отмены
|
Добрый день!
Как в vi (или в vim) выполнить поиск по регулярному выражению без замены?
Приветствую! Поиск, о котором рассказано в этой статье, работает как с обычными строками, так и с регулярными выражениями.
То есть в режиме ввода команд нужно нажать двоеточие, затем слэш и затем ввести регулярное выражение.
К примеру, мне нужно найти строку, которая начинается на abc, дальше идут любые символы, а заканчивается строка на xyz. Тогда регулярным выражением будет abc.*xyz
Для поиска по этому регулярному выражению мне нужно ввести:
По умолчанию никакие действия, в том числе замена, не выполняются. Для перехода к следующим результатам поиска, используйте n.
Спасибо огромное! Почему-то год не мог найти ответ на этот вопрос. То есть везде пишут как делать замену с помощью регулярного выражения или про поиск по слешу (без двоеточия), который не поддерживает регулярные выражения. А про поиск с регулярными выражениями Вы первый ответили ))