ZaLinux.ru

Памятка по Vim (Vi) - основы

Это памятка по основам 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 Отмена отмены

Рекомендуемые статьи:

3 Комментарии

  1. Nick

    Добрый день!

    Как в vi (или в vim) выполнить поиск по регулярному выражению без замены?

    1. Alexey (Автор записи)

      Приветствую! Поиск, о котором рассказано в этой статье, работает как с обычными строками, так и с регулярными выражениями.

      То есть в режиме ввода команд нужно нажать двоеточие, затем слэш и затем ввести регулярное выражение.

      К примеру, мне нужно найти строку, которая начинается на abc, дальше идут любые символы, а заканчивается строка на xyz. Тогда регулярным выражением будет abc.*xyz

      Для поиска по этому регулярному выражению мне нужно ввести:

      :/abc.*xyz

      По умолчанию никакие действия, в том числе замена, не выполняются. Для перехода к следующим результатам поиска, используйте n.

      1. Nick

        Спасибо огромное! Почему-то год не мог найти ответ на этот вопрос. То есть везде пишут как делать замену с помощью регулярного выражения или про поиск по слешу (без двоеточия), который не поддерживает регулярные выражения. А про поиск с регулярными выражениями Вы первый ответили ))

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *