Справочник · Терминал и система
Vim: выжить и полюбить
Режимы, перемещение, правка, поиск с заменой, окна и буферы, макросы и минимальный .vimrc. Сначала как выйти, потом как работать быстро.
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 | увеличить / уменьшить число под курсором |
Поиск и замена
/шаблон поиск вперёд, 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 в начале шаблона включает привычный синтаксис:
:%s/\v(\w+)\s*\=\s*(\d+)/\2 = \1/gГруппы в замене обозначаются \1, \2, а & подставляет всё найденное. Флаг \c в любом месте шаблона отключает учёт регистра. Шаблон удобно отладить заранее в тестере регулярных выражений, только помните про разницу в экранировании.
Команда :g выполняет действие на всех строках, подходящих под шаблон:
:g/DEBUG/d удалить все строки с DEBUG
:v/\S/d удалить пустые строки (v — где шаблон НЕ найден)
:g/TODO/normal A ! дописать " !" в конец каждой строки с TODOВизуальный режим
v выделяет посимвольно, V целыми строками, Ctrl+v прямоугольным блоком. Над выделенным работают те же операторы: d, y, >, gU.
Блочное выделение умеет править несколько строк сразу. Например, закомментировать десять строк:
- Встаньте в начало первой строки, нажмите
Ctrl+v. - Нажмите
9j, чтобы выделить столбец из десяти строк. - Нажмите
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 переключают |
Макросы и регистры
Макрос записывает последовательность нажатий и повторяет её.
qaначинает запись в регистрa.- Делаете правку на одной строке, в конце переходите на следующую, например
j0. qзаканчивает запись.@aповторяет один раз,@@повторяет последний макрос,100@aсто раз.
Скопированный и удалённый текст тоже лежит в регистрах. "ayy копирует строку в регистр a, "ap вставляет из него. "+y и "+p работают с системным буфером обмена, если Vim собран с его поддержкой (проверьте :echo has('clipboard')). Посмотреть все регистры: :reg.
Минимальный .vimrc
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 и занимает около получаса.