Подтвердить что ты не робот

Почему "d1j" удаляет две строки в vim?

Команда d{motion} работает непоследовательно:

d1j  " deletes 2 lines to the bottom
d1l  " deletes 1 character to the right

Ожидается ли это поведение?

4b9b3361

Ответ 1

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

j представляет собой включенное по строке движение. Вероятно, вы хотите попробовать dvj или dgj (последний работает со строками экрана).

См. :help operator. Вы можете принудительно перемещать движения по линуалу, по буквам или по блоку с V, v или CTRL-V соответственно.

Ответ 2

На самом деле это не противоречит. Думаю, вы искали

  • удалить одну строку: d d (которая является командой)
  • удалите одну строку вниз: d 1 j (или короткая d j). Это оператор с движением)

Остальные удивительные биты связаны с концепцией vim линейного, блочного и символьного движений, которые на самом деле являются просто абстракциями, позволяющими Vim делать правильную вещь или делать то, что вы ожидаете при работе по выбору.


Как и @Benoit, d - оператор, который принимает движение.

2j будет линейным, он сдвинет две строки вниз, покрывая 3 строки.

Обратите внимание, что если вы хотите получить некоторые визуальные подсказки с этим, вы можете установить опцию rn

:se relativenumber

Это приведет к тому, что в левом "канаве" редактора будет отображаться относительное полотно. Эти числа могут использоваться как "адреса" и делать то, что вы ожидаете, когда делаете "d12j" или "d12k"

Я рекомендую познакомиться с движениями text object, прежде чем привыкнуть к этому, между прочим. Много раз текстовые объекты намного точнее (и часто работают в режиме символа, только ухудшая их соответствие в соответствующих условиях)