команда y3s скопировать три строки в обычном режиме в Vim - PullRequest
0 голосов
/ 27 декабря 2018

Согласно логике Vim «Глагол», «Существительное» и «Модификатор» команда y3s потенциально должна скопировать три предложения, но в моей версии Vim этого не происходит.Мне интересно, есть ли причина для этого.При поиске в Интернете кажется, что есть и другие способы скопировать определенное количество предложений, но мне любопытно, почему этот подход не работает.Спасибо!

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Simpley 3Y будет делать, где Y будет дергать строку, а 3 будет повторять ее 3 раза.В Vim нет предложений, есть только строки, слова и символы.

0 голосов
/ 28 декабря 2018

Несколько заблуждений здесь.Во-первых, существует разница между движениями и текстовыми объектами .

Движением (: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 страница очень полезная для чтения, я искренне рекомендую.

0 голосов
/ 27 декабря 2018

Если вы хотите скопировать 3 строки, вы должны сделать y3y, а не y3s.y обозначает янки или копировать.

Обновление,

@ В ответе Амадана есть больше объяснений, а также почему y3y работает.

...