Навигация - визитная карточка 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-composeS
- Главный файл настроек
Надеюсь, эта статья поможет вам освоиться с перемещением внутри Nvim и позволит постепенно прийти к состоянию “сначала прыгаю, потом думаю”.
А если вы знаете другие способы перемещение в Neovim, то обязательно поделитесь в комментариях!