Cómo pegar el bloque visual comenzando con otra línea


10

Me llevó mucho tiempo darme cuenta de que poner (pegar) algo po con lo Pque el bloque visual selecciona ctrl+vy se tira (copia) y, conserva la forma anterior, de modo que, cuando el texto copiado estaba en el medio de las líneas, luego se copiará en medio de otro texto siempre que sea posible. Por el contrario, select-line con Vno pega la línea copiada entre otro texto, sino que comienza en otra línea.

Por ejemplo, supongamos que tengo por ahora:

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

Cuando quiero cortar Avocadoy Beany Cherry, seleccionando (selección representada como _)

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

y presionando y, y mover el cursor a la siguiente línea (cursor representado como _),

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

y presione P. Resulta:

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

Pero lo que deseaba era:

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

Esto me confundió cada vez, hasta que me di cuenta de que debido a que se copiaron en el medio de la línea, se pegaron en el medio de la línea, imitando la forma en que estaban.

Parece que la mejor manera de pegar algo comenzando en otra línea, es moviendo el cursor al principio con 0, y hacia abajo 3 líneas, al nuevo lugar; e ingrese al modo de inserción con i, y presione <return>3 veces, y mueva el cursor hacia atrás 6 líneas, y hacia la derecha, de vuelta al lugar original; y copiando, y nuevamente moverme al nuevo lugar, y pegar, como hice arriba.

¿Puedo guardar algunos trazos? ¿O qué sueles hacer?

(Editar: lo que se dijo anteriormente fue cómo lo entendí en el momento en que pregunté esto. Vea esas respuestas para una explicación correcta:)

Respuestas:


11

Cuando copia un texto, entra en un registro. El texto dentro de un registro tiene un tipo: characterwise, linewiseo blockwise.

Este tipo determina de qué manera se colocará el texto.

En su ejemplo, copió texto del modo de bloqueo visual. Entonces, el texto tenía el tipo blockwisey se almacenaba en el registro sin nombre ".
Debido a este tipo, cuando lo pegue nuevamente dentro de su búfer, se pegará como un bloque.


Si desea pegarlo como una secuencia de líneas, en lugar de un bloque, hay 3 formas.

  1. Desde el modo de inserción, puede insertarlo presionando C-r ".
    Debe insertar el contenido del registro sin nombre como si su tipo fuera en línea.

  1. Desde la línea de comando, puede usar el :putcomando.
    :putdebe pegar el texto dentro de un registro como si su tipo fuera lineal, sin importar su tipo original. Tenga en cuenta que puede pasar el nombre de un registro como argumento, así como una dirección de línea para especificar debajo de qué línea desea que se pegue el registro.

Por ejemplo:

:42put a

... debe poner el contenido del registro a, debajo de la 42línea th.

Sin un nombre de registro, Vim asumirá que desea pegar el registro sin nombre (o el +registro si lo ajustó 'clipboard').
Y sin una dirección, Vim asumirá que desea pegarla debajo de la línea actual.


  1. Desde la línea de comando, puede cambiar el tipo de registro sin nombre con la setreg()función:

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

Aquí, setreg()debe agregar una cadena vacía al registro sin nombre (gracias a la abandera pasada como un tercer argumento) y cambiar su tipo a linealmente (gracias a la lbandera).

Luego, desde el modo normal, debería poder pegar el registro, con el pcomando normal, como si su tipo fuera lineal.


No está directamente relacionado con su problema, pero cuando copia algo de texto, también va al 0registro. Y si antepone el valor unnamedplusa la opción 'clipboard', también va al +registro.

Puede verificar cuál es el tipo de registro utilizando la getregtype()función:

:echo getregtype('"')

Si devuelve una letra minúscula v, significa que el tipo tiene caracteres.
Si devuelve una mayúscula V, significa que el tipo es lineal.
Si regresa ^V{some number}, significa que el tipo es en bloque y el ancho del bloque es {some number}.


3

Necesitaba "transmitir" el contenido del registro a un cierto modo (carácter / línea / bloque) tan a menudo, que escribí el complemento UnconditionalPaste para él. Proporciona gcp, glpetc., alternativas a los comandos de pegado integrados que fuerzan un cierto modo (y ahora varias variaciones más sobre este tema, como pegar con comas o caracteres consultados).

Con él, puede usar glp/ glPpara pegar después / antes de la línea actual (como líneas nuevas), independientemente de cómo haya tirado el texto.


Te envidio que tengas tiempo para escribir QQ Pero estoy satisfecho :put. (También te votó)
Violapterin

@Aminopterin: He respondido que tan a menudo, en realidad tengo un fragmento de snipMate para el primer párrafo. Entonces solo necesito personalizar un poco. ¡Gracias por apreciar mi respuesta y el voto positivo!
Ingo Karkat

Oh, dije que envidio que tengas tiempo para escribir un plugin sin ayuda, así, como si lo hicieras alegremente ... solo el último medio año comencé a escribir algún proyecto de c ++ como proyecto de hobby para obligarme a aprender programación, y empecé a usar vim ~~
Violapterin

2
@Aminopterin Ah, bueno, el complemento comenzó como un pequeño fragmento copiado de Vimtips y creció lentamente con el tiempo. Como me resultó muy útil, lo mejoré gradualmente. ¡Muchos pequeños pasos son más poderosos que un gran esfuerzo individual!
Ingo Karkat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.