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

HJKL!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Построчные сдвиги
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)

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

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

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

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

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

326Gmf`s

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

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

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

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

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

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

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

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


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

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

Комментарии (4)


  1. EvilShadow
    04.01.2023 18:36
    +2

    Но причём тут NEOvim? Всё это есть в Vim из 1991 года, а многое - в Vi из 1976. Собственно, vimtutor


  1. johnfound
    05.01.2023 01:10
    -1

    Ну, я просто настраиваю клавиатуру на repeat speed 50 символов в секунду и repeat delay 250мс. И могу перемещаться очень быстро по тексту. В (почти) произвольном редакторе.


  1. 4eburashk
    05.01.2023 11:16
    +1

    :read !apropos vim
    esc
    и по каждому названию K в обычном режиме (shift+k) и читать до просветления.
    Почерпнёте не только умение прыгать по меткам, но и знания. Заодно забудете про Neovim т.к. без lua статья про Neovim не нужна вообще.


  1. Mitai
    05.01.2023 14:27

    Дружище а можешь написать о пробелах при перемещении на новую строку, я сейчас с этим столкнулся и не могу нагуглить как победить, если нахожусь в теле класса или функции то при переходе на новую строку курсор должен встать на 2 пробела но он прыгает на 4...