¿Por qué la inserción de desplazamiento solo funciona completamente en modo de inserción?

13

Solo intenté pegar algo de contenido (en Git Bash en el servidor CentOS) en un archivo usando vim.
Acabo de abrir el archivo e intenté usar shift+ inserty noté que la primera mitad (aproximadamente) se corta, pero si configuro vim para insertar el modo y presiono shift+ inserttodo se pega perfectamente.
Me preguntaba por qué es esto.

Gracias

treyBake
fuente
¡Hola, también tengo dos pulgares! : D
RonJohn

Respuestas:

24

Tanto Shift+ Insertcomo " pegar " en un terminal se comportan de manera similar: emulan las pulsaciones de teclas.

Esta es una distinción importante que a menudo es imposible para los terminales: ¿está escribiendo o pegando? Nota : algunos terminales admiten modos de " pegado entre paréntesis ", después del comentario de @ Josh incluso me encontré con un complemento vim pegado entre corchetes en xterm que puede interesarle.

Sus datos pegados se perderán hasta el primer carácter que ingrese al modo de inserción. También puede encontrar que su cursor se ha movido y que otras partes del archivo han cambiado (por ejemplo: caso modificado / eliminado / etc.) ...

En resumen, si está pegando el texto que desea insertar en el archivo, ingrese primero al modo de inserción.


Intente copiar el siguiente texto y péguelo en un terminal que ejecute Vim (no en modo de inserción):

hello how are you

El resultado es el mismo que escribir las mismas letras en su teclado:

resultado de pegar en Vim

En este caso, te deja en modo de inserción ...

Ahora intente salir del modo de inserción Esc- y pegue lo siguiente

/are
n

Esto realiza una búsqueda de "are":

resultado de pegar en Vim

Ahora pegue esto:

:0
dG

Oh no ... todo se fue!

todo se fue


También encontrará que si tiene la sangría habilitada, pegar un bloque de código en vim (en modo de inserción) sangrará demasiado: sangrará automáticamente y luego su código pegado incluirá sangría.

def my_print(message):
    print(message)
    print('done...')

pegar código

Para solucionar esto, use los comandos :set pastey:set nopaste

pegar código (modo pegar)

Attie
fuente
44
"Esta es una distinción importante que los terminales no pueden hacer: ¿está escribiendo o pegando?" - esto no es del todo cierto, algunos terminales y aplicaciones admiten "pegado entre paréntesis" donde se envía una secuencia especial antes y después del texto pegado.
Ash
@Josh: interesante, gracias ... tu comentario incluso me llevó a un complemento vim
Attie
¿Soy el único molestado set nopaste? Yo esperaría unset paste.
Eric Duminil
@ThisGuyHasTwoThumbs como alternativa, al menos al usar Vim, es posible que desee utilizar el "+registro para interactuar con el portapapeles del sistema, ya que tenderá a comportarse de manera más sensata. La desventaja es que algunos sistemas o compilaciones de Vim pueden usar "*en su lugar, o simplemente no tienen soporte para el portapapeles del sistema, pero en mi experiencia, "+ha sido bastante confiable.
8bittree