
Команды в VIM могут начинаться с цифр, но для некоторых операций схема нумерации не является единообразной.
Добавление числа к командам движения влево, вниз, вверх и вправо (H, J, K, L) приводит к перемещению курсора в ожидаемое место, например, 1L
к перемещению на один символ вправо.
Текущую строку можно перемещать вверх или вниз с помощью :m+N
или , однако, чтобы получить обратный эффект, :m-N
придется использовать .:m-2
:m+1
Я также использую VSVim в Visual Studio 2019 и использую команды gt
и gT
для переключения между вкладками. Если у меня открыто три вкладки и я в данный момент нахожусь на первой вкладке (самой левой), то с помощью 3gt
переключусь на третью вкладку. Если я нахожусь на третьей вкладке (самой правой), то 2gT
переключусь обратно на первую вкладку, а 3gT
в результате останусь на той же вкладке.
Почему для достижения противоположных эффектов нужно использовать разные числа? Возможно, это недостаток дизайна, который просто не был изменен?
решение1
Ваше замечание о наличии здесь несоответствий верно.
Хотя {count}
чаще всего используется для повторения действия, это не всегда так. Иногда он воспринимается как абсолютное число, например, 47G
для перехода к строке 47, 35|
для перехода к столбцу 35 в текущей строке или 90%
для перехода к строке на 90% в файле.
Иногда он просто используется для обозначения различных разновидностей одной и той же команды. Например, CTRL-G
выведет информацию о файле, открытом в текущем буфере. 1 CTRL-G
выведет эту информацию, но покажет полный путь к файлу. 2 CTRL-G
(или любое большее число) выведет то же самое, а также включит номер буфера в вывод. (См.:help CTRL-G
для получения подробной информации.)
Обращаясь к вашим конкретным примерам:
Добавление числа к командам перемещения влево, вниз, вверх и вправо (
hjkl
) приводит к перемещению курсора в ожидаемое место, например,1l
к перемещению на один символ вправо.
Это типичное использование {count}
, как повторение команды.
Текущую строку можно перемещать вверх или вниз с помощью
:m +N
или , однако, чтобы получить обратный эффект,:m -N
придется использовать .:m -2
:m +1
Во-первых, это не совсем {count}
, а {address}
. Это на самом деле последовательно (даже если на первый взгляд это может показаться странным). Команда :m
переместит текущую строкунижелиния, указанная в адресе.
Если вы находитесь на строке 47, вы бы использовали , :m 48
чтобы переместить ее ниже следующей строки. Поскольку текущая строка перемещена, та, которая была 48, теперь 47, а текущая строка — 48. Если вы теперь хотите вернуть ее в исходное положение, вам нужно :m 46
, так как она идетнижестрока с адресом +1
— это просто сокращение до 48 (начинается со строки 47) и -2
просто сокращение для 46 (находясь сейчас на строке 48). Логично, не так ли?
Если бы Vim решил переместить строкувышеадрес, если адрес предшествует ему, то поведение команды, например, :m 46
будет зависеть от того, находится ли текущая строка выше или ниже него, и это было бы не очень хорошо. Поэтому Vim решил, что последовательность в этом факторе важнее.
Я использую команды gt и gT для переключения между вкладками. Если у меня открыто три вкладки и я сейчас на первой вкладке (самой левой), то использование 3gt переключит на третью вкладку. Если я на третьей вкладке (самой правой), то 2gT переключит обратно на первую вкладку, тогда как 3gT оставит ту же вкладку.
Да, это действительно непоследовательно, но на то есть причина.
При реализации вкладок авторы Vim решили, что важнее иметь быстрый способ переключения на вкладку "N", чем пропускать вкладки "N". Последнее случается редко. Поэтому они решили использовать {count}
как абсолютный номер вкладки для gt
команды.
С другой стороны, нет особой необходимости в том, чтобы gT
командование реализовывалотакой жеповедение (у вас уже была более простая комбинация клавиш для этого), поэтому значение повтора {count}
осталось, так что если кто-то захочет пропустить вкладки "N", эта команда может помочь...
Обратите внимание, что таким образом можно иметь три команды (следующая вкладка, предыдущая вкладка, переход на вкладку «N»), при этом принимая только две команды, gt
и gT
, и наличие меньшего количества команд довольно важно, поскольку в Vim их и так слишком много, чтобы мы могли их запомнить!