Непоследовательность поведения нумерации VIM

Непоследовательность поведения нумерации VIM

Команды в 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 их и так слишком много, чтобы мы могли их запомнить!

Связанный контент