Vim отличается от обычных текстовых редакторов тем, что одна и та же клавиша выполняет разные действия в разных режимах. В режиме вставки клавиша d печатает букву, а в обычном режиме запускает удаление текста.
Новичку не нужно запоминать сотни команд. Для начала достаточно научиться переключать режимы, перемещать курсор, изменять текст, отменять действия, искать слова, сохранять файл и выходить из редактора.
Главное правило Если Vim ведёт себя непонятно, нажмите Esc. Редактор вернётся в обычный режим, после чего можно вводить команды.
Содержание
- Быстрый старт
- Режимы Vim
- Перемещение по тексту
- Редактирование
- Операторы и объекты текста
- Копирование и вставка
- Отмена и повтор
- Поиск и замена
- Визуальный режим
- Файлы, буферы и окна
- Минимальная настройка
- Частые проблемы
- Краткая таблица команд
- FAQ
Быстрый старт
Откройте терминал и передайте Vim имя файла.
vim notes.txt
Если файла пока нет, Vim создаст новый буфер. Файл появится на диске после сохранения.
- Нажмите
i, чтобы перейти в режим вставки. - Введите несколько строк текста.
- Нажмите
Esc, чтобы вернуться в обычный режим. - Введите
:wи нажмитеEnter, чтобы сохранить файл. - Введите
:qи нажмитеEnter, чтобы закрыть Vim.
Сохранить файл и сразу выйти можно командой :wq.
Выйти без сохранения можно командой :q!. Восклицательный знак заставляет Vim проигнорировать несохранённые изменения.
| Задача | Команда |
|---|---|
| Начать ввод текста | i |
| Вернуться к командам | Esc |
| Сохранить файл | :w |
| Закрыть Vim | :q |
| Сохранить и закрыть | :wq |
| Закрыть без сохранения | :q! |
Режимы Vim
Vim использует несколько режимов. Название текущего режима обычно показывается в нижней части окна.
| Режим | Для чего нужен | Как включить |
|---|---|---|
| Обычный | Навигация и команды редактирования | Esc |
| Вставка | Обычный ввод текста | i, a, o |
| Визуальный | Выделение текста | v, V, Ctrl-v |
| Командная строка | Сохранение, замена, настройки и работа с файлами | : |
| Замена | Ввод поверх существующего текста | R |
Переход в режим вставки
| Команда | Действие |
|---|---|
i |
Вставить текст перед курсором |
a |
Вставить текст после курсора |
I |
Перейти к первому непробельному символу строки и начать ввод |
A |
Перейти в конец строки и начать ввод |
o |
Создать строку ниже |
O |
Создать строку выше |
s |
Удалить символ под курсором и начать ввод |
S |
Очистить строку и начать ввод |
R |
Заменять существующие символы новыми |
После ввода текста нажмите Esc. Последовательность i, ввод текста, Esc станет одним изменением, которое можно отменить командой u.
Перемещение по тексту
Перемещение по символам
| Команда | Направление |
|---|---|
h |
На один символ влево |
j |
На одну строку вниз |
k |
На одну строку вверх |
l |
На один символ вправо |
Стрелки также обычно работают, но команды h, j, k и l позволяют не переносить руку на другую часть клавиатуры.
Перемещение по словам
| Команда | Действие |
|---|---|
w |
Перейти к началу следующего слова |
e |
Перейти к концу текущего или следующего слова |
b |
Перейти к началу предыдущего слова |
W |
Перейти к следующему фрагменту, разделённому пробелами |
E |
Перейти к концу фрагмента, разделённого пробелами |
B |
Перейти к предыдущему фрагменту, разделённому пробелами |
Строчные команды учитывают знаки препинания. Прописные команды считают словом любой непрерывный фрагмент без пробелов.
Перемещение внутри строки
| Команда | Действие |
|---|---|
0 |
Перейти в начало строки |
^ |
Перейти к первому непробельному символу |
$ |
Перейти в конец строки |
f{символ} |
Перейти к следующему указанному символу |
F{символ} |
Найти символ в обратном направлении |
t{символ} |
Перейти к позиции перед указанным символом |
T{символ} |
То же действие в обратном направлении |
; |
Повторить поиск символа |
, |
Повторить поиск символа в обратном направлении |
Команда f, переместит курсор к следующей запятой в текущей строке. Команда dt, удалит текст до следующей запятой, но сохранит саму запятую.
Перемещение по файлу
| Команда | Действие |
|---|---|
gg |
Перейти к первой строке |
G |
Перейти к последней строке |
25G |
Перейти к строке 25 |
:25 |
Перейти к строке 25 через командную строку |
Ctrl-f |
Прокрутить страницу вперёд |
Ctrl-b |
Прокрутить страницу назад |
Ctrl-d |
Прокрутить вниз примерно на половину экрана |
Ctrl-u |
Прокрутить вверх примерно на половину экрана |
zz |
Поместить текущую строку в центр экрана |
zt |
Поместить текущую строку в верхнюю часть экрана |
zb |
Поместить текущую строку в нижнюю часть экрана |
Полезные переходы
%переходит между парными скобками.{переходит к предыдущему абзацу.}переходит к следующему абзацу.Hперемещает курсор в верхнюю часть видимой области.Mперемещает курсор в середину видимой области.Lперемещает курсор в нижнюю часть видимой области.Ctrl-oвозвращает к предыдущей позиции.Ctrl-iснова переходит вперёд по истории позиций.
Редактирование текста
| Команда | Действие |
|---|---|
x |
Удалить символ под курсором |
X |
Удалить символ перед курсором |
r{символ} |
Заменить один символ |
dd |
Удалить текущую строку |
D |
Удалить текст от курсора до конца строки |
dw |
Удалить текст до начала следующего слова |
de |
Удалить текст до конца слова |
diw |
Удалить слово под курсором |
cc |
Заменить текущую строку |
C |
Заменить текст от курсора до конца строки |
cw |
Заменить слово или его оставшуюся часть |
ciw |
Заменить слово под курсором |
J |
Объединить текущую строку со следующей |
~ |
Изменить регистр символа |
>> |
Увеличить отступ строки |
<< |
Уменьшить отступ строки |
== |
Выровнять отступ текущей строки |
gg=G |
Пересчитать отступы во всём файле |
Команды удаления в Vim работают как вырезание. Удалённый текст попадает в регистр, поэтому его можно вернуть командами p или P.
Операторы, движения и объекты текста
Многие команды Vim строятся по формуле оператор, движение.
| Оператор | Действие |
|---|---|
d |
Удалить |
c |
Удалить и перейти в режим вставки |
y |
Скопировать |
> |
Увеличить отступ |
< |
Уменьшить отступ |
gU |
Перевести символы в верхний регистр |
gu |
Перевести символы в нижний регистр |
После оператора укажите область действия.
dwудаляет текст до начала следующего слова.d$удаляет текст до конца строки.y}копирует текст до следующего абзаца.gUwпереводит слово в верхний регистр.3ddудаляет три строки.d3wудаляет текст на протяжении трёх переходов по словам.
Объекты текста
Объекты текста позволяют работать не с направлением, а с логической областью вокруг курсора.
| Объект | Область |
|---|---|
iw |
Внутренняя часть слова |
aw |
Слово вместе с окружающим пробелом |
i" |
Текст внутри двойных кавычек |
a" |
Текст вместе с двойными кавычками |
i' |
Текст внутри одинарных кавычек |
i( |
Текст внутри круглых скобок |
a( |
Текст вместе с круглыми скобками |
i[ |
Текст внутри квадратных скобок |
i{ |
Текст внутри фигурных скобок |
ip |
Содержимое текущего абзаца |
ap |
Абзац вместе с окружающей пустой строкой |
it |
Содержимое парного HTML- или XML-тега |
Команда ci" удаляет содержимое двойных кавычек и включает режим вставки. Кавычки остаются на месте.
Команда da( удаляет содержимое круглых скобок вместе со скобками.
Команда yip копирует текущий абзац.
Копирование, вырезание и вставка
Vim называет копирование словом yank. Основная команда копирования начинается с y.
| Команда | Действие |
|---|---|
yy |
Скопировать текущую строку |
Y |
Скопировать текущую строку |
yw |
Скопировать текст до следующего слова |
yiw |
Скопировать слово под курсором |
y$ |
Скопировать текст до конца строки |
3yy |
Скопировать три строки |
p |
Вставить после курсора или ниже текущей строки |
P |
Вставить перед курсором или выше текущей строки |
Как не потерять скопированный текст
Операции удаления и изменения перезаписывают основной регистр. Если после yy выполнить dd, обычная команда p вставит удалённую строку, а не ранее скопированную.
Регистр 0 хранит последний текст, скопированный командой y.
"0pвставляет последний скопированный текст."_dудаляет текст в чёрный регистр и не перезаписывает обычный регистр."ayyкопирует строку в именованный регистрa."apвставляет содержимое регистраa.:registersпоказывает содержимое регистров.
Системный буфер обмена
Системный буфер обмена обычно связан с регистром +.
"+yкопирует выделенный текст в системный буфер."+yyкопирует текущую строку в системный буфер."+pвставляет текст из системного буфера.
Проверьте поддержку системного буфера командой
:echo has('clipboard')
Результат 1 означает, что функция доступна. Результат 0 обычно говорит о том, что установлен вариант Vim без поддержки графического буфера обмена. В Linux может потребоваться пакет с полной или графической сборкой Vim.
Отмена, возврат и повтор команд
| Команда | Действие |
|---|---|
u |
Отменить последнее изменение |
Ctrl-r |
Вернуть отменённое изменение |
U |
Отменить изменения текущей строки |
. |
Повторить последнее изменение |
Команда . особенно полезна при повторяющихся правках. Например, выполните ciw, введите новое слово, нажмите Esc, перейдите к следующему нужному слову и нажмите ..
Vim повторит всю операцию замены, включая введённый текст.
Команда U не равна многократному нажатию u. Она отменяет изменения текущей строки и при повторном запуске может вернуть отменённые правки.
Поиск и замена
Поиск текста
| Команда | Действие |
|---|---|
/текст |
Искать вперёд |
?текст |
Искать назад |
n |
Перейти к следующему совпадению |
N |
Перейти к предыдущему совпадению |
* |
Искать слово под курсором вперёд |
# |
Искать слово под курсором назад |
:nohlsearch |
Убрать подсветку результатов |
Введите /error и нажмите Enter. Vim найдёт следующее вхождение слова error. Используйте n и N для перехода между результатами.
Замена текста
| Команда | Действие |
|---|---|
:s/старое/новое/ |
Заменить первое совпадение в текущей строке |
:s/старое/новое/g |
Заменить все совпадения в текущей строке |
:%s/старое/новое/g |
Заменить все совпадения во всём файле |
:%s/старое/новое/gc |
Запрашивать подтверждение каждой замены |
:%s/старое/новое/gi |
Не учитывать регистр символов |
:5,20s/старое/новое/g |
Заменить совпадения в строках с 5 по 20 |
При подтверждении замены Vim предлагает несколько вариантов.
yзаменить текущее совпадение.nпропустить текущее совпадение.aзаменить все оставшиеся совпадения.qпрекратить замену.lзаменить текущее совпадение и завершить команду.
Символы ., *, [ и некоторые другие имеют специальное значение в шаблонах Vim. Для поиска текста почти буквально можно добавить режим very nomagic.
/Vfile.name[1]
Обратную косую черту в таком шаблоне всё равно потребуется экранировать.
Визуальный режим
Визуальный режим выделяет текст, после чего к выделению можно применить команду.
| Команда | Действие |
|---|---|
v |
Выделять по символам |
V |
Выделять целые строки |
Ctrl-v |
Выделять прямоугольный блок |
o |
Перейти к другому краю выделения |
y |
Скопировать выделение |
d |
Удалить выделение |
c |
Заменить выделение |
> |
Увеличить отступ |
< |
Уменьшить отступ |
= |
Пересчитать отступ |
u |
Перевести выделение в нижний регистр |
U |
Перевести выделение в верхний регистр |
Вставка текста в несколько строк
- Нажмите
Ctrl-v. - Выберите нужные строки командами движения.
- Нажмите
I, чтобы вставить текст перед блоком. - Введите текст.
- Нажмите
Esc.
После выхода из режима вставки Vim добавит текст во все выбранные строки. Команда A выполняет похожую операцию в конце прямоугольного блока.
Файлы, буферы и окна
Работа с файлами
| Команда | Действие |
|---|---|
:e file.txt |
Открыть файл в текущем окне |
:enew |
Создать пустой буфер |
:w |
Сохранить текущий файл |
:w copy.txt |
Записать содержимое в другой файл |
:saveas copy.txt |
Сохранить под новым именем и продолжить работу с новым файлом |
:r file.txt |
Вставить содержимое другого файла ниже курсора |
:pwd |
Показать текущий рабочий каталог |
:cd path |
Изменить рабочий каталог |
:edit . |
Открыть встроенный файловый браузер |
Буферы
Открытые файлы хранятся в буферах. Закрытие окна не всегда удаляет соответствующий буфер.
| Команда | Действие |
|---|---|
:ls |
Показать список буферов |
:bnext |
Перейти к следующему буферу |
:bprevious |
Перейти к предыдущему буферу |
:buffer 3 |
Открыть буфер с номером 3 |
:buffer name |
Открыть буфер по части имени |
:bdelete |
Удалить текущий буфер из списка |
Разделение окна
| Команда | Действие |
|---|---|
:split |
Разделить окно горизонтально |
:vsplit |
Разделить окно вертикально |
:split file.txt |
Открыть файл в горизонтальном окне |
:vsplit file.txt |
Открыть файл в вертикальном окне |
Ctrl-w h |
Перейти в окно слева |
Ctrl-w j |
Перейти в окно снизу |
Ctrl-w k |
Перейти в окно сверху |
Ctrl-w l |
Перейти в окно справа |
Ctrl-w w |
Перейти к следующему окну |
Ctrl-w = |
Выровнять размеры окон |
:close |
Закрыть текущее окно |
:only |
Закрыть остальные окна |
Вкладки
| Команда | Действие |
|---|---|
:tabnew |
Создать вкладку |
:tabedit file.txt |
Открыть файл в новой вкладке |
gt |
Перейти к следующей вкладке |
gT |
Перейти к предыдущей вкладке |
:tabclose |
Закрыть текущую вкладку |
Вкладка Vim хранит набор окон, а не один конкретный файл. Для обычного переключения между файлами чаще удобнее использовать буферы.
Метки и возврат к нужному месту
Метки запоминают позиции внутри файлов.
| Команда | Действие |
|---|---|
ma |
Создать локальную метку a |
'a |
Перейти к строке с меткой a |
`a |
Перейти к точной позиции метки a |
mA |
Создать глобальную метку A |
:marks |
Показать список меток |
'' |
Вернуться к строке предыдущего перехода |
`` |
Вернуться к точной позиции предыдущего перехода |
Строчные метки работают внутри одного файла. Прописные метки позволяют переходить между файлами.
Макросы для повторяющихся действий
Макрос записывает последовательность команд в регистр.
- Нажмите
qa, чтобы начать запись в регистрa. - Выполните нужные действия.
- Нажмите
q, чтобы остановить запись. - Нажмите
@a, чтобы воспроизвести макрос. - Нажмите
@@, чтобы повторить последний макрос.
Команда 10@a запускает макрос десять раз. Перед массовым запуском проверьте макрос на одной или двух строках и сохраните файл.
Минимальная настройка Vim
Пользовательские настройки хранятся в файле конфигурации.
- Linux и macOS используют
~/.vimrc. - Windows обычно использует
%USERPROFILE%_vimrc. - Точный путь можно проверить командой
:version.
Откройте конфигурацию из Vim.
:edit $MYVIMRC
Пример базовой конфигурации без плагинов
set number
set relativenumber
set ignorecase
set smartcase
set incsearch
set hlsearch
set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4
set autoindent
filetype plugin indent on
syntax enable
| Параметр | Назначение |
|---|---|
number |
Показывает абсолютные номера строк |
relativenumber |
Показывает расстояние до соседних строк |
ignorecase |
Не учитывает регистр при поиске |
smartcase |
Учитывает регистр, если запрос содержит прописную букву |
incsearch |
Показывает результаты во время ввода запроса |
hlsearch |
Подсвечивает все совпадения |
expandtab |
Вставляет пробелы вместо символа табуляции |
shiftwidth=4 |
Использует четыре пробела для изменения отступа |
tabstop=4 |
Показывает символ табуляции шириной четыре позиции |
softtabstop=4 |
Использует шаг в четыре позиции при вводе и удалении отступов |
После сохранения примените конфигурацию без перезапуска Vim.
:source $MYVIMRC
Проверьте конкретный параметр командой
:set number?
:set shiftwidth?
Команда покажет текущее значение параметра.
Общий системный буфер
Если сборка Vim поддерживает буфер обмена, можно добавить следующую настройку.
set clipboard=unnamedplus
После изменения обычные команды y, d и p начнут активнее взаимодействовать с системным буфером. Такое поведение подходит не всем, поэтому сначала проверьте настройку во временном сеансе.
:set clipboard=unnamedplus
Вернуть стандартное поведение можно командой
:set clipboard=
Встроенная справка и обучение
Vim содержит подробную справочную систему. Откройте её командой :help.
| Команда | Что откроется |
|---|---|
:help |
Главная страница справки |
:help motion.txt |
Команды перемещения |
:help change.txt |
Удаление, изменение и замена текста |
:help registers |
Регистры |
:help visual-mode |
Визуальный режим |
:help :substitute |
Команда поиска и замены |
:help vimrc |
Файл конфигурации |
В окне справки поместите курсор на ссылку и нажмите Ctrl-]. Для возврата используйте Ctrl-o или Ctrl-t.
Для интерактивного обучения запустите в терминале
vimtutor
Курс создаёт учебную копию текста, поэтому упражнения не повреждают исходный файл. Если команда отсутствует, проверьте, установлен ли полный пакет Vim.
Дополнительные сведения доступны в онлайн-справке Vim и на странице документации проекта.
Частые проблемы
Клавиши печатают команды вместо текста
Vim находится в обычном режиме. Нажмите i, a или o, чтобы перейти к вводу текста.
Vim не позволяет выйти
Сначала нажмите Esc, затем выберите подходящую команду.
:qзакрывает файл без несохранённых изменений.:wqсохраняет файл и закрывает Vim.:q!отбрасывает изменения и закрывает Vim.:qaзакрывает все окна и буферы.:qa!закрывает всё без сохранения.
Появилась ошибка E45 или сообщение readonly
Буфер или файл открыт только для чтения. Проверьте состояние командой :set readonly?. Отключить режим только для чтения внутри Vim можно командой :set noreadonly, но файловые права операционной системы такая команда не меняет.
Попытка принудительной записи выполняется через :w!. Если у пользователя нет прав на каталог или файл, Vim всё равно не сможет сохранить данные.
После вставки сломались отступы
Современные терминалы часто передают Vim информацию о вставке из буфера обмена, но поддержка зависит от терминала и сборки редактора.
При проблемах временно включите режим вставки.
:set paste
Вставьте текст, затем сразу отключите режим.
:set nopaste
Не оставляйте параметр paste включённым. Режим отключает часть автоматических отступов и назначений клавиш для вставки.
Vim показывает предупреждение о swap-файле
Swap-файл может означать, что тот же документ уже открыт в другом процессе или предыдущий сеанс завершился аварийно.
- Проверьте имя файла, имя компьютера и идентификатор процесса в предупреждении.
- Не открывайте документ для параллельного редактирования, если другой процесс ещё работает.
- Выберите восстановление, если предыдущий сеанс завершился аварийно.
- Проверьте восстановленный текст и сохраните его под отдельным именем.
- Удаляйте старый swap-файл только после проверки данных и завершения второго процесса.
Запустить восстановление из терминала можно командой
vim -r file.txt
Команды системного буфера не работают
Проверьте поддержку буфера.
:echo has('clipboard')
Результат 0 указывает на ограниченную сборку Vim. Установка другой сборки обычно решает проблему. В удалённом сеансе SSH системный буфер относится к удалённому компьютеру, если терминал или дополнительные инструменты не передают данные на локальную машину.
Файл изменился за пределами Vim
Команда :checktime просит Vim проверить изменения файлов. Команда :edit! перечитывает текущий файл с диска и отбрасывает несохранённые локальные правки.
Перед :edit! убедитесь, что локальные изменения больше не нужны. Полный откат после перечитывания файла может оказаться невозможен.
Краткая шпаргалка Vim
| Задача | Команда |
|---|---|
| Вернуться в обычный режим | Esc |
| Начать ввод | i |
| Добавить текст после курсора | a |
| Создать строку ниже | o |
| Перемещаться по символам | h, j, k, l |
| Перемещаться по словам | w, e, b |
| Начало и конец строки | 0, ^, $ |
| Начало и конец файла | gg, G |
| Удалить символ | x |
| Удалить строку | dd |
| Удалить слово | diw |
| Заменить слово | ciw |
| Скопировать строку | yy |
| Вставить | p, P |
| Отменить изменение | u |
| Вернуть изменение | Ctrl-r |
| Повторить изменение | . |
| Искать вперёд | /текст |
| Следующее совпадение | n |
| Заменить во всём файле | :%s/старое/новое/g |
| Выделить символы | v |
| Выделить строки | V |
| Сохранить | :w |
| Выйти | :q |
| Сохранить и выйти | :wq |
| Выйти без сохранения | :q! |
| Открыть справку | :help |
Что запомнить в первую очередь
Escвозвращает в обычный режим.iвключает ввод текста.h,j,k,lперемещают курсор.uотменяет изменение, аCtrl-rвозвращает его.ddудаляет строку,yyкопирует строку,pвставляет текст./текстзапускает поиск.:wсохраняет файл.:qзакрывает Vim.:q!закрывает Vim без сохранения..повторяет последнее изменение.
После освоения базовых команд переходите к комбинациям операторов с движениями и объектами текста. Именно команды вроде ciw, di", yap и dt, превращают Vim из необычного редактора в быстрый инструмент обработки текста.
FAQ
Почему Vim не печатает текст сразу после запуска?
Vim запускается в обычном режиме, где клавиши выполняют команды. Нажмите i, чтобы начать ввод, и Esc, чтобы вернуться к командам.
Как выйти из Vim?
Нажмите Esc, введите :q и нажмите Enter. При несохранённых изменениях используйте :wq для сохранения или :q! для выхода без сохранения.
Чем команды :wq и :x отличаются друг от друга?
:wq записывает файл и закрывает окно. :x записывает файл только при наличии изменений, а затем закрывает окно.
Можно ли пользоваться стрелками вместо h, j, k и l?
Да, стрелки обычно работают. Команды h, j, k и l удобнее при частом редактировании, поскольку рука остаётся на основной части клавиатуры.
Как вставить текст из системного буфера обмена?
Используйте "+p. Если команда не работает, проверьте поддержку буфера через :echo has('clipboard').
Чем удаление в Vim отличается от обычного удаления?
Большинство удалённых фрагментов попадает в регистры и доступно для последующей вставки. Для удаления без сохранения используйте чёрный регистр, например "_dd.
Нужно ли устанавливать плагины новичку?
Нет. Сначала освойте обычный режим, движения, операторы, объекты текста, поиск, буферы и встроенную справку. Плагины лучше добавлять после появления конкретной задачи.
Подойдут ли команды Vim для Neovim?
Основные режимы, движения, операторы, объекты текста, регистры, поиск и команды редактирования в Vim и Neovim совместимы. Настройка, плагины и некоторые дополнительные функции различаются.