Vim

Vim — модальный текстовый редактор, рассчитанный на быструю работу с клавиатуры. Команды вводятся с учётом регистра: i и I выполняют разные действия.

Обозначения: <Esc> — Escape, <CR> — Enter, <C-r> — Ctrl+R. Команды с двоеточием, например :w, вводятся после нажатия :.

Содержание

Запуск и выход

vim file.txt             # открыть или создать файл
vim file1 file2          # открыть несколько файлов
vim +42 file.txt         # перейти к строке 42
vim +/pattern file.txt   # перейти к первому совпадению
vim -R file.txt          # режим только для чтения
vimdiff old.txt new.txt  # сравнить файлы
Команда Действие
:w Сохранить
:w new.txt Сохранить под другим именем
:q Закрыть текущее окно
:wq или :x Сохранить и выйти
ZZ Сохранить и выйти
:q! или ZQ Выйти без сохранения
:qa Закрыть все окна
:wqa Сохранить всё и выйти
:qa! Закрыть всё без сохранения

Режимы

Нормальный режим предназначен для команд и перемещения. Нажмите <Esc>, чтобы вернуться в него.

Режим вставки предназначен для ввода текста. Вход: i, a, o и их варианты.

Визуальный режим предназначен для выделения:

Командная строка открывается через :. В ней выполняются сохранение, замена, настройка и команды Ex.

Перемещение

По тексту

Команда Действие
h / j / k / l Влево / вниз / вверх / вправо
w К началу следующего слова
e К концу слова
b К началу предыдущего слова
W, E, B То же с разделением только по пробелам
0 В начало строки
^ К первому непробельному символу
$ В конец строки
gg / G В начало / конец файла
42G или :42 К строке 42
{ / } К предыдущему / следующему абзацу
( / ) К предыдущему / следующему предложению
% К парной скобке или конструкции

По экрану

Команда Действие
<C-f> / <C-b> Экран вперёд / назад
<C-d> / <C-u> Пол-экрана вниз / вверх
H / M / L Верх / середина / низ экрана
zz Текущую строку в центр
zt / zb Текущую строку наверх / вниз

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

Команда Действие
fx / Fx К следующему / предыдущему x
tx / Tx Перед следующим / после предыдущего x
; / , Повторить в том же / обратном направлении

Число перед командой повторяет её: 5j — на пять строк вниз, 3w — на три слова вперёд.

Редактирование

Вставка

Команда Действие
i / a Вставлять перед / после курсора
I / A В начале / конце строки
o / O Создать строку ниже / выше
s Заменить символ и начать ввод
S Заменить строку и начать ввод
C Заменить до конца строки

В режиме вставки <C-w> удаляет предыдущее слово, <C-u> — текст до начала строки, а <C-n> и <C-p> перебирают варианты дополнения.

Удаление, копирование и вставка

Команда Действие
x / X Удалить символ под / перед курсором
dd Удалить строку
D Удалить до конца строки
yy или Y Скопировать строку
p / P Вставить после / перед курсором
3dd Удалить три строки
5p Вставить пять раз

Удалённый текст обычно также можно вставить через p.

Операторы и текстовые объекты

Команды часто строятся по схеме:

[число] оператор [число] движение
Оператор Действие
d Удалить
c Удалить и перейти к вводу
y Скопировать
> / < Увеличить / уменьшить отступ
= Выровнять отступы

Примеры:

dw       " удалить до следующего слова
2dw      " удалить два слова
c$       " изменить до конца строки
y}       " скопировать до конца абзаца
gg=G     " выровнять отступы во всём файле

Текстовые объекты описывают логические части текста:

Объект Значение
iw / aw Внутри слова / всё слово с пробелом
ip / ap Внутри абзаца / весь абзац
i" / a" Внутри кавычек / вместе с кавычками
i) / a) Внутри скобок / вместе со скобками
i] / a] Внутри квадратных скобок / вместе с ними
i} / a} Внутри фигурных скобок / вместе с ними
it / at Внутри HTML/XML-тега / вместе с тегами
ciw      " изменить слово под курсором
diw      " удалить слово под курсором
ci"      " изменить текст внутри кавычек
da(      " удалить содержимое вместе со скобками
yip      " скопировать абзац
vit      " выделить содержимое тега

Отмена и повтор

Команда Действие
u Отменить изменение
<C-r> Вернуть отменённое
. Повторить последнее изменение
:earlier 5m Состояние на пять минут раньше
:later 5m Состояние на пять минут позже

Команда . особенно полезна: выполните изменение один раз, перейдите к следующему месту и нажмите ..

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

Поиск

Команда Действие
/текст / ?текст Искать вперёд / назад
n / N Следующее совпадение в прямом / обратном направлении
* / # Искать слово под курсором вперёд / назад
:noh Убрать подсветку результатов
/\<word\>    " отдельное слово word
/foo\|bar    " foo или bar
/^TODO       " TODO в начале строки
/error$      " error в конце строки
/\d\+        " одна или несколько цифр

Замена

Формат: :[диапазон]s/что/на_что/[флаги].

:s/foo/bar/           " первое совпадение в строке
:s/foo/bar/g          " все совпадения в строке
:%s/foo/bar/g         " во всём файле
:%s/foo/bar/gc        " во всём файле с подтверждением
:10,20s/foo/bar/g     " в строках 10–20
:'<,'>s/foo/bar/g     " в визуальном выделении
:%s/\s\+$//e          " убрать пробелы в концах строк

Флаги: g — все совпадения в строке, c — подтверждение, i — без учёта регистра, I — с учётом регистра, e — не сообщать об отсутствии совпадений.

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

После v, V или <C-v> переместите курсор и примените d, c, y, >, <, = или ~. Команда o меняет активный край выделения, gv восстанавливает предыдущее выделение.

Чтобы добавить текст в начало нескольких строк:

  1. Нажмите <C-v>.
  2. Выделите строки через j и k.
  3. Нажмите I и введите текст.
  4. Нажмите <Esc>.

Для добавления в конец строк используйте блочное выделение, $, A, ввод и <Esc>.

Файлы, буферы, окна и вкладки

Буферы

Команда Действие
:e file.txt Открыть файл
:enew Новый пустой буфер
:ls Список буферов
:bn / :bp Следующий / предыдущий буфер
:b 3 Перейти к буферу №3
:b name Перейти по части имени
:bd Удалить буфер из списка
:wall Сохранить все изменённые буферы
:edit! Перезагрузить файл без сохранения изменений

Окна

:split file.txt       " горизонтальное разделение
:vsplit file.txt      " вертикальное разделение
<C-w>s / <C-w>v      " разделить текущее окно
<C-w>h/j/k/l          " перейти в соседнее окно
<C-w>w                " следующее окно
<C-w>q                " закрыть окно
<C-w>o                " оставить только текущее
<C-w>=                " одинаковый размер окон

Вкладки

:tabnew file.txt      " новая вкладка
:tabnext / gt         " следующая вкладка
:tabprevious / gT     " предыдущая вкладка
:tabclose             " закрыть вкладку
3gt                   " третья вкладка

Вкладка Vim — набор окон, а не отдельный файл. Для файлов часто удобнее буферы.

Регистры и буфер обмена

:registers     " показать регистры
"ayy           " скопировать строку в регистр a
"ap            " вставить из регистра a
"0p            " вставить последнее явно скопированное
"_dd           " удалить без сохранения
"+y            " скопировать в системный буфер
"+p            " вставить из системного буфера

Важные регистры: " — безымянный, 0 — последнее копирование, 19 — история удалений, az — именованные, _ — «чёрная дыра», + — системный буфер.

Проверка поддержки системного буфера:

:echo has('clipboard')

Метки и переходы

ma         " поставить метку a
'a         " перейти к строке метки a
`a         " перейти к точной позиции метки a
:marks     " список меток

Метки az локальны для файла, AZ работают между файлами.

Команда Действие
<C-o> / <C-i> Назад / вперёд по списку переходов
`. Место последнего изменения
`^ Место последней вставки
'' Строка предыдущего перехода
:jumps Список переходов

Макросы

qa       " начать запись в регистр a
...      " выполнить действия
q        " закончить запись
@a       " выполнить макрос a
@@       " повторить последний макрос
10@a     " выполнить десять раз

Пример добавления ; в конец строк: qaA;<Esc>jq, затем 10@a.

Полезные команды

>> / <<              " увеличить / уменьшить отступ
=ap                  " выровнять отступы абзаца
gg=G                 " выровнять весь файл
gqap                 " форматировать абзац
J / gJ               " объединить строки с пробелом / без него
~                    " изменить регистр символа
gUiw / guiw          " слово в верхний / нижний регистр
<C-a> / <C-x>        " увеличить / уменьшить число
:!command            " выполнить команду оболочки
:r !date             " вставить вывод команды
:%!sort              " обработать файл внешней командой
:read other.txt      " вставить другой файл
gf                   " открыть путь под курсором

Quickfix

:make
:copen
:cnext
:cprevious
:cclose

Поиск по проекту средствами Vim:

:vimgrep /TODO/gj **/*
:copen

Сворачивание

Команда Действие
zf{движение} Создать свёртку
zo / zc Открыть / закрыть
za Переключить
zR / zM Открыть / закрыть все
zd Удалить ручную свёртку

Настройка vimrc

Основной файл: ~/.vimrc в Linux/macOS или $HOME/_vimrc в Windows.

" Номера строк
set number          " Показывать абсолютный номер текущей строки
set relativenumber  " Показывать относительные номера остальных строк

" Поиск
set ignorecase      " Игнорировать регистр при поиске
set smartcase       " Если в запросе есть заглавные буквы, учитывать регистр
set incsearch       " Показывать совпадения по мере ввода
set hlsearch        " Подсвечивать все совпадения

" Отступы
set expandtab       " Заменять табы пробелами
set tabstop=4       " Ширина таба в пробелах
set shiftwidth=4    " Ширина отступа для >>, << и автоотступов
set softtabstop=4   " Сколько пробелов вставляет Tab в режиме вставки
set autoindent      " Автоматически сохранять отступ новой строки

" Интерфейс и поведение
set cursorline      " Подсвечивать строку с курсором
set showmatch       " Показывать парную скобку при вводе
set wildmenu        " Улучшенное меню автодополнения команд
set scrolloff=5     " Держать 5 строк контекста сверху и снизу от курсора
set hidden          " Разрешать переключение буферов без сохранения
set undofile        " Сохранять историю отмены между сессиями
set splitbelow      " Новые горизонтальные окна открывать снизу
set splitright      " Новые вертикальные окна открывать справа

" Включайте при поддержке clipboard
" set clipboard=unnamedplus  " Использовать системный буфер обмена

let mapleader = " "  " Лидер-клавиша — пробел

" Очистить подсветку поиска по <leader>h
nnoremap <leader>h :nohlsearch<CR>
" Сохранить файл по <leader>w
nnoremap <leader>w :write<CR>
" Перейти в окно влево по Ctrl+h
nnoremap <C-h> <C-w>h
" Перейти в окно вниз по Ctrl+j
nnoremap <C-j> <C-w>j
" Перейти в окно вверх по Ctrl+k
nnoremap <C-k> <C-w>k
" Перейти в окно вправо по Ctrl+l
nnoremap <C-l> <C-w>l

Применить настройки без перезапуска:

:source $MYVIMRC

Для привязок используйте nnoremap, inoremap, vnoremap и cnoremap соответственно в нормальном режиме, режиме вставки, визуальном режиме и командной строке.

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

:help                 " открыть справку
:help user-manual     " руководство пользователя
:help motion.txt      " перемещение
:help :substitute     " команда замены
:help text-objects    " текстовые объекты
:help registers       " регистры
:help windows         " окна
:helpgrep clipboard   " поиск по справке

Для перехода по ссылке под курсором используйте <C-]>, для возврата — <C-o> или <C-t>. Интерактивный учебник запускается командой vimtutor в терминале.

Практические рецепты

:%s/\s\+$//e              " удалить пробелы в концах строк
:g/^$/d                   " удалить пустые строки
:g/^\s*$/d                " удалить строки только с пробелами
:g/DEBUG/d                " удалить строки с DEBUG
:v/ERROR/d                " оставить только строки с ERROR
:%sort                    " сортировать строки
:%sort u                  " сортировать и убрать дубликаты
:10,20write fragment.txt  " записать строки 10–20 в файл

Изменение внутри ограничителей:

ci(     " внутри круглых скобок
ci[     " внутри квадратных скобок
ci{     " внутри фигурных скобок
ci"     " внутри двойных кавычек
ci'     " внутри одинарных кавычек

Краткая шпаргалка

РЕЖИМЫ
  i / a / o       начать ввод
  <Esc>           нормальный режим
  v / V / <C-v>   выделение

ФАЙЛ
  :w              сохранить
  :q              выйти
  :wq             сохранить и выйти
  :q!             выйти без сохранения

ПЕРЕМЕЩЕНИЕ
  h j k l         влево, вниз, вверх, вправо
  w / b           следующее / предыдущее слово
  0 / ^ / $       начало / первый текст / конец строки
  gg / G          начало / конец файла
  %               парная скобка

РЕДАКТИРОВАНИЕ
  x               удалить символ
  dd / yy         удалить / копировать строку
  p / P           вставить после / перед
  ciw / diw       изменить / удалить слово
  u / <C-r>       отменить / вернуть
  .               повторить изменение

ПОИСК
  /text           искать вперёд
  n / N           следующее / предыдущее совпадение
  * / #           слово под курсором
  :%s/a/b/g       заменить во всём файле
  :%s/a/b/gc      заменить с подтверждением

Как изучать Vim

Осваивайте команды слоями: сначала режимы и сохранение, затем движения, после этого d, c, y, p, u и ., а затем текстовые объекты, поиск, регистры и макросы. Главная идея Vim — составлять команды как предложения: оператор + движение или объект. Например, d + iw означает «удалить внутри слова», а c + i" — «изменить внутри кавычек».