Найти тему
Сделай игру

Neovim и Vim - краткий справочник

Оглавление
Логотип neovim
Логотип neovim

Разумеется, я хотел закрыть эту тему и, разумеется, не мог. По разным причинам. Хотелось как-то обобщить всё то, о чём написал в предыдущих главах и завершить эту тему.

В данному разделе я сведу воедино все использованные плагины, кратко опишу их функциональность и приведу справку по функциональным возможностям vim-подобных редакторов. Её я, разумеется, нашёл в этих ваших интернетах и благополучно перепостил.

Использованные плагины

Менеджер плагинов: https://github.com/junegunn/vim-plug; большая часть плагинов взята с vimawesome.

  • Менеджер сессий - vim-startify;
  • Дерево файлов - NerdTree;
  • Поиск по файлам (предположительно, проекта) - ctrlsf;
  • Открытие файла по нечёткому имени - fzf;
  • Получение всех ярлыков документа в одной панели (читай, имена функций, переменных и прочего) - tagbar;
  • Панель состояния (снизу) - lunaline;
  • Цветовая схема редактора - cattppuccine;
  • Автокомплит (и ещё много полезных фишек) - coc (плюс расширения coc-json, coc-tsserver);
  • Мультикурсор (это вообще довольно жирная тема, там много надо в справку вникать, чтобы эффективней использовать) - vim-visual-multi;
  • Обёртывание текста - surround-vim;
  • Управлением быстрым закомментированием кода - NERD Commenter;
  • Подсветка цветов в HEX режиме - nvim-colorizer;
  • Быстрая генерация HTML - Emmet;

Горячие клавиши

Общее


:h[elp] keyword - открыть справку для ключевого слова keyword
:sav[eas] file - сохранить под названием file
:clo[se] - закрыть текущую панель
:ter[minal] - открыть окно терминала
K - открыть справочное руководство для слова под курсором
---Подсказка---
Выполните vimtutor в терминале, чтобы изучить первые команды Vim.


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

h - передвинуть курсор влево
j - передвинуть курсор вниз
k - передвинуть курсор вверх
l - передвинуть курсор вправо
gj - переместить курсор вниз (многострочный текст)
gk - переместить курсор вверх (многострочный текст)
H - переместиться к началу экрана
M - переместиться к середине экрана
L - переместиться к концу экрана
w - переместиться вперед на начало слова
W - переместиться вперед на начало слова (слово может содержать пунктуацию)
e - переместиться вперед на конец слова
E - переместиться вперед на конец слова (слово может содержать пунктуацию)
b - переместиться назад на начало слова
B - переместиться назад на начало слова (слово может содержать пунктуацию)
ge - переместиться назад на конец слова
gE - переместиться назад на конец слова (слово может содержать пунктуацию)
% - перейти к соответствующему парному символу (по умолчанию поддерживаемые пары: '()', '{}', '[]' - используйте :h matchpairs в Vim для получения дополнительной информации)
0 - переместиться на начало строки
^ - переместиться на первый непробельный символ строки
$ - переместиться на конец строки
g_ - переместиться к последнему непустому символу в строке
gg - переместиться на первую строку документа
G - переместиться на последнюю строку документа
5gg or 5G - переместить на пятую строку
gd - переместиться к локальному объявлению
gD - переместиться к глобальному объявлению
fx - переместиться к следующему вхождению символа x
tx - переместиться перед следующим вхождением символа x
Fx - переместиться к предыдущему вхождению символа x
Tx - переместиться перед предыдущим вхождением символа x
; - повторить предыдущее перемещение f, t, F или T
, - повторить предыдущее перемещение f, t, F или T в обратном порядке
} - переместиться к следующему параграфу (или функции/блоку при редактировании кода)
{ - переместиться к предыдущему параграфу (или функции/блоку при редактировании кода)
zz - централизовать курсор на экране
zt - position cursor on top of the screen
zb - position cursor on bottom of the screen
Ctrl + e - переместить экран на одну строку вниз (без перемещения курсора)
Ctrl + y - переместить экран на одну строку вверх (без перемещения курсора)
Ctrl + b - переместиться назад на целый экран
Ctrl + f - переместиться вперед на целый экран
Ctrl + d - переместиться вперед на половину экрана
Ctrl + u - переместиться назад на половину экрана
---Подсказка---
Добавьте число перед командой перемещения курсора, чтобы повторить её. Например, 4j перемещает курсор на 4 строки вниз.

Режим вставки - вставка/добавление текста


i - вставка перед курсором
I - вставка в начало строки
a - вставка (добавление) после курсора
A - вставка (добавление) в конец строки
o - добавление новой строки под текущей
O - добавление новой строки над текущей
ea - вставка (добавление) после конца слова
Ctrl + h - удалить символ перед курсором в режиме вставки
Ctrl + w - удалить слово перед курсором в режиме вставки
Ctrl + j - перейти на новую строку в режиме вставки
Ctrl + t - добавить один отступ строке (переместить вправо) в режиме вставки
Ctrl + d - убрать один отступ у строки (переместить влево) в режиме вставки
Ctrl + n - вставить (автозаполнить) следующее соответствие перед курсором в режиме вставки
Ctrl + p - вставить (автозаполнить) предыдущее соответствие перед курсором в режиме вставки
Ctrl + rx - вставить содержимое регистра x
Ctrl + ox - временно включить нормальный режим и выполнить команду нормального режима x.
Esc or Ctrl + c - выход из режима вставки

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


r - заменить один символ
R - заменить несколько символов, до нажатия ESC.
J - присоединить нижнюю строку к текущей
gJ - присоединить нижнюю строку к текущей без пробела между ними
gwip - перекомпоновать азбац
g~ - инвертировать регистр в ходе перемещения курсора
gu - перевести в верхний регистр в ходе перемещения курсора
gU - перевести в нижний регистр в ходе перемещения курсора
cc - заменить всю строку
c$ or C - заменить до конца строки
ciw - изменить (заменить) всё слово
cw or ce - заменить до конца слова
s - удалить символ и заменить текст
S - удалить строку и заменить текст (то же, что cc)
xp - переставить две буквы (удалить и вставить)
u - отменить
U - восстановить (откатить) последнюю изменённую строку
Ctrl + r - повторить
. - повторить последнюю команду

Выделение текста (визуальный режим)


v - включить режим выделения текста, выделить строки, затем выполнить команду (например, y-копирование)
V - включить построчный режим выделения
o - переместиться на другой конец выделенной области
Ctrl + v - включить режим выделения блоков
O - переместить на другой угол блока
aw - выделить слово
ab - блок в ()
aB - блок в {}
at - блок в <> тегах
ib - внутренний блок в ()
iB - внутренний блок в {}
it - внутренний блок в <> тегах
Esc or Ctrl + c - выйти из режима выделения текста
---Подсказка---
Вместо b и B также можно использовать ( и { соответственно.

Визуальные команды


> - сместить текст вправо
< - сместить текст влево
y - скопировать выделенный текст
d - удалить выделенный текст
~ - переключить регистр
u - перевести выделенный текст в нижний регистр
U - перевести выделенный текст в верхний регистр
Регистры
:reg[isters] - показать содержимое регистров
"xy - поместить содержимое в регистр x
"xp - вставить содержимое регистра x
"+y - скопировать в системный регистр буфера обмена
"+p - вставить из системного регистра буфера обмена
---Подсказка---
Содержимое регистров сохраняется в ~/.viminfo и восстанавливается при следующем запуске vim.
---Подсказка---
Специальные регистры:
0 - последнее копирование
" - безымянный регистр: последнее удаление или копирование
% - название текущего файла
# - название альтернативного файла
* - содержимое буфера обмена (первичный X11)
+ - содержимое буфера обмена (буфер обмена X11)
/ - последний поисковый паттерн
: - последняя команда
. - последний вставленный текст
- - последнее небольшое (меньшее, чем строка) удаление
= - регистр, возвращающий значение выражения
_ - регистр чёрной дыры

Метки


:marks - список меток
ma - установить метку A на текущей позиции
`a - переместиться к метке A
y`a - скопировать до метки A
`0 - переместиться на позицию, на которой Vim в последний раз был закрыт
`" - переместиться на позицию, на которой был закрыт в последний раз данный файл
`. - переместиться на позицию последнего изменения данного файла
`` - переместиться на позицию перед последним переходом
:ju[mps] - открыть список переходов
Ctrl + i - перейти к более новому переходу в списке переходов
Ctrl + o - перейти к более старому переходу в списке переходов
:changes - открыть список изменений
g, - перейти к более новому изменению в списке изменений
g; - перейти к более старому изменению в списке изменений
Ctrl + ] - перейти к тегу под курсором
---Подсказка---
Для перехода к отметке вы можете использовать как знак побочного ударения (`), так и апостроф ('). Использование апострофа переводит к началу (первой непустой) строки, содержащей отметку.

Макросы


qa - записать макрос A
q - остановить запись макроса
@a - выполнить макрос A
@@ - выполнить последний макрос

Вырезать и вставить


yy - скопировать строку
2yy - скопировать 2 строки
yw - скопировать слово
yiw - скопировать слово под курсором
yaw - скопировать слово под курсором и пространство перед или после него
y$ or Y - скопировать до конца строки
p - вставить буфер обмена после курсора
P - вставить буфер обмена перед курсором
gp - вставить буфер обмена после курсора и переместить курсор после вставленного текста
gP - вставить буфер обмена перед курсором и переместить курсор после вставленного текста
dd - удалить (вырезать) строку
2dd - удалить (вырезать) 2 строки
dw - удалить (вырезать) слово
diw - удалить (вырезать) слово под курсором
daw - удалить (вырезать) слово под курсором и пространство перед или после него
:3,5d - delete lines starting from 3 to 5
---Подсказка---
You can also use the following characters to specify the range:
e.g.
:.,$d - From the current line to the end of the file
:.,1d - From the current line to the beginning of the file
:10,$d - From the 10th line to the beginning of the file
:g/{pattern}/d - delete all lines containing pattern
:g!/{pattern}/d - delete all lines not containing pattern
d$ or D - удалить (вырезать) до конца строки
x - удалить (вырезать) символ

Отступы текста


>> - добавить один отступ строке (переместить вправо)
<< - убрать один отступ у строки (переместить влево)
>% - добавить один отступ блоку в () или {}
<% - de-indent a block with () or {} (cursor on brace)
>ib - изменить отступ внутреннему блоку в ()
>at - изменить отступ блоку в <> тегах
3== - выровнить отступы 3-х строк
=% - выровнить отступы блока в () или {}
=iB - выровнить отступы блока в {}
gg=G - выровнить оступы всего буфера
]p - вставить и выровнить отступы по строке под курсором

Выход и сохранение


:w - сохранить файл, но не выходить
:w !sudo tee % - сохранить файл с sudo
:wq or :x or ZZ - сохранить файл и выйти
:q - выйти (терпит неудачу в случае несохраненных изменений)
:q! or ZQ - выйти без сохранения
:wqa - записать (сохранить) и выйти во всех вкладках и буферах
Поиск и замена
/pattern - поиск шаблона
?pattern - обратный поиск шаблона
\vpattern - 'very magic' режим: все не алфавитно-цифровые символы интерпретируются как специальные (экранирование не требуется)
n - повторить поиск в том же направлении
N - повторить поиск в обратном направлении
:%s/old/new/g - заменить все вхождения шаблона в файл на указанное значение
:%s/old/new/gc - заменить все вхождения шаблона в файл на указанное значение с подтверждением
:noh[lsearch] - отключить подсвечивание результатов поиска
Поиск в нескольких файлах
:vim[grep] /pattern/ {`{file}`} - поиск по шаблону в нескольких файлах
e.g. :vim[grep] /foo/ **/*
:cn[ext] - переместиться к следующему совпадению
:cp[revious] - переместиться к предыдущему совпадению
:cope[n] - открыть окно со списком результатов
:ccl[ose] - закрыть окно со списком результатов

Вкладки


:tabnew or :tabnew {page.words.file} - открыть файл в новой вкладке
Ctrl + wT - переместить текущее окно в собственную вкладку
gt or :tabn[ext] - переключиться на следующую вкладку
gT or :tabp[revious] - переключиться на предыдущую вкладку
#gt - переключиться на вкладку с номером #
:tabm[ove] # - переместить текущую вкладку на # позицию (нумерация с 0)
:tabc[lose] - закрыть текущую вкладку и все её окна
:tabo[nly] - закрыть все вкладки, кроме текущей
:tabdo command - выполнить command на всех вкладках (к примеру, :tabdo q закрывает все открытые вкладки)

Работа с несколькими файлами


:e[dit] file - редактировать файл в новом буфере
:bn[ext] - перейти к следующему буферу
:bp[revious] - перейти к предыдущему буферу
:bd[elete] - удалить буфер (закрыть файл)
:b[uffer]# - перейти к буферу по номеру #
:b[uffer] file - перейти к буферу по имени файла
:ls or :buffers - список всех открытых буферов
:sp[lit] file - открыть файл в новом буфере и разделить окно
:vs[plit] file - открыть файл в новом буфере и вертикально разделить окно
:vert[ical] ba[ll] - развернуть все буферы как вертикальные окна
:tab ba[ll] - развернуть все буферы как вкладки
Ctrl + ws - разделить окно
Ctrl + wv - разделить окно вертикально
Ctrl + ww - переключение окон
Ctrl + wq - закрыть окно
Ctrl + wx - поменять местами текущее окно со следующим
Ctrl + w= - сделать все окна одинаковой высоты и ширины
Ctrl + wh - переместить курсор в левое окно (вертикально разделение)
Ctrl + wl - переместить курсор в правое окно (вертикальное разделение)
Ctrl + wj - переместить курсор в окно ниже (горизонтальное разделение)
Ctrl + wk - переместить курсор в окно выше (горизонтальное разделение)
Ctrl + wH - сделать текущее окно максимальным по высоте и крайним слева (самым левым вертикальным окном)
Ctrl + wL - сделать текущее окно максимальным по высоте и крайним справа (самым правым вертикальным окном)
Ctrl + wJ - сделать текущее окно максимальным по ширине и крайним снизу (самым нижним горизонтальным окном)
Ctrl + wK - сделать текущее окно максимальным по ширине и крайним сверху (самым верхним горизонтальным окном)

Различия файлов


zf - вручную определить свёртку в ходе перемещения курсора
zd - удалить свёртку под курсором
za - переключить состояние свёртки под курсором
zo - раскрыть свёртку под курсором
zc - свернуть свёртку под курсором
zr - раскрыть все свёртки на один уровень
zm - свернуть все свёртки на один уровень
zi - переключить состояния всех свёрток в буфере
]c - перейти к началу следующего отличия
[c - перейти к началу предыдущего отличия
do or :diffg[et] - скопировать отличия (из другого буфера)
dp or :diffpu[t] - вставить отличия (в другой буфер)
:diffthis - сделать текущее окно частью окна сравнения
:dif[fupdate] - обновить отличия
:diffo[ff] - выключить режим сравнения для текущего окна
---Подсказка---
Команды для свёрток (например, za) работают на одном уровне вложенности. Чтобы работать на всех уровнях, используйте заглавные буквы (например, zA).
---Подсказка---
Чтобы увидеть различия файлов, можно напрямую запустить Vim в режиме сравнения, выполнив в терминале vimdiff. Можно даже установить его как git difftool.