¿Por qué Vim sangra incorrectamente el código pegado?

100

En Vim, si pego este script:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

Obtengo estos resultados extraños:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

Han aparecido signos hash (#) y pestañas. ¿Por qué?

elbarna
fuente
31
Esta podría ser una mejor pregunta para vi.stackexchange.com
Eric Renouf
@EricRenouf ¿por qué? (pregunta honesta)
Qix
3
@qix pensé que esta es una pregunta sobre cómo funciona vim, que es una herramienta común para usar en * nix, pero * nix no es un requisito para usar vim
Eric Renouf
1
@JaredBurrows, espero que lo haga
Eric Renouf
1
¿Cómo estás activando la pasta? Con el raton?
Ben Voigt

Respuestas:

122

Hay dos razones:

Para pegar vimmientras la sangría automática está habilitada, debe cambiar al modo pegar escribiendo:

:set paste

Luego puede cambiar al modo de inserción y pegar su código. Después de pegar, escriba:

:set nopaste

para desactivar el modo pegar. Dado que esta es una acción común y frecuente, vimofrece el modo de alternar pegar:

set pastetoggle=<F2>

Puede cambiar F2a la tecla que desee, y ahora puede activar y desactivar el pegado fácilmente.


Para desactivar la inserción automática de comentarios, puede agregar estas líneas a su vimrc :

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimtambién proporciona un registro de pegado para que pegue texto desde el portapapeles del sistema. Puede usar "*po "+pdependiendo de su sistema. En un sistema sin X11, como OSX o Windows, debe usar el *registro. En un sistema X11, como Linux, puede usar ambos.

Otras lecturas

Cuonglm
fuente
2
He estado usando Vim por siempre y nunca supe de esto. Muchas gracias.
Caja
La mayoría de los emuladores gráficos de terminal modernos admiten una función llamada "modo de pegado entre paréntesis". Vim puede pedirle al terminal que habilite este modo, que, a su vez, rodeará el texto pegado con ciertas secuencias de escape. Vim puede reconocer esto y desactivar la envoltura / sangría durante la duración de la pasta. Larga historia stort: ​​pegar "funcionará como se esperaba". No soy un usuario de vim, pero una búsqueda web rápida seguramente te dirá cómo configurar este modo.
egmont
2
@MichaelDurrant set pastenunca debería estar en tu vimrc. Deshabilita o restablece muchas cosas, incluidas las asignaciones de modo de inserción, las asignaciones de línea de comandos, las abreviaturas, el ancho de texto, el ajuste de margen, el autoindent, smartindent, softtabstop, formatoptions, indentexpr y un par de otros. :h pastetiene toda la lista La mayoría de las personas usan algunas o todas estas cosas y se preguntan por qué se ignoran las configuraciones.
FDinoff
44
Yo suelo usar :r!catpara pegar textualmente.
Simon Richter
1
Puede valer la pena discutir la interacción con ella set mouse, que puede ingresar y salir automáticamente del modo pegar al pegar con el clic del mouse.
Ben Voigt
36

Usa la pasta vim. Lo que quieres es pegar lo que está en el búfer del portapapeles "+p

Esto selecciona el +y lo pega en su lugar.

Si está utilizando Linux, *es el búfer X / clic medio (el último texto seleccionado).

Entonces vim sabe que es una pasta.

De lo contrario, vim cree que ha escrito las teclas que se están pegando y realiza su propia sangría automática (además de la sangría copiada) hasta el final del pegado.

Como nota para que esto funcione sobre SSH, debe configurar la opción para compartir su portapapeles -Y

Ver man sshpara más detalles.

exussum
fuente
44
Esta es la respuesta correcta en mi humilde opinión
Kristoffer Sall-Storgaard el
Parece que esto solo funciona para el gráfico vim ( gvim); vim ejecutándose en un emulador de terminal pega el último texto eliminado con "* p, no la selección actual.
wurtel
No uso gvim, solo el terminal vim. ¿Cuál es la configuración de su mouse? la configuración de mi mouse es c. No estoy seguro de cómo funciona cuando se permite la selección del mouse. set mouse?
exussum
2
también verifique vim --versionsi se compiló con soporte para portapapeles +xterm_clipboarddebe estar en la salida
exussum
@wurtel: Quizás hayas configurado el portapapeles con una unnamedcuerda.
Cuonglm
8

Las pestañas se insertaron porque tiene autoindent activado y puede deshabilitar ese comportamiento desactivando autoindent ( :set noai) antes de pegar en la terminal.

Las líneas comentadas se producen mediante comentarios automáticos y se pueden deshabilitar al desactivarlas.

Alternativa a las que debería obtener el comportamiento deseado utilizando los botones :set paste, pegar su código formateado y :set nopasterestaurar el comportamiento normal.

casey
fuente