Vim
Vim — модальный текстовый редактор, рассчитанный на быструю работу с клавиатуры. Команды вводятся с учётом регистра: i и I выполняют разные действия.
Обозначения: <Esc> — Escape, <CR> — Enter, <C-r> — Ctrl+R. Команды с двоеточием, например :w, вводятся после нажатия :.
Содержание
- Запуск и выход
- Режимы
- Перемещение
- Редактирование
- Операторы и текстовые объекты
- Отмена и повтор
- Поиск и замена
- Визуальный режим
- Файлы, буферы, окна и вкладки
- Регистры и буфер обмена
- Метки и переходы
- Макросы
- Полезные команды
- Настройка vimrc
- Встроенная справка
- Практические рецепты
- Краткая шпаргалка
- Как изучать Vim
Запуск и выход
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 и их варианты.
Визуальный режим предназначен для выделения:
v— посимвольное;V— построчное;<C-v>— прямоугольный блок.
Командная строка открывается через :. В ней выполняются сохранение, замена, настройка и команды 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 восстанавливает предыдущее выделение.
Чтобы добавить текст в начало нескольких строк:
- Нажмите
<C-v>. - Выделите строки через
jиk. - Нажмите
Iи введите текст. - Нажмите
<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 — последнее копирование, 1–9 — история удалений, a–z — именованные, _ — «чёрная дыра», + — системный буфер.
Проверка поддержки системного буфера:
:echo has('clipboard')Метки и переходы
ma " поставить метку a
'a " перейти к строке метки a
`a " перейти к точной позиции метки a
:marks " список метокМетки a–z локальны для файла, A–Z работают между файлами.
| Команда | Действие |
|---|---|
<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" — «изменить внутри кавычек».