Перейти к содержанию

Vim

Vim — модальный текстовый редактор. Большинство действий выполняется в Normal mode, а команды часто строятся по принципу:

[count] + operator + motion/text-object

Например:

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

Оператор можно объединить с движением:

d + w = dw
d + $ = d$
d + G = dG

y + w = yw
y + $ = y$

c + w = cw
c + $ = c$

Также можно добавить количество:

3dd
5dw
10j
4yy

Tip

Не стоит запоминать dw, d$, dG, yw, y$ как независимые команды.

Лучше читать их как предложения:

delete + word
delete + end of line
yank + word


Text Objects

Text Objects позволяют работать не с координатами, а с логическими объектами текста.

Основные модификаторы:

i = inside
a = around
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{     # изменить содержимое {}

Например:

server = "192.168.1.10"

Если курсор находится внутри IP:

ci"

получим:

server = ""

и Vim сразу перейдёт в Insert mode.


Undo, Redo и повторение

Команда Описание
u отменить изменение
Ctrl+R вернуть отменённое изменение
. повторить последнее изменение

. особенно полезна для повторяющихся операций.

Например:

ciw

изменить слово, затем перейти к следующему:

w

и повторить изменение:

.

Поиск

Команда Описание
/text искать text вперёд
?text искать text назад
n следующее совпадение
N предыдущее совпадение
* искать слово под курсором вперёд
# искать слово под курсором назад
:noh убрать подсветку поиска

Поиск символа в строке

Команда Описание
fx перейти к следующему x
Fx найти x назад
tx перейти перед следующим x
Tx то же назад
; повторить поиск
, повторить в обратную сторону

Эти движения можно использовать с операторами:

dt,

означает:

delete until ,


Поиск и замена

Заменить первое совпадение в текущей строке:

:s/old/new/

Все совпадения в строке:

:s/old/new/g

Во всём файле:

:%s/old/new/g

Во всём файле с подтверждением:

:%s/old/new/gc

В определённом диапазоне:

:10,20s/old/new/g

Visual mode

Команда Описание
v выделение символами
V выделение строками
Ctrl+V блочное выделение

После выделения:

Команда Описание
d удалить
y скопировать
c изменить
> увеличить отступ
< уменьшить отступ
= выровнять
U uppercase
u lowercase
gv снова выделить предыдущую область

Visual Block

Особенно полезен для конфигурационных файлов.

Есть:

server1
server2
server3
server4

Нужно получить:

#server1
#server2
#server3
#server4

Используем:

Ctrl+V
j
j
j
I
#
Esc

Отступы

Команда Описание
>> увеличить отступ строки
<< уменьшить отступ
== автоматически выровнять строку
5>> увеличить отступ пяти строк
5<< уменьшить отступ пяти строк

Выровнять весь файл:

gg=G

Разбор:

gg    # начало файла
=     # оператор выравнивания
G     # до конца файла

YAML

Автоматическое форматирование не заменяет YAML-линтер. После изменения Ansible/YAML-файлов полезно дополнительно проверять их соответствующими инструментами.


Файлы

Команда Описание
:e file открыть файл
:e . открыть текущий каталог
:w сохранить
:w file записать в другой файл
:q выйти
:q! выйти без сохранения
:wq сохранить и выйти
:x сохранить изменения и выйти
ZZ сохранить изменения и выйти
ZQ выйти без сохранения
:qa закрыть все окна
:qa! выйти без сохранения изменений
:wqa сохранить всё и выйти

Buffers

Открытые файлы Vim хранит в buffers.

vim nginx.conf docker-compose.yml inventory.yml
Команда Описание
:ls список buffers
:buffers список buffers
:bn следующий buffer
:bp предыдущий buffer
:b 3 перейти к buffer №3
:b filename перейти к buffer по имени
:bd удалить текущий buffer

Split windows

Горизонтальное разделение:

:split

или:

Ctrl+W s

Вертикальное:

:vsplit

или:

Ctrl+W v

Навигация:

Команда Описание
Ctrl+W h окно слева
Ctrl+W j окно снизу
Ctrl+W k окно сверху
Ctrl+W l окно справа
Ctrl+W w следующее окно
Ctrl+W q закрыть окно
Ctrl+W = сделать окна одинакового размера

Открыть файл в split:

:sp file
:vsp file

Tabs

Tab в Vim — контейнер окон, а не просто открытый файл.

Команда Описание
:tabnew новая вкладка
:tabnew file открыть файл во вкладке
gt следующая вкладка
gT предыдущая вкладка
2gt перейти ко второй вкладке
:tabclose закрыть вкладку

Marks

Mark позволяет сохранить позицию в файле.

Установить mark a:

ma

Вернуться на строку:

'a

Вернуться точно к позиции:

`a
Команда Описание
ma создать mark a
'a перейти на строку mark
`a перейти точно к позиции
:marks показать marks

История перемещений

Команда Описание
Ctrl+O назад по jump list
Ctrl+I вперёд по jump list

Например, после:

gg
/foo
G

можно возвращаться между посещёнными местами через:

Ctrl+O

Регистры

Vim хранит скопированный и удалённый текст в registers.

Посмотреть регистры:

:registers

или:

:reg

Скопировать строку в регистр a:

"ayy

Вставить из него:

"ap

Удалить текст, не перезаписывая обычный регистр:

"_dd

"_ называется black-hole register.

Системный clipboard

При наличии поддержки clipboard:

"+y

копировать в системный clipboard.

"+p

вставить из него.

Проверить поддержку:

:echo has('clipboard')

Макросы

Макрос позволяет записать последовательность действий Vim.

Начать запись в регистр a:

qa

Выполнить нужные действия и закончить:

q

Выполнить макрос:

@a

Повторить последний макрос:

@@

Выполнить 20 раз:

20@a

Shell-команды

Из Vim можно запускать команды Linux:

:!ls
:!pwd
:!git status

Выполнить текущий Python-файл:

:!python3 %

% означает текущий файл.

Вставить вывод команды

:r !date

или:

:r !hostname

Вывод команды будет вставлен в файл.

Передать текст Unix-команде

Отсортировать весь файл:

:%!sort

Отформатировать JSON через jq:

:%!jq .

Полезные настройки

Показать номера строк:

:set number

или:

:set nu

Относительные номера:

:set relativenumber

Оба режима одновременно:

:set number relativenumber

Другие полезные настройки:

: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

Проверить текущее значение:

:set tabstop?

Справка

Открыть справку:

:help

Справка по конкретной команде:

:help dd
:help ciw
:help CTRL-W

Полный индекс команд:

:help index

Поиск по справке:

:helpgrep buffer

Минимальный набор

Команды, которые стоит сначала довести до автоматизма:

# Режимы
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 раза

Основная модель:

[count] [operator] [motion/text-object]

Например:

3dw

можно прочитать как:

удалить движение w три раза.

Когда эта модель становится привычной, большинство команд Vim уже не приходится запоминать как отдельные сочетания.

Настройка .vimrc

Для сохранения настроек vim на постоянной основе требуется создать файл .vimrc в домашнем каталоге пользователя

syntax on
filetype plugin indent on

set number
set relativenumber

set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4

set autoindent
set smartcase
set ignorecase
set incsearch