Почему вставка vim ведет себя по-разному в зависимости от метода извлечения

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

Если я дергаю строку, начиная с нормального режима:

^v$y

^ перейти к началу строки

v для входа в визуальный режим

$ перейти в конец строки

y дергать

Затем я использую p для вставки, и он работает, как и ожидалось.

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

Vy

V для перехода в визуальный режим построчно

y дергать

И затем я использую p для вставки, я вижу, что строка вставляется ниже текущей строки. Это похоже на операцию вставки, которая сначала открывает новую строку, а затем вставляет ее туда.

Пример. Строки в начале:

Line1
Line2
Line3. Insert here 

Я дергаю Line2, используя метод 1.

Я подвожу курсор к точке Line3 и нажимаю p для вставки. Я получаю этот результат:

Line1
Line2
Line3.Line2 
 Insert here

Но когда я делаю то же самое, используя второй метод выдергивания, я получаю такой результат:

Line1
Line2
Line3. Insert here
Line2

Если содержимое :registers одинаково в обоих случаях, почему вставка работает по-разному?

Редактировать:

Нашел ответ здесь

Даже если содержимое регистра одинаково; тип регистра становится другим в зависимости от метода извлечения, а другой тип регистра заставляет вставку выполнять разные действия.


person Robert    schedule 31.10.2018    source источник


Ответы (3)


Объяснение

Если вы внимательно посмотрите, вы должны увидеть разницу в том, использовали ли вы v$ или V:

:registers ab
--- Registers ---
"a   foo
"b   foo^J

Этот ^J — это символ новой строки, означающий, что вся строка была перенесена.

Движения затрагивают либо целые строки, либо символы между начальной и конечной позицией. Внутри Vim это называется :help linewise и посимвольно. То же самое относится к визуальному режиму (и есть третий режим для <C-V>, называемый поблочным). Итак, имеет значение, как вы дергаете вещи! Вы видите это в команде :registers, а также можете запросить это через :help getregtype()< /a>, но на практике это редко становится неожиданностью (после того, как вы поняли концепцию).

Мощь с помощью плагинов

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

С его помощью вы можете просто использовать gcp/gcP для вставки после/перед позицией курсора, независимо от того, как вы вытащили текст (например, из линейного визуального режима через V, как в вашем вопросе).

person Ingo Karkat    schedule 31.10.2018
comment
В моем случае я вижу, что содержимое регистров одинаково для обоих методов выдергивания, включая возврат каретки в конце. Если содержимое реестра одинаковое, почему вставка работает по-разному? - person Robert; 31.10.2018
comment
У вас есть :set virtualedit=onemore? Затем вы включаете новую строку в v$y. Тем не менее, тип по-прежнему является посимвольным, поэтому при вставке будет присутствовать завершающая новая строка, но новая строка не добавляется в начале - в отличие от того, что произошло бы с Vy. - person Ingo Karkat; 31.10.2018
comment
Вы ясно увидите это с :echo getregtype('"'); это то, на чем Vim основывает свой тип вставки. Выход :registers не эквивалентен на 100% (но обычно это крайние случаи, когда они отличаются). - person Ingo Karkat; 31.10.2018
comment
У меня нет :set virtualedit=onemore, но я вижу тип регистра, который отличается в зависимости от метода извлечения. Спасибо, что указали мне правильное направление. - person Robert; 31.10.2018
comment
А, хорошо! В другом вопросе, на который вы ссылались в своем вопросе, также упоминается getregtype(), как и в моем ответе. Пожалуйста, примите мой ответ, нажав на обрисованную галочку. Таким образом, вопрос помечается как закрытый, и вы увеличиваете свои шансы получить ответы на будущие вопросы, так как это показывает, что вы заботитесь об ответах. - person Ingo Karkat; 31.10.2018

Нашел ответ здесь

Даже если содержимое регистра одинаково; тип регистра меняется в зависимости от метода извлечения. Тип регистрации заставляет вставку делать другую вещь. И вы можете увидеть тип регистра для данного регистра, набрав :echo regtype('"')

person Robert    schedule 01.11.2018

Вместо Vy я бы рекомендовал yg_, а также мог бы быть vg_y, но вы бы набрали лишний символ. Так:

yg_ ................... yank until the last character of the line

OBS: g_ не включает символ новой строки. Подробнее :h g_

чтобы выбрать от первого символа строки до последнего без новой строки:

_vg_

_ ............... jump to the first non-blank char
v ............... visual
g_ .............. las non-blank of the line
person SergioAraujo    schedule 31.10.2018