Колдовской NeoVIM. Часть четвертая. «Полёты во сне и наяву»

95d6820d714c82edfafd012ecf6cc9f8.jpg

Навигация — визитная карточка Neovim. Мы можем молниеносно перемещаться по коду-тексту, не ограниченные скоростью мыши или человеческими возможностями. Говорят, что эксперименты Либета доказали, что человек сначала перемещается, а потом думает… В колдовском редакторе все будет именно так.

HJKL!

77bff72ea4c9d2ba3a7445f0e37c3358.png

Мышь? Забудьте. Мышь — это атавизм.

Стрелочки тоже. Мы тратим доли секунды на перенос руки на стрелочки, но для Колдовского Редактора даже это долго. Если уж решать проблему, то кардинально.

Стрелочки нам больше не нужны (на самом деле все еще нужны, но не в Обычном Режиме). Теперь мы должны перемещаться по тексту, не перенося кисть вправо. Нечего ей там делать… Кисть должна лежать на hjkl и зарабатывать там заслуженный туннельный синдром!

hкурсор переместится на один символ налево (в Обычном Режиме)
jна один символ вниз
kна один символ вверх
lна один символ вправо

Первая мысль, которая у вас возникнет — господи, как же неудобно! Ничего, привыкнете. А когда привыкнете, то начнете летать. Ведь можно делать такое:

5kКурсор прыгнет на 5 строк наверх!

Шах и мат, Обычные Редакторы! Вместо тремора на стрелочке «вверх» мы жмем 2 осмысленные клавиши и прыгаем точно на 5 строк выше.

Мы подошли к понятию «Счетчика». Почти каждая команда в Nvim может предваряться цифровым параметром. Он означает «повтори эту команду столько-то раз». Мы еще с ним не раз встретимся.

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

462547da1c56da180f35ab0ed2cd2d38.png

Прыжки по словам. Мы уже умеем перемещаться посимвольно. Давайте прыгать по словам!

w / b В начало следующего / предыдущего слова.
4w На 4 слова вперед! Вот и счетчик пригодился.
W / B До пробела вправо/влево (то есть прыжки по словам, но включая запятые и другую пунктуацию)
e / ge В конец следующего/предыдущего слова

Прыжки внутри строки. Мы стали чуть быстрее. Включим следующую передачу:

0В начало строки (это ноль)
^ К первому непробельному символу в строке (удобно, если строка начинается с отступа)
g_ К последнему непробельному символу в строке
$ В конец строки

3$ В конец третьей отсюда строки (0 и ^ со счетчиком не используются)

Точные прыжки. Удобно? Да, но все равно есть ограничения, ведь хотелось бы больше контроля над прыжками внутри строки. А если мы захотим прыгнуть к какому-нибудь конкретному слову/символу в строке? Колдовской редактор умеет и такое:

f Прыгнуть к символу в этой строке. Например ft прыгнет к первому символу 't' в данной строке
3f, Прыгнуть к третьей запятой справа от курсора
F Прыгнуть к символу слева от курсора
t «Недопрыгнуть» к символу справа от курсора (остановиться на предыдущем символе)
T «Недопрыгнуть» к символу слева от курсора
; / , (если промахнулись) Промотать вперед или назад, то есть прыгнуть к другим совпадениям.

0dbb09cafb479e94079607222001defe.png

Хм, а по абзацам можно?

} / { Прыжок на абзац вниз / абзац вверх

А по функциям?

[[ К предыдущему блоку (напр. к предыдущему def или class в Питоне)
]] В конец следующего блока
% прыгнуть к matching parentheses. Или просто к первой попавшейся скобке. Суперудобно, если у вас не подсвечиваются парные скобки.

Вот это уже быстро! Но можно разогнаться еще быстрее. Мы можем перемещаться в пределах экрана:

H / M / LПрыжок на верхнюю/среднюю/нижнюю строку в видимой области экрана.

И по файлу целиком:

gg / G Перейти в самое начало/конец файла.
G / : Перейти на конкретную строку. 12G или :12 перенесут вас на 12ю строку. Помним, что  это ENTER
% Перейти по процентам файла. Я почти не пользуюсь, это довольно неточный способ.

* / # К следующему/предыдущему вхождению слова под курсором. Наводим курсор на название функции, например, и прыгаем к каждому следующему использованию данной функции.

Перемещение экрана

2f0d6cb3dc7686ba4be9c63678477e19.png

А еще мы можем оставить курсор на месте (или просто за ним не следить) и двигать сам документ. В обычном редакторе мы бы использовали полосу прокрутки. Неточно и медленно.

Построчные сдвиги
CTRL+y Курсор на месте, а экран смещаем на одну строку вверх
CTRL+e Курсор на месте, а экран смещаем на одну строку вниз
CTRL+x, CTRL+y Такое же перемещение на строку вверх, но в INSERT MODE. CTRL+y можно прожимать много раз подряд
CTRL+x, CTRL+e Такое же перемещение на строку вниз, но в INSERT MODE

Сдвиги в рамках экрана
CTRL+d / CTRL+u На полэкрана вниз / вверх. Лично для меня это самое удобное быстрое перемещение
CTRL+f / CTRL+b На целый экран вниз / вверх. А вот это перемещение многие любители nvim’а не любят, ведь при таком прыжке у вас пропадает контекст и возникает состояние небольшой дезориентации.

zbстрока с курсором окажется снизу экрана
ztстрока с курсором окажется посередине экрана. Удобно, когда вы хотите осмотреться и понять, что находится сверху и снизу вашего кода.
zzстрока с курсором окажется сверху экрана

Метки (marks)

cbdddf4bf93d05b57e13bbedec2f66d7.png

Метки ('m’arks) позволяют быстро возвращаться к определенным местам в файле (локальные), или даже определенным файлам (глобальные).

Начнем с локальных. Локальную метку можно поставить с помощью строчных букв.

m Поставить метку
` Прыгнуть к метке.

Имеется ввиду вот этот символ:

095ed506009c2d22b253d5489fed92a9.png

Метки упрощают работу с большими документами. Например вы можете поместить курсор в начало документа, нажать ms и получить метку 's' в начале файла. Затем вы постоянно работаете с какой-то функцией, которая находится на 326й строке. Наберите:

326Gmf`s

Мы прыгнули к нужной строке, поставили метку «f», и вернулись на стартовую метку. Теперь вы сможете очень удобно перемещаться по этим двум меткам внутри документа.

Глобальные метки работают для всех документов. Вы отмечаете место в любом документе, и всегда можете быстро прыгнуть к нему из другого документа. Команды аналогичны локальным меткам, но используются прописные буквы.

m Поставить глобальную метки (доступна из любого документа)
` Прыгнуть к глобальной метке

:marks Список всех меток

d5f74b5c65d24dbed9c279c4a1e0e47a.png

Как вы видите, помимо локальных и глобальных меток есть еще несколько видов:

  • цифровые (от 0 до 9). Как я понял, каждый следующий выход из файла сохраняется на позиции »0» (название файла и позиция курсора). При новом выходе локация »0» перезапишется на локацию »1». Таким образом у нас сохраняется 9 последних локаций, и мы можем прыгать к ним с помощью `

  • `` позволит прыгнуть к предпоследнему положению. Например вы где-то были, потом куда-то прыгнули, что-то сделали, и вернуться обратно можно через ``.

Лично я использую следующие глобальные метки:
E — переменные окружения
M — main file, главный исполняемый файл
D — Docker file или docker-compose
S — Главный файл настроек

Надеюсь, эта статья поможет вам освоиться с перемещением внутри Nvim и позволит постепенно прийти к состоянию «сначала прыгаю, потом думаю».

А если вы знаете другие способы перемещение в Neovim, то обязательно поделитесь в комментариях!

© Habrahabr.ru