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— скопировать строку в регистрabdd— вырезать строку в регистрbC2d— вырезать три строки и дописать в конец регистра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— установить локальный маркер amB— установить глобальный маркер B'c— перейти к локальному маркеру c'0— вернуться на позицию при последнем закрытии vim:marks— просмотр маркеров
set viminfo='1000,f1 # маркеры пишутся в ~/.viminfo
Макросы
qa— записать макрос с именемaq— закончить запись макроса@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.
Переход на строку N
: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— выключить
Перенос строк (word wrap)
: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
Пример настройки neovim
Для полного срабатывания нужны плагины: 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— открыть в новой вкладке
Сборка Purple
Пробел — клавиша <leader>.
Стартовое окно
e— файловый менеджерq— выходf— поиск по названию файлаEsc Esc— выход
Окна
TAB— переход по буферу вперёдShift+TAB— переход по буферу назад<leader> + /— закомментировать текущую строку<leader> + c— закомментировать несколько выделенных строк<leader> + tf— терминал в float-режиме<leader> + th— терминал в горизонтальном режимеCtrl+\— открыть/закрыть терминал<leader> + w— сохранить файлjj— аналог Esc