Vim
Vim — модальный текстовый редактор. Большинство действий выполняется в Normal mode, а команды часто строятся по принципу:
Например:
dw # удалить до следующего слова
ciw # изменить текущее слово
3dd # удалить 3 строки
dG # удалить от курсора до конца файла
ci" # изменить текст внутри кавычек
Режимы
| Команда | Описание |
|---|---|
Esc |
перейти в Normal mode |
i |
Insert перед курсором |
I |
Insert в начале строки |
a |
Insert после курсора |
A |
Insert в конце строки |
o |
создать строку ниже и перейти в Insert |
O |
создать строку выше и перейти в Insert |
R |
Replace mode |
v |
Visual mode |
V |
Visual Line mode |
Ctrl+V |
Visual Block mode |
: |
Command-line mode |
e! |
отмена всех изменений файла |
Навигация
Базовое перемещение
| Команда | Описание |
|---|---|
h |
влево |
j |
вниз |
k |
вверх |
l |
вправо |
w |
к началу следующего слова |
b |
к началу предыдущего слова |
e |
к концу слова |
W |
следующее WORD |
B |
предыдущее WORD |
E |
конец WORD |
word и WORD
word разделяется пробелами и знаками пунктуации.
WORD разделяется только пробельными символами.
Перемещение по строке
| Команда | Описание |
|---|---|
0 |
начало строки |
^ |
первый непробельный символ |
$ |
конец строки |
g_ |
последний непробельный символ |
Перемещение по файлу
| Команда | Описание |
|---|---|
gg |
начало файла |
G |
конец файла |
50G |
перейти на строку 50 |
:50 |
перейти на строку 50 |
{ |
предыдущий абзац |
} |
следующий абзац |
% |
перейти между парными (), [], {} |
Перемещение по экрану
| Команда | Описание |
|---|---|
H |
верх экрана |
M |
середина экрана |
L |
низ экрана |
Ctrl+F |
экран вниз |
Ctrl+B |
экран вверх |
Ctrl+D |
пол-экрана вниз |
Ctrl+U |
пол-экрана вверх |
zz |
текущую строку в центр |
zt |
текущую строку наверх |
zb |
текущую строку вниз |
Редактирование
Удаление
| Команда | Описание |
|---|---|
x |
удалить символ под курсором |
X |
удалить символ слева |
dd |
удалить строку |
D |
удалить до конца строки |
dw |
удалить до следующего слова |
de |
удалить до конца слова |
db |
удалить назад до начала слова |
d0 |
удалить до начала строки |
d$ |
удалить до конца строки |
dG |
удалить до конца файла |
dgg |
удалить до начала файла |
5dd |
удалить 5 строк |
Удаление в Vim обычно также помещает удалённый текст в регистр, поэтому его можно вставить через p.
Копирование и вставка
Копирование в Vim называется yank.
| Команда | Описание |
|---|---|
yy |
скопировать строку |
yw |
скопировать до следующего слова |
y$ |
скопировать до конца строки |
yG |
скопировать до конца файла |
3yy |
скопировать 3 строки |
p |
вставить после курсора |
P |
вставить перед курсором |
Изменение
Оператор c означает change:
удалить выбранный текст → перейти в Insert mode.
| Команда | Описание |
|---|---|
cw |
изменить до следующего слова |
ciw |
изменить текущее слово |
cc |
изменить строку |
C |
изменить до конца строки |
c$ |
изменить до конца строки |
c0 |
изменить до начала строки |
Грамматика Vim
Основные операторы:
| Оператор | Значение |
|---|---|
d |
delete |
c |
change |
y |
yank |
> |
увеличить отступ |
< |
уменьшить отступ |
= |
выровнять отступ |
gu |
lowercase |
gU |
uppercase |
Оператор можно объединить с движением:
Также можно добавить количество:
Tip
Не стоит запоминать dw, d$, dG, yw, y$ как независимые команды.
Лучше читать их как предложения:
delete + word
delete + end of line
yank + word
Text Objects
Text Objects позволяют работать не с координатами, а с логическими объектами текста.
Основные модификаторы:
| Object | Описание |
|---|---|
iw |
внутри слова |
aw |
слово вместе с окружающим разделителем |
i" |
внутри "..." |
a" |
вместе с "..." |
i' |
внутри '...' |
a' |
вместе с '...' |
i( |
внутри (...) |
a( |
вместе с (...) |
i[ |
внутри [...] |
a[ |
вместе с [...] |
i{ |
внутри {...} |
a{ |
вместе с {...} |
ip |
внутри абзаца |
ap |
абзац целиком |
it |
внутри HTML/XML-тега |
at |
HTML/XML-тег целиком |
Text Object объединяется с оператором:
diw # удалить слово
ciw # изменить слово
yiw # скопировать слово
di" # удалить содержимое кавычек
ci" # изменить содержимое кавычек
yi" # скопировать содержимое кавычек
di( # удалить содержимое ()
ci{ # изменить содержимое {}
Например:
Если курсор находится внутри IP:
получим:
и Vim сразу перейдёт в Insert mode.
Undo, Redo и повторение
| Команда | Описание |
|---|---|
u |
отменить изменение |
Ctrl+R |
вернуть отменённое изменение |
. |
повторить последнее изменение |
. особенно полезна для повторяющихся операций.
Например:
изменить слово, затем перейти к следующему:
и повторить изменение:
Поиск
| Команда | Описание |
|---|---|
/text |
искать text вперёд |
?text |
искать text назад |
n |
следующее совпадение |
N |
предыдущее совпадение |
* |
искать слово под курсором вперёд |
# |
искать слово под курсором назад |
:noh |
убрать подсветку поиска |
Поиск символа в строке
| Команда | Описание |
|---|---|
fx |
перейти к следующему x |
Fx |
найти x назад |
tx |
перейти перед следующим x |
Tx |
то же назад |
; |
повторить поиск |
, |
повторить в обратную сторону |
Эти движения можно использовать с операторами:
означает:
delete until
,
Поиск и замена
Заменить первое совпадение в текущей строке:
Все совпадения в строке:
Во всём файле:
Во всём файле с подтверждением:
В определённом диапазоне:
Visual mode
| Команда | Описание |
|---|---|
v |
выделение символами |
V |
выделение строками |
Ctrl+V |
блочное выделение |
После выделения:
| Команда | Описание |
|---|---|
d |
удалить |
y |
скопировать |
c |
изменить |
> |
увеличить отступ |
< |
уменьшить отступ |
= |
выровнять |
U |
uppercase |
u |
lowercase |
gv |
снова выделить предыдущую область |
Visual Block
Особенно полезен для конфигурационных файлов.
Есть:
Нужно получить:
Используем:
Отступы
| Команда | Описание |
|---|---|
>> |
увеличить отступ строки |
<< |
уменьшить отступ |
== |
автоматически выровнять строку |
5>> |
увеличить отступ пяти строк |
5<< |
уменьшить отступ пяти строк |
Выровнять весь файл:
Разбор:
YAML
Автоматическое форматирование не заменяет YAML-линтер. После изменения Ansible/YAML-файлов полезно дополнительно проверять их соответствующими инструментами.
Файлы
| Команда | Описание |
|---|---|
:e file |
открыть файл |
:e . |
открыть текущий каталог |
:w |
сохранить |
:w file |
записать в другой файл |
:q |
выйти |
:q! |
выйти без сохранения |
:wq |
сохранить и выйти |
:x |
сохранить изменения и выйти |
ZZ |
сохранить изменения и выйти |
ZQ |
выйти без сохранения |
:qa |
закрыть все окна |
:qa! |
выйти без сохранения изменений |
:wqa |
сохранить всё и выйти |
Buffers
Открытые файлы Vim хранит в buffers.
| Команда | Описание |
|---|---|
:ls |
список buffers |
:buffers |
список buffers |
:bn |
следующий buffer |
:bp |
предыдущий buffer |
:b 3 |
перейти к buffer №3 |
:b filename |
перейти к buffer по имени |
:bd |
удалить текущий buffer |
Split windows
Горизонтальное разделение:
или:
Вертикальное:
или:
Навигация:
| Команда | Описание |
|---|---|
Ctrl+W h |
окно слева |
Ctrl+W j |
окно снизу |
Ctrl+W k |
окно сверху |
Ctrl+W l |
окно справа |
Ctrl+W w |
следующее окно |
Ctrl+W q |
закрыть окно |
Ctrl+W = |
сделать окна одинакового размера |
Открыть файл в split:
Tabs
Tab в Vim — контейнер окон, а не просто открытый файл.
| Команда | Описание |
|---|---|
:tabnew |
новая вкладка |
:tabnew file |
открыть файл во вкладке |
gt |
следующая вкладка |
gT |
предыдущая вкладка |
2gt |
перейти ко второй вкладке |
:tabclose |
закрыть вкладку |
Marks
Mark позволяет сохранить позицию в файле.
Установить mark a:
Вернуться на строку:
Вернуться точно к позиции:
| Команда | Описание |
|---|---|
ma |
создать mark a |
'a |
перейти на строку mark |
`a |
перейти точно к позиции |
:marks |
показать marks |
История перемещений
| Команда | Описание |
|---|---|
Ctrl+O |
назад по jump list |
Ctrl+I |
вперёд по jump list |
Например, после:
можно возвращаться между посещёнными местами через:
Регистры
Vim хранит скопированный и удалённый текст в registers.
Посмотреть регистры:
или:
Скопировать строку в регистр a:
Вставить из него:
Удалить текст, не перезаписывая обычный регистр:
"_ называется black-hole register.
Системный clipboard
При наличии поддержки clipboard:
копировать в системный clipboard.
вставить из него.
Проверить поддержку:
Макросы
Макрос позволяет записать последовательность действий Vim.
Начать запись в регистр a:
Выполнить нужные действия и закончить:
Выполнить макрос:
Повторить последний макрос:
Выполнить 20 раз:
Shell-команды
Из Vim можно запускать команды Linux:
Выполнить текущий Python-файл:
% означает текущий файл.
Вставить вывод команды
или:
Вывод команды будет вставлен в файл.
Передать текст Unix-команде
Отсортировать весь файл:
Отформатировать JSON через jq:
Полезные настройки
Показать номера строк:
или:
Относительные номера:
Оба режима одновременно:
Другие полезные настройки:
:set cursorline
:set ignorecase
:set smartcase
:set hlsearch
:set incsearch
:set autoindent
:set expandtab
:set tabstop=4
:set shiftwidth=4
:set softtabstop=4
:set mouse=a
Проверить текущее значение:
Справка
Открыть справку:
Справка по конкретной команде:
Полный индекс команд:
Поиск по справке:
Минимальный набор
Команды, которые стоит сначала довести до автоматизма:
# Режимы
i I a A o O
Esc
# Навигация
h j k l
w b e
0 ^ $
gg G
# Редактирование
x
dd
D
dw
yy
p P
# Undo / Redo
u
Ctrl+R
.
# Text Objects
ciw
diw
yiw
ci"
ci'
ci(
ci[
ci{
# Visual
v
V
Ctrl+V
# Поиск
/text
n
N
*
# Отступы
>>
<<
=
# Файлы
:w
:q
:wq
:q!
# История перемещений
Ctrl+O
Ctrl+I
Как читать команды Vim
Вместо запоминания отдельных комбинаций полезнее понимать их состав:
d + iw
│ └── inside word
└────── delete
c + i"
│ └── inside quotes
└────── change
y + G
│ └── до конца файла
└────── yank
3 + dd
│ └── delete line
└────── выполнить 3 раза
Основная модель:
Например:
можно прочитать как:
удалить движение
wтри раза.
Когда эта модель становится привычной, большинство команд Vim уже не приходится запоминать как отдельные сочетания.
Настройка .vimrc
Для сохранения настроек vim на постоянной основе требуется создать файл .vimrc в домашнем каталоге пользователя