Vim: режимы, хоткейсы, команды

В vim и его форках (например nvim) есть 3 + 1 режима:

  • normal mode — режим просмотра
  • visual mode — режим выделения текста
  • insert mode — режим редактирования
  • ESC — перейти в режим просмотра

Ещё один режим — командный. Переход из normal mode нажатием : (двоеточие). Индикатор появляется в нижнем левом углу.

Изначально при открытии файла вы находитесь в normal mode.

К началу большинства команд можно добавить число — количество повторений.

  • 4h — сдвиг курсора на 4 символа влево
  • 3a — повторить ввод текста 3 раза
  • 5X — удалить 5 символов слева от курсора
(normal mode)

По документу можно перемещаться стрелками, но есть более быстрые способы.

Перемещение курсора:

Клавиша Действие
h влево
j вниз
k вверх
l вправо
  • H — в начало экрана
  • M — в середину экрана
  • L — в конец экрана
  • ( — к предыдущему предложению
  • ) — к следующему предложению
  • { — к предыдущему параграфу
  • } — к следующему параграфу
  • zt — передвинуть строку вверх экрана
  • zz — передвинуть строку в середину экрана
  • z. — передвинуть строку в середину, курсор в начало строки
  • zb — передвинуть строку в конец экрана
  • Ctrl+D — пол-страницы вниз
  • Ctrl+U — пол-страницы вверх
  • Ctrl+B — страница вверх (Page Up)
  • Ctrl+F — страница вниз (Page Down)
  • Ctrl+O — переместить курсор на предыдущее место
  • Ctrl+I — переместить курсор на последнее место (после Ctrl+O)
  • Ctrl+E — страница на одну строку вверх
  • Ctrl+Y — страница на одну строку вниз

В командах b, e, B, E переход зависит от положения курсора в слове.

  • w — в начало следующего слова
  • W — в начало следующего слова после пробела
  • b — в начало текущего/предыдущего слова (beginning)
  • B — в начало текущего/предыдущего слова перед пробелом
  • e — в конец текущего/следующего слова (end)
  • E — в конец текущего/следующего слова после пробела
  • 0, Home — к началу строки
  • $, End — к концу строки
  • _, ^ — к первому непустому символу в строке
  • g_ — к последнему непустому символу в строке
  • - — к первому непустому символу в строке сверху
  • + — к первому непустому символу в строке снизу
  • gg — к первой строке
  • G — к последней строке
  • ngg — к строке под номером n (например: 45gg)
  • nG — к строке под номером n (аналог ngg)
  • % — к парной скобке вперёд по тексту строки (), {}, []
  • f + X — к следующему символу X в строке
  • F + X — к следующему символу X в строке (обратное направление)
  • t + X — перед символом X в строке (till)
  • T + X — перед символом X в строке (обратное направление)
  • ; — повторить переход в прямом направлении
  • '','''' — повторить переход в обратном направлении

Поиск выполняется символами / и ?:

  • /Выражение — поиск вперёд по документу от курсора
  • ?Выражение — поиск назад по документу от курсора

\c перед выражением — поиск без учёта регистра.

Отключить подсветку результатов:

:nohlsearch

или поискать несуществующую строку (/asdfasd).

, и пробел — отключить подсветку поискового слова
  • n — к следующему совпадению
  • N — к предыдущему совпадению
  • * — к следующему слову под курсором
  • # — к предыдущему слову под курсором
  • gd — перейти к первому появлению слова под курсором
  • g* — к следующему слову под курсором (слово становится шаблоном поиска)
  • g# — к предыдущему слову под курсором (слово становится шаблоном поиска)

Замена строк: :%s/foo/bar/gi

(insert mode)
  • a — добавить текст после курсора
  • i — добавить текст до курсора
  • A — добавить текст в конце строки
  • I — добавить текст в начале строки
  • o — добавить строку ниже курсора
  • O — добавить строку выше курсора

Все эти команды переключают vim в режим редактирования.

Esc — выход из режима редактирования.

(visual mode)
  • v — посимвольное выделение текста
  • V — построчное выделение текста
  • v + hjkl — выделение текста
  • Shift+V — выделить строку
  • Ctrl+V — выделение прямоугольника
  • Esc — выход из режима выделения
  • vip — выделить параграф
  • viw — выделить слово
  • Shift+v или 0v$ — выделить строку
  • ^v$ — выделить строку начиная с первого непробельного символа
  • vi( — выделить всё между ближайшими () (аналогично vi[ и vi{ для [] и {})
  • va( — выделить всё между (), включая сами скобки
  • v2j — выделить на две строки вниз
  • dip — вырезать параграф
  • y[направление] — копировать по направлению (h, j, k, l, $, 0 и т.п.)
  • yy — копировать строку
  • "*y — копировать в системный буфер обмена
  • p — вставить после курсора
  • P — вставить до курсора
  • gp — вставить после курсора и переместить курсор на один символ вправо
  • gP — вставить до курсора и переместить курсор на один символ влево
В Vim текст не удаляется, а всегда вырезается в буфер обмена.
  • x, DEL — удалить символ под курсором
  • X — удалить символ до курсора (аналог Backspace)
  • d[направление] — удалить по направлению (h, j, k, l, $, 0 и т.п.)
  • dd — удалить строку
  • D — удалить от курсора до конца строки
  • ayy — скопировать строку в регистр a
  • bdd — вырезать строку в регистр b
  • C2d — вырезать три строки и дописать в конец регистра C
  • :reg — просмотреть содержимое регистров
  • J — объединить строку с нижней (join)
  • r[символ] — заменить символ под курсором (replace)
  • R — начать ввод с заменой текста (аналог Insert)
  • s — заменить символ и начать ввод (substitute)
  • S — заменить строку и начать ввод
  • c[направление] — изменить по направлению (h, l, e, b и т.п.)
  • C — изменить строку от курсора до конца (change)
  • ~ — сменить регистр символа под курсором
  • gu — преобразовать в нижний регистр
  • gU — преобразовать в верхний регистр
  • zc — свернуть блок
  • zo — развернуть блок
  • zM — закрыть все блоки
  • zR — открыть все блоки
  • za — инвертирование
  • zf — см. :set foldmethod=manual
:set foldenable           # включить сворачивание
:set foldmethod=syntax    # на основе синтаксиса
:set foldmethod=indent    # на основе отступов
:set foldmethod=manual    # вручную: выделить v, затем zf
:set foldmethod=marker    # на основе маркеров в тексте
:set foldmarker=begin,end # маркеры начала и конца блока
  • m — установить локальный маркер
  • ' — перейти к локальному маркеру (одинарная кавычка)

Буква после знака устанавливает или вызывает именованный маркер:

  • ma — установить локальный маркер a
  • mB — установить глобальный маркер B
  • 'c — перейти к локальному маркеру c
  • '0 — вернуться на позицию при последнем закрытии vim
  • :marks — просмотр маркеров
set viminfo='1000,f1   # маркеры пишутся в ~/.viminfo
  • qa — записать макрос с именем a
  • q — закончить запись макроса
  • @a — выполнить макрос a
  • @@ — повторить последний макрос
  • [#]> — сдвинуть выделенное вправо
  • [#]< — сдвинуть выделенное влево
  • [#]» — сдвинуть строку вправо
  • [#]« — сдвинуть строку влево
:set tabstop=#              # # пробелов для табуляции
:set shiftwidth=#           # # пробелов в командах отступа
:set [no]expandtab          # заменять ли табуляцию на пробелы
:set shiftwidth=4 smarttab  # табуляция = 4 пробела
:set expandtab              # только пробелы, не табуляция
:set tabstop=8 softtabstop=0
mkdir -p ~/.vim/spell
cd ~/.vim/spell
wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.sug
wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.spl
wget http://ftp.vim.org/vim/runtime/spell/en.ascii.sug
wget http://ftp.vim.org/vim/runtime/spell/en.ascii.spl
  • :set spell spelllang=ru,en — включить проверку орфографии
  • :set nospell — выключить
  • ]s — следующее слово с ошибкой
  • [s — предыдущее слово с ошибкой
  • z= — замена слова на альтернативу из списка
  • zg — пометить слово как правильное (good word)
  • zw — пометить слово как ошибочное (wrong word)
  • zG — игнорировать слово
:e ++enc=<кодировка>                  # открыть файл в заданной кодировке
:w ++enc=<кодировка>                  # сохранить файл в новой кодировке
:set fileencodings=utf-8,koi8-r       # список автоопределяемых кодировок
:set [no]wildmenu   # автодополнение в командной строке с вариантами
:set list           # отображать табуляцию и переводы строк
q:                  # история команд
.                   # повторение последней команды
  • u, :u[ndo] — отменить предыдущее действие (undo)
  • U — отменить все изменения в строке
  • Ctrl+R, :red[o] — вернуть отменённое действие (redo)
  • . — повторить последнее изменение

Выполнение команд через : (двоеточие) из normal mode.

  • :10 — перейти на строку 10
  • :e [file_name] — редактировать файл
  • :e [dir_name] — открыть директорию в файловом менеджере
  • :Ex — открыть файловый менеджер в текущем окне
  • :e ./ — файловый менеджер во всё окно
  • :q — закрыть файловый менеджер

Редактирование по сети:

:e ://user@host/path/to/the/file.txt
:w                  # записать изменения
:w [fname]          # записать в файл [fname]
:wa                 # сохранить все файлы
:q                  # выйти
:q!                 # выйти без сохранения
:color              # выбор цветовой схемы
:pwd                # текущий каталог
:cd [path]          # перейти в каталог
:!команда           # выполнить команду (man, git и т.д.)
  • :syntax on — включить
  • :syntax off — выключить
  • :set wrap — разрешить (по умолчанию)
  • :set nowrap — запретить
  • :ha[rdcopy] — распечатать документ
  • :set printoptions=duplex:off — отключить двустороннюю печать
  • :mksession file.session — сохранить текущую сессию
  • :source file.session — восстановить сессию
  • :set number — включить
  • :set nonumber — отключить
  • :tabnew [fname] — создать таб
  • :tabs — вывести список табов
  • :tabn — следующий таб
  • :tabp — предыдущий таб
  • gt — следующий таб
  • gT — предыдущий таб
  • ngt — перейти на таб #n
  • :tabm +1 — переместить таб вперёд
  • :tabm -1 — переместить таб назад
  • :tabm 2 — переместить таб на заданную позицию (с нуля)
  • :tabc — закрыть вкладку
:split    # горизонтальное разбиение
:vsplit   # вертикальное разбиение

Ctrl+W, затем:

  • c — закрыть окно
  • + / - — изменить высоту текущего окна
  • < / > — изменить ширину текущего окна
  • = — установить равный размер окон
  • hjkl или стрелки — перемещение между окнами
dd        # вырезать строку
cc        # удалить и начать редактирование
yy        # копировать строку
DEL       # удалить следующий символ

Ctrl+P / Ctrl+N   # автодополнение текста (insert mode)
Ctrl+R, =         # вставить выражение (например 5*2-3) (insert mode)

Открыть несколько файлов в табах из командной строки:

vim -p file1.txt file2.txt

Открыть файл в новой вкладке из vim:

:tabe file2.txt

Навигация: gt — следующая вкладка, gT — предыдущая, 1gt, 2gt и т.д. — по номеру.

  • ~/.vimrc — конфиг vim
  • ~/.config/nvim/init.vim — конфиг nvim
  • :echo($MYVIMRC) — показать путь к файлу настроек
  • :e $MYVIMRC — редактировать файл настроек

Плагины nvim: nvim-lsp-installer

Для полного срабатывания нужны плагины: rust-analyzer, pyright, ripgrep.

git clone https://github.com/alexey-goloburdin/nvim-config.git ~/.config/nvim

Создать pyrightconfig.json:

nvim pyrightconfig.json
{
  "venv": "env",
  "venvPath": "."
}

Или скачать:

wget https://stavis-dev.github.io/f/pyrightconfig.json
wget https://stavis-dev.github.io/f/.editorconfig
  • Ctrl+H — запуск py-скрипта
  • gd — перейти к телу функции (если функция из модуля — модуль откроется в буфере)
  • gp — перейти в предыдущий буфер
  • gn — перейти на следующий буфер
  • gw — закрыть буфер

Файловый менеджер

  • nvim . — открыть nvim в режиме файлового менеджера
  • Enter — открыть выделенный файл
  • - — перейти в каталог выше
  • gn — сделать рабочей папку в файловом менеджере

Плагин telescope

  • ff — поиск по названию файла
  • fg — поиск по содержимому файла
  • Enter — открыть найденный файл
  • Ctrl+T — открыть в новой вкладке

Пробел — клавиша <leader>.

  • e — файловый менеджер
  • q — выход
  • f — поиск по названию файла
  • Esc Esc — выход
  • TAB — переход по буферу вперёд
  • Shift+TAB — переход по буферу назад
  • <leader> + / — закомментировать текущую строку
  • <leader> + c — закомментировать несколько выделенных строк
  • <leader> + tf — терминал в float-режиме
  • <leader> + th — терминал в горизонтальном режиме
  • Ctrl+\ — открыть/закрыть терминал
  • <leader> + w — сохранить файл
  • jj — аналог Esc