Como colar bloco visual começando com outra linha

10

Levei muito tempo para perceber que colocar (colar) algo com pou com o Pqual o bloco visual seleciona ctrl+ve puxa (copiado) com ypreserva a maneira anterior, de modo que, quando o texto copiado estava no meio das linhas, será copiado no meio de outro texto sempre que possível. Pelo contrário, a linha de seleção com Vnão cola a linha copiada entre outros textos, mas inicia em outra linha.

Por exemplo, suponha que eu tenha agora:

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

Quando eu quero corte Avocadoe Beane Cherry, selecionando (seleção representado como _)

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

pressionando ye mova o cursor para a seguinte linha (cursor representado como _),

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

e pressione P. Isso resulta:

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

Mas o que eu desejava era:

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

Isso me confundia todas as vezes, até que percebi que, por serem copiadas no meio da linha, eram coladas no meio da linha, imitando a maneira como eram.

Parece que a melhor maneira de colar algo que começa em outra linha, é mover o cursor para o início 0e descer três linhas para o novo local; e entrando no modo de inserção ipressionando <return>3 vezes e movendo o cursor para trás 6 linhas, e para a direita, de volta ao local original; e copie e, novamente, vá para o novo local e cole, como fiz acima.

Posso salvar alguns traços? Ou o que você costuma fazer?

(Edit: O que foi dito acima foi como eu o entendi no momento em que perguntei isso. Veja essas respostas para obter a explicação correta:)

Violapterina
fonte

Respostas:

11

Quando você copia algum texto, ele entra em um registro. O texto dentro de um registo tem um tipo: characterwise, linewiseou blockwise.

Este tipo determina de que maneira o texto será colocado.

No seu exemplo, você copiou algum texto do modo de bloqueio visual. Portanto, o texto tinha o tipo blockwisee foi armazenado no registro sem nome ".
Devido a esse tipo, quando você o colar novamente dentro do buffer, ele será colado como um bloco.


Se você deseja colá-lo como uma sequência de linhas, em vez de um bloco, existem três maneiras.

  1. No modo de inserção, você pode inseri-lo pressionando C-r ".
    Ele deve inserir o conteúdo do registro sem nome como se seu tipo fosse na linha.

  1. Na linha de comando, você pode usar o :putcomando
    :putdeve colar o texto dentro de um registro como se seu tipo fosse na linha, independentemente do tipo original. Observe que você pode passar o nome de um registro como argumento, bem como um endereço de linha para especificar abaixo da linha em que deseja que o registro seja colado.

Por exemplo:

:42put a

... deve colocar o conteúdo do registro aabaixo da 42linha th.

Sem um nome de registro, o Vim assumirá que você deseja colar o registro sem nome (ou o +registro, se você ajustou 'clipboard').
E sem um endereço, o Vim assumirá que você deseja colá-lo abaixo da linha atual.


  1. Na linha de comando, você pode alterar o tipo de registro sem nome com a setreg()função:

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

Aqui, setreg()deve anexar uma string vazia ao registrador sem nome (graças ao asinalizador passado como terceiro argumento) e alterar seu tipo para linha (graças ao lsinalizador).

Em seguida, no modo normal, você poderá colar o registro, com o pcomando normal, como se seu tipo fosse na linha.


Ele não está diretamente vinculado ao seu problema, mas quando você copia algum texto, ele também entra no 0registro. E se você anexou o valor unnamedplusà opção 'clipboard', ele também entra no +registro.

Você pode verificar qual é o tipo de um registro, usando a getregtype()função:

:echo getregtype('"')

Se retornar uma letra minúscula v, significa que o tipo é caractere.
Se retornar uma letra maiúscula V, significa que o tipo é na linha.
Se retornar ^V{some number}, significa que o tipo é no sentido de bloco e a largura do bloco é {some number}.

user9433424
fonte
3

Eu precisava "converter" o conteúdo do registro em um determinado modo (caractere / linha / bloco) tantas vezes que escrevi o plug - in UnconditionalPaste para ele. Ele fornece gcp, glpetc. alternativas aos comandos de colar internos que forçam um determinado modo (e agora várias outras variações sobre esse tema, como colar com vírgulas ou caracteres consultados).

Com ele, você pode simplesmente usar glp/ glPpara colar após / antes da linha atual (como novas linhas), independentemente de como você puxou o texto.

Ingo Karkat
fonte
Eu te invejo que você tenha tempo para escrever uma coisa dessas. QQ Mas estou satisfeito :put. (Também upvoted você)
Violapterin
@Aminopterin: Eu respondi com tanta frequência que na verdade tenho um snippet snipMate para o primeiro parágrafo. Então, eu só preciso personalizar um pouco. Obrigado por apreciar minha resposta e pelo voto positivo!
Ingo Karkat
Ah, eu disse que invejo que você tenha tempo para escrever um plug-in sozinho, como se fosse feito sem muito entusiasmo ... apenas no último meio ano eu comecei a escrever algum projeto c ++ como projeto hobby para me forçar a aprender programação, e eu comecei a usar o vim ~~
Violapterin
2
@Aminopterin Ah, bem, o plug-in começou como um pequeno trecho copiado do Vimtips e cresceu lentamente ao longo do tempo. Como me provou ser útil, eu gradualmente a aprimorei bastante. Muitos pequenos passos são mais poderosos que um grande esforço!
Ingo Karkat