Лаборатория кодера

Справочник · Терминал и система

Vim: выжить и полюбить

Режимы, перемещение, правка, поиск с заменой, окна и буферы, макросы и минимальный .vimrc. Сначала как выйти, потом как работать быстро.

Обновлено · 8 мин чтения

Vim открывается сам, когда вы делаете git commit без -m или правите конфиг на сервере, где больше ничего нет. Поэтому даже если вы пишете код в другом редакторе, базовый набор команд стоит знать. А если освоить чуть больше, править текст становится действительно быстро.

Как выйти

Сначала нажмите Esc, иногда два раза, чтобы точно оказаться в обычном режиме. Затем:

КомандаЧто делает
:qвыйти, если ничего не менялось
:q!выйти без сохранения
:wсохранить
:wq или :xсохранить и выйти
ZZто же, что :x, без двоеточия
:wa / :qa!сохранить все / закрыть все без сохранения
:w !sudo tee %сохранить файл, открытый без прав root (старый приём)

Режимы

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

РежимКак войтиДля чего
обычныйEscперемещение и команды
вставкаi, a, o и др.набор текста
визуальныйv, V, Ctrl+vвыделение символов, строк, блока
командная строка:сохранение, замена, настройки

Способы перейти во вставку:

КлавишаГде начнётся ввод
i / aперед курсором / после курсора
I / Aв начале / в конце строки
o / Oна новой строке ниже / выше
sудалить символ и начать ввод
S или ccзаменить всю строку

Перемещение

КлавишиКуда
h j k lвлево, вниз, вверх, вправо
w / b / eк началу следующего слова / предыдущего / к концу слова
W / Bто же по «большим» словам, разделённым только пробелами
0 / ^ / $начало строки / первый непробельный символ / конец строки
gg / Gначало / конец файла
42G или :42строка 42
Ctrl+d / Ctrl+uполэкрана вниз / вверх
%к парной скобке
f( / t(к символу ( в строке / на символ раньше него
; / ,повторить последний f или t вперёд / назад
* / #к следующему / предыдущему вхождению слова под курсором
''вернуться туда, где были перед прыжком
Ctrl+o / Ctrl+iназад / вперёд по истории прыжков

Почти перед любым движением можно поставить число: 5j опустит курсор на пять строк, 3w перескочит три слова.

Правка: оператор плюс движение

Команды правки в Vim строятся как фраза: оператор, затем куда. Выучив несколько операторов и движений, вы получаете все их сочетания.

ОператорДействие
dудалить (вырезать)
cудалить и перейти во вставку
yскопировать
> / <сдвинуть отступ
gu / gUв нижний / верхний регистр
=выровнять отступы
ПримерЧто получится
dwудалить до начала следующего слова
d$ или Dудалить до конца строки
ddудалить строку
3ddудалить три строки
cwзаменить слово
yyскопировать строку
y}скопировать до конца абзаца
>>сдвинуть строку вправо
gUiwслово под курсором в верхний регистр

Текстовые объекты

После оператора можно указать не движение, а объект: i значит «внутри», a значит «вместе с окружением».

ОбъектЧто выделяет
iw / awслово / слово с пробелом
i" / a"внутри кавычек / вместе с кавычками
i( или ibвнутри круглых скобок
i{ или iBвнутри фигурных скобок
itвнутри HTML-тега
ipабзац

ci" заменяет строку в кавычках, где бы в ней ни стоял курсор. da( удаляет скобки вместе с содержимым. yi{ копирует тело функции. Это, пожалуй, самая полезная часть Vim.

Остальное для правки

КлавишиЧто делает
xудалить символ под курсором
r + символзаменить один символ
p / Pвставить после / перед курсором
u / Ctrl+rотменить / вернуть
.повторить последнее изменение
Jприсоединить следующую строку к текущей
~сменить регистр символа
Ctrl+a / Ctrl+xувеличить / уменьшить число под курсором

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

text
/шаблон        поиск вперёд, n — следующее, N — предыдущее
?шаблон        поиск назад
:noh           убрать подсветку найденного

:s/old/new/            в текущей строке, первое вхождение
:s/old/new/g           в текущей строке, все
:%s/old/new/g          во всём файле
:%s/old/new/gc         во всём файле с подтверждением каждой замены
:10,20s/old/new/g      в строках с 10 по 20
:'<,'>s/old/new/g      в выделенном фрагменте (появится само после выделения и :)

Регулярные выражения в Vim по умолчанию «магические наполовину»: +, ?, (, | и { нужно экранировать обратной косой чертой. Приставка \v в начале шаблона включает привычный синтаксис:

text
:%s/\v(\w+)\s*\=\s*(\d+)/\2 = \1/g

Группы в замене обозначаются \1, \2, а & подставляет всё найденное. Флаг \c в любом месте шаблона отключает учёт регистра. Шаблон удобно отладить заранее в тестере регулярных выражений, только помните про разницу в экранировании.

Команда :g выполняет действие на всех строках, подходящих под шаблон:

text
:g/DEBUG/d           удалить все строки с DEBUG
:v/\S/d              удалить пустые строки (v — где шаблон НЕ найден)
:g/TODO/normal A !   дописать " !" в конец каждой строки с TODO

Визуальный режим

v выделяет посимвольно, V целыми строками, Ctrl+v прямоугольным блоком. Над выделенным работают те же операторы: d, y, >, gU.

Блочное выделение умеет править несколько строк сразу. Например, закомментировать десять строк:

  1. Встаньте в начало первой строки, нажмите Ctrl+v.
  2. Нажмите 9j, чтобы выделить столбец из десяти строк.
  3. Нажмите I, напечатайте # и нажмите Esc. Текст появится во всех строках.

Окна, вкладки, буферы

КомандаЧто делает
:e fileоткрыть файл
:lsсписок открытых буферов
:b 3 / :bn / :bpперейти к буферу 3 / следующему / предыдущему
:sp file / :vs fileоткрыть в горизонтальном / вертикальном разделении
Ctrl+w затем wперейти в следующее окно
Ctrl+w затем h j k lперейти в окно по направлению
Ctrl+w затем qзакрыть окно
:tabnew fileоткрыть во вкладке, gt / gT переключают

Макросы и регистры

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

  1. qa начинает запись в регистр a.
  2. Делаете правку на одной строке, в конце переходите на следующую, например j0.
  3. q заканчивает запись.
  4. @a повторяет один раз, @@ повторяет последний макрос, 100@a сто раз.

Скопированный и удалённый текст тоже лежит в регистрах. "ayy копирует строку в регистр a, "ap вставляет из него. "+y и "+p работают с системным буфером обмена, если Vim собран с его поддержкой (проверьте :echo has('clipboard')). Посмотреть все регистры: :reg.

Минимальный .vimrc

vim
set number relativenumber   " номера строк, относительные удобны для 5j и 3dd
set expandtab shiftwidth=4 tabstop=4
set ignorecase smartcase    " поиск без учёта регистра, если в шаблоне нет заглавных
set incsearch hlsearch      " подсвечивать найденное по мере ввода
set mouse=a                 " мышь для прокрутки и выделения
set scrolloff=5             " держать пять строк над и под курсором
set undofile                " отмена переживает закрытие файла
syntax on
filetype plugin indent on
nnoremap <Space> :noh<CR>

Для разных языков отступы удобно задавать отдельно: autocmd FileType yaml setlocal shiftwidth=2. Встроенный курс для практики запускается командой vimtutor и занимает около получаса.