Найти тему
Блокнот математика

Рубрика "Секреты Вим". Стрелки

Всем привет, обсудим ... стрелочки. Те четыре клавиши со стрелками влево, вправо, вверх и вниз.

Вот эти.
Вот эти.

Начнем с того, что у этих клавиш есть дублеры: это h, j, k, l в нормальном режиме. Клавиши h и l находятся слева и справа, они означают ← и →, соответственно. Буква j похожа чем-то на ↓, ну, а k между ними означает ↑. Считается, что удобнее использовать их при скоростной работе с текстом: руки лежат на клавиатуре, левая слева, правая справа, и эти стрелки как раз под пальцами правой руки.

https://i.stack.imgur.com/L3esv.jpg
https://i.stack.imgur.com/L3esv.jpg

Наличие двух комплектов стрелок позволяет переопределить поведение этих команд, оставив один набор. Либо вы можете использовать hjkl для чего-то вообще другого, либо можете модифицировать поведение. Если решите переопределять стрелки, то помните их обозначение: <Up>, <Down>, <Left>, <Right>. Если это слишком сложно, можно ввести код через <C-K>:

:map <C-K>←← ...

Здесь <C-K> означает, что надо нажимать Control+K, а не вводить этот текст в уголках.

У Вим есть возможность сворачивать длинные строки. Если выставлен флаг :set wrap, то строки, которые не уместились в экран, переносятся, занимая две и более "логических строк" на экране. Физически это одна строка с тем же самым номером. Если флаг снят (:set nowrap), то длинные строки уходят за край. Флаг можно переключать, как любой флаг: :set wrap!

Но вот тонкость: стрелки ↓↑ переходят на физическую строку ниже/выше, так что попасть на нужную логическую строку становится не так просто. Если не знать про команды gj, gk, которые перемещаются по логическим строкам. Можно переопределить j на gj, оставив стрелки для обычного движения, или наоборот, или переопределить все, считая логические строки равноценными физическим. Зависит от задачи!

Есть еще одно отличие команд j и gj. Первая перемещается построчно, так что dj удалит две строки полностью: текущую и одну под ней. А gj перемещается посимвольно, так что dgj удалит всё от курсора до символа, который под ним на следующей строке.

Команды gl нет, можете использовать комбинацию, а вот gh есть, но смысл у нее совсем другой. Если вы не используете классическое выделение (а вряд ли), то тоже можете использовать эту комбинацию для своих целей.

Есть ещё команды семейства стрелок. Это <C-P> (синоним k), <C-N> (синоним j). Еще клавиши плюс (+) и минус (-), которые как стрелки, но переходят на первый непробельный символ строки ниже/выше.

Клавиша _ переходит на первый непробельный символ этой же строки, но с повторителем идет вниз, как стрелка (и похожа на +, только повторитель на 1 больше). Есть команда g_, которая работает так же, только идет на последний непробельный символ.

Аналогично работают и 0 и $: переходят на первый/последний символ данной строки, но с повторителем идут ниже.

Клавиши <BS> и пробел работают как стрелки влево и вправо в нормальном режиме! Если вы их не переопределили, а я советую так поступить. У меня пробел вставляет пробел, а <BS> работает как ему и положено: dh.

И последнее, самое интересное: переход через конец строки.

По умолчанию при нажатии ← в начале строки или → в конце курсор не переводится на следующую/предыдущую строку. Это полезно при редактировании кода или конфигурационных файлов, когда каждая строка сама по себе. Но в тексте обычно строки сливаются в текст, и логично скользить по тексту, а не по строке. Конец строки — чисто визуальная фишка, он не должен быть непреодолимым барьером.

Но такое поведение можно исправить, задав переменную

:set whichwrap=b,s,<,>,[,]

Возможные значения через запятую задают команды, смещающие курсор по строке, которым можно переходить на следующую/предыдущую по необходимости:

  • b — <BS> (эта команда просто двигает курсор влево!),
  • s — пробел (двигает курсор вправо, ничего не меняет!),
  • < и > — стрелки, в командном и визуальном режимах,
  • [ и ] — стрелки в режиме вставки или замены,
  • h и l — эти команды (h и l) в командном режиме (эти две опции не рекомендовано задавать).
  • Еще есть ~, которая разрешает такое поведение для команды ~, меняющей регистр символа.

Здесь надо учитывать такой нюанс: конец строки — это символ. Так что если вы нажмете d2→ на последнем символе строки, а в whichwrap присутствует >, то вы удалите этот символ и конец строки (строки сольются). А вот просто переход 2→ символ конца строки игнорирует, так что курсор окажется на втором символе следующей строки.

А вот l, h с операторами не переходят на новую строку. Так что d2l на последнем символе удалит этот символ, и всё, даже если l входит в whichwrap. Она влияет только на перемещение курсора. Поэтому и не рекомендуется включать h,l в whichwrap, а перемещаться как нравится — стрелками.

Удачи, коллеги!

Оглавление рубрики

Путеводитель по каналу