Как вставить визуальный блок, начиная с другой строки

10

Мне потребовалось очень много времени, чтобы осознать, что помещение (вставка) чего- pлибо или Pвыделение визуального блока ctrl+vили его извлечение (копирование) с помощью yсохраняет прежний способ, так что, когда скопированный текст находился в середине строк, он будет тогда скопирован среди середины другого текста когда бы ни было возможно. Напротив, select-line with Vне вставляет скопированную строку среди другого текста, а начинает с другой строки.

Например, предположим, у меня уже есть:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
12/15:
12/16:
12/17:

Когда я хочу вырезать Avocadoи, Beanи Cherry, выбрав (выбор представлен как _)

12/12: ________ Apple.
12/13: ________ Banana.
12/14: ________ Citron.
12/15:
12/16:
12/17:

и нажав y, и переместите курсор на следующую строку (курсор представлен как _),

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
_2/15:
12/16:
12/17:

и нажмите P. Это приводит к:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.12/15:
Bean.   12/16:
Cherry. 12/17:

Но то, что я хотел, было:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.
Bean.   
Cherry. 
12/15:
12/16:
12/17:

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

Кажется, лучший способ вставить что-то, начинающееся с другой строки, это переместить курсор на начало 0, а вниз на 3 строки, на новое место; и войдите в режим вставки с помощью i, и нажмите <return>3 раза, и переместите курсор назад на 6 строк и вправо, обратно на исходное место; и копировать, и снова переместить на новое место, и вставить, как я делал выше.

Могу ли я сохранить несколько штрихов? Или что ты обычно делаешь?

(Изменить: то, что было сказано выше, было то, как я понял это в тот момент, когда я спросил это. См. Эти ответы для правильного объяснения:)

Violapterin
источник

Ответы:

11

Когда вы копируете какой-то текст, он попадает в реестр. Текст внутри регистра имеет тип: characterwise, linewiseили blockwise.

Этот тип определяет, каким образом будет помещен текст.

В вашем примере вы скопировали текст из режима визуального блока. Итак, текст имел тип blockwiseи был сохранен в безымянном регистре ".
Из-за этого типа, когда вы вставите его обратно в буфер, он будет вставлен как блок.


Если вы хотите вставить его в виде последовательности строк, а не блока, есть 3 способа.

  1. В режиме вставки вы можете вставить его, нажав C-r ".
    Он должен вставить содержимое безымянного регистра, как если бы его тип был аналогичным.

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

Например:

:42put a

... следует поместить содержимое регистра aниже 42строки.

Без имени регистра Vim будет предполагать, что вы хотите вставить безымянный регистр (или +регистр, если вы настроили его 'clipboard').
А без адреса Vim будет считать, что вы хотите вставить его ниже текущей строки.


  1. Из командной строки вы можете изменить тип безымянного регистра с помощью setreg()функции:

    :call setreg('"', '', 'al')

Здесь setreg()следует добавить пустую строку в безымянный регистр (благодаря aфлагу, переданному в качестве третьего аргумента) и изменить его тип на linewise (благодаря lфлагу).

Затем из обычного режима вы сможете вставить регистр pобычной командой, как если бы его тип был аналогичным.


Он не связан напрямую с вашей проблемой, но когда вы копируете какой-то текст, он также попадает в 0реестр. И если вы добавили значение unnamedplusк опции 'clipboard', оно также попадет в +регистр.

Вы можете проверить тип регистра, используя getregtype()функцию:

:echo getregtype('"')

Если он возвращает нижний регистр v, это означает, что тип является символьным.
Если он возвращает заглавную Vбукву, это означает, что тип является аналогичным.
Если это возвращает ^V{some number}, это означает, что тип является блочным, и ширина блока равна {some number}.

user9433424
источник
3

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

С его помощью вы можете просто использовать glp/ glPдля вставки после / перед текущей строкой (как новые строки), независимо от того, как вы дернули текст.

Инго Каркат
источник
Я завидую вам, что у вас есть время, чтобы написать такую ​​вещь QQ Но я доволен :put. (Также проголосовал за вас)
Violapterin
@Aminopterin: я часто отвечал, что у меня есть фрагмент кода для первого параграфа. Так что мне просто нужно немного настроить. Спасибо за оценку моего ответа, и upvote!
Инго Каркат
О, я сказал, что завидую, что у вас есть время, чтобы написать плагин в одиночку, вот так, как будто это сделано беззаботно ... только в последние полгода я начал писать какой-то проект на C ++ как хобби-проект, чтобы заставить себя изучать программирование, и я начал использовать vim ~~
Violapterin
2
@Aminopterin А, ну, плагин начался как небольшой фрагмент, скопированный с Vimtips, и медленно рос со временем. Поскольку это оказалось настолько полезным для меня, я постепенно значительно его улучшил. Многие маленькие шаги более мощные, чем большие одиночные усилия!
Инго Каркат