Несколько заблуждений здесь.Во-первых, существует разница между движениями и текстовыми объектами .
Движением (:help navigation
) является команда, которая изменяет положение курсора: l
справа, j
вниз, )
для предложения вперед, 2Fx
назад к предыдущему предыдущему x
в той же строке, /foo/e+2<CR>
вперед на 2 символа после конца следующего foo
, w
начало следующего слова.Команды, аргумент которых является движением, работают с текстовым промежутком от текущей позиции до новой позиции, определенной движением.dw
удаляет, таким образом, из текущей позиции в начало следующего слова.
Текстовый объект (:help text-objects
) определяет семантическую единицу текста;обычно он состоит из двух нажатий клавиш, первое из которых i
(внутри, внутри) или a
(a, an, вокруг).i"
внутри двойных кавычек, a(
в скобках, is
внутреннее предложение (т.е. без пробелов вокруг него), 2aw
дважды в слове.Таким образом, daw
удаляйте вокруг этого слова (включая пробел) или, проще, удаляйте слово.
Разница очевидна: если вы находитесь в середине слова, например, Some peng|uins fly
(с * 1030)* представляет курсор), dw
дает вам Some peng|fly
(удаление от курсора до начала следующего слова), в то время как daw
дает вам Some |fly
(удаление всего слова penguins
вместе со следующим пробелом, потому чтомодификатора "вокруг").diw
даст вам Some | fly
(без учета пробела в удалении).
Как вы заметите, "предложение" имеет другое отображение в текстовых движениях ((
предложение назад, * 1041)* предложение вперед) и текстовые объекты (is
внутреннее предложение, as
предложение).Между тем, (
как текстовый объект, эквивалентный )
и b
, - это все внутри или вокруг скобок;и s
как текстовое движение не существует по умолчанию.
Таким образом, y2s
не является известным отображением, так как вы удаляете с помощью motion (нет i
или a
), а движения нет s
;он ничего не будет делать.
Вы можете использовать y2)
, что приведет к смещению примерно в полтора предложения (то есть от курсора до начала второго следующего предложения);или вы можете использовать y2as
, чтобы восстановить текущее предложение, следующее предложение и пробел после него;или y2is
за то же самое, за исключением этого последнего пробела;но вы не можете использовать y2s
.(Вы также можете написать все это как 2y)
, 2yas
, 2yis
.)
В y2y
(или эквивалентно 2yy
), второй y
является дублированиемоператор.В Vim почти правило, что движение, равное оператору, является строкой: yy
дергать строку, dd
удалять строку, gqgq
(или gqq
) переформатировать строку, ==
фильтроватьстрока, gugu
(или guu
), верхний регистр строки и т. д. Причина в том, что удобство - это то, над чем мы работаем чаще всего, и трудно сделать более быстрое заклинание, чем та же клавиша, нажатая дважды.Таким образом, второй y
сам по себе не имеет значения: он означает, что первый y
работает над строками (таким образом * y2y
или 2yy
дергает две строки).
Целое :help motion.txt
страница очень полезная для чтения, я искренне рекомендую.