Перемещение в Vim

Я иду по файлу длиной в двадцать тысяч строк и ни разу не сбился с пути, потому что не помню дороги наизусть: я помню команды. Перемещение в Vim — это не «курсор бегает по экрану», это навигация по памяти, где у каждой позиции есть имя, смещение и расстояние. Мышь измеряет расстояние в пикселях, мы — в словах, строках и абзацах, то есть в самих единицах, из которых текст состоит. Модные редакторы с гордостью рисуют мини-карту в боковой панели, чтобы ты знал, где ты. Vim предлагает не знать, где ты, а знать, куда идти.

Основные команды перемещения

Стрелки

Хотя использование стрелок в Vim не рекомендуется для опытных пользователей, они всё же доступны:

  • h — влево
  • j — вниз
  • k — вверх
  • l — вправо

Четыре клавиши, которые тянут руку к гибели: за ними — мышь, а за мышью — привычка щуриться на пиксели. Держись подальше, пока не поздно.

В режиме вставки доступно перемещение по тексту

  • C-h,j,k,l — переместиться влево, вниз, вверх, вправо.
  • C-w - удалит слово перед курсором
  • C-u - удалит всё до курсора

Перемещение по словам

Слово — это атомарная единица смысла, и команды w, e, b режут текст ровно по этим атомам, как хороший дизассемблер режет поток по границам инструкций. Никакого «дальше на один символ, ещё раз, ещё» — прыжок туда, где начинается или кончается мысль.

  • w — переместиться к началу следующего слова.
  • e — переместиться к концу текущего слова.
  • ge - переместиться к концу предыдущего слова.
  • b — переместиться к началу предыдущего слова.

Видео «word-motions» не найдено (урок не готов или slug неверный).

Перемещение по строкам

Строка — это уже не символы, а предложение, у которого есть начало, серая зона отступов и конец. Три клавиши на три границы, и больше ничего не нужно.

  • 0 — переместиться в начало текущей строки.
  • ^ — переместиться к первому непробельному символу строки.
  • $ — переместиться в конец текущей строки.

Видео «move-down» не найдено (урок не готов или slug неверный).

Перемещение по тексту

А теперь — целиком: весь файл как одна кусковая память, от первого байта до последнего, с параграфами вместо страниц.

  • gg — переместиться в начало файла.
  • G — переместиться в конец файла.
  • { — переместиться к началу текущего параграфа.
  • } — переместиться к началу следующего параграфа.

Продвинутые команды перемещения

Комбинированные команды

Здесь включается настоящий хардкор: число перед командой превращает жест в цикл. Одно нажатие — пять строк вниз, и пальцы уже не считают, а считает за них машина.

  • 5j — переместиться вниз на 5 строк.
  • 3w — переместиться вперед на 3 слова.
  • 2b — переместиться назад на 2 слова.

Поиск

Поиск — это запрос к индексу, а не листание глазами. Шаблон, направление, и весь файл сжимается до одного совпадения.

  • /pattern — поиск текста по шаблону pattern вперед по файлу.
  • ?pattern — поиск текста по шаблону pattern назад по файлу.
  • n — перейти к следующему вхождению найденного шаблона.
  • N — перейти к предыдущему вхождению найденного шаблона.

Метки и переходы

Метка — это адрес в адресном пространстве файла: поставил a, и позиция стала известна всем последующим командам. Возврат — как ret в стеке, назад ровно туда, откуда ушёл.

  • ma — установить метку a на текущей позиции курсора.
  • 'a — перейти к метке a.
  • '' — вернуться к предыдущей позиции курсора.

Перемещение по словам и символам

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

  • f<char> — переместиться к следующему вхождению символа <char> в строке.
  • t<char> — переместиться к символу перед следующим вхождением <char> в строке.
  • F<char> — переместиться к предыдущему вхождению символа <char> в строке.
  • T<char> — переместиться к символу после предыдущего вхождения <char> в строке.
  • ; повторить последнюю команду f или F;
  • , повторяет поиск, но, в отличие от «;», в обратном порядке.

Перемещение по скобкам

Одна клавиша — и курсор перепрыгивает на парную скобку. Для языков со стеком вызовов это как проследить возврат адреса по регистрам, только быстрее.

  • % — переместиться к соответствующей открывающей или закрывающей скобке ((), {}, []).

Дополнительно

В Lazyvim используется плагин flash.nvim, который позволяет быстро передвигаться по коду, используя s<char>

flash

Flash работает только с видимой частью буфера.

Для прокрутки можно использовать

  • <ctrl><d> - вниз
  • <ctrl><u> - вверх
  • <ctrl>f - вперед (для данных команд можно указать, насколько вперёд, <ctrl>5f - на 5 страниц вперёд)
  • <ctrl>b - назад

Если нажать клавишу z в режиме Normal:

Z key menu

Клавиши относительного курсора, которые я использую исключительно для прокрутки, - это zt, zb и zz. Они перемещают строку, на которой находится курсор, в верхнюю, нижнюю или среднюю часть экрана соответственно. При перемещении в верхнюю или нижнюю часть экрана над или под курсором остается несколько строк контекста.

Существуют и другие команды, которые также перемещают курсор в первый столбец окна, но вместо того, чтобы запоминать эти сочетания клавиш, я рекомендую сочетать предыдущие команды с 0, как в zt0, zb0 и zz0. Команда 0 просто означает «Перейти к началу строки». Вы также можете использовать home, если на вашей клавиатуре есть клавиша home, но 0 легче нажимать на многих клавиатурах.

Заключение

Никто не рождается с этими командами в пальцах: сначала они чужие, потом тяжёлые, потом — свои, как тропа, по которой ходишь в темноте и не спотыкаешься. Владение перемещением — это и есть вся разница между тем, кто ищет текст глазами, и тем, кто до него доходит. Дорога становится своей, когда перестаёшь её замечать, — а курсор стоит ровно там, где ты его оставил.

Полезные ресурсы

  • Vim Tutor — интерактивное руководство по Vim.
  • Vimcasts — видеоуроки по использованию Vim.
  • Vim документация — официальная документация Vim.

Несколько дней практики — и пальцы будут знать дорогу лучше, чем ты сам.