Почему yyp не ведет себя согласно документации p - PullRequest
1 голос
/ 29 мая 2020

Мне просто интересно, может ли кто-нибудь объяснить, что происходит за кулисами в отношении поведения yyp .

Учитывая какой-то текст:

Text that can be copied

ввод yyp в то время как курсор находится в середине строки, скажем, непосредственно перед can, приводит к:

Text that can be copied
Text that can be copied

Что, хотя и очень полезно и логично, но не то p обычно делает.

Поскольку p вставляется после курсора, а мой курсор остается перед can, я не думаю, что было бы неправильно ожидать чего-то вроде:

Text that Text that can be copied can be copied

Хотя я согласен, что первое более полезно - может ли кто-нибудь объяснить, почему и как в этих случаях игнорируется поведение по умолчанию p ?

Ответы [ 2 ]

4 голосов
/ 29 мая 2020

Это объясняется в :help linewise-register. Движения Vim охватывают либо последовательность символов, либо целые строки. Точно так же текст, вставленный в регистр, состоит из символов (включая символы новой строки, но не заканчиваются на одну), полных строк (всегда заканчивающихся новой строкой) или блока текста (из <C-V> блочного визуального выбора) . При вставке "точка вставки" определяется исходным регистром, поэтому полные строки будут вставлены в отдельные строки. Команда :reg указывает тип для каждого регистра с c / l / b в первом столбце.

:reg abc
Type Name Content
c  "a   a word
l  "b   a line^J
b  "c   a block^Jof text

Я согласен с вами что поведение по умолчанию полезно. Иногда бывает полезно переопределить это, например, чтобы вставить неполный текст как отдельную строку или вставить полностью удаленную строку внутри существующей строки. Vim предлагает способы вставить содержимое регистра так, как вы хотите, но вы должны запомнить это и несколько клавиш для ввода. Мне так часто приходилось «переводить» содержимое регистра в определенный (посимвольный / построчный / поблочный) режим, я написал для него UnconditionalPaste plugin . Он предоставляет gcp, glp, и т.д. c. альтернативы встроенным командам вставки, которые принудительно устанавливают определенный режим (и к настоящему времени еще несколько вариантов этой темы, например, вставка с помощью запятых или запрошенных символов).

0 голосов
/ 29 мая 2020

В Vim извлеченный текст хранится во внутренней переменной, называемой «регистр». Однако регистры в Vim хранят не только сам текст, но и «тип текста» (один из «char», «line» или «block», как и в визуальных режимах).

Итак yy сохраняет текст «Текст, который можно скопировать» с типом «строка». Таким образом, команда p учитывает это и помещает его в отдельную строку.

Вы можете изменить это с помощью :call setreg('', @@, 'c') (сохраняя новую строку в конце, но перезаписывая внутренний тип) или дергая его с помощью 0y$ et c.

...