¿Cómo puedo mantener el código formateado como fuente original cuando los pego en vim?

37

Cuando copio algún código de páginas web y lo pego en VIM, encuentro que se convierte en un estilo desordenado como una escalera de la siguiente manera

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

Dado que se estropeaba tan regularmente, creo que tal vez hay algo mal con mi, .vimrcque es el siguiente:

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

Por lo general, escribo Python en VIM y agradecería su ayuda.

SpawnST
fuente
1
Gracias. Esto me molestó durante años, y nunca pude preguntarle a nadie al respecto. +1.
DevSolar

Respuestas:

50

Haz esto antes:

:set paste

A continuación, después de:

:set nopaste
Ignacio Vazquez-Abrams
fuente
No es necesario para gvim; los activa y desactiva automáticamente al pegar.
Benjamin Bannier
alguna idea de por qué es eso?
Nathan Fellman el
1
Solo adivinando: Plain vim es solo de línea de comandos y no "sabe" sobre el portapapeles. Toma el "pegar" como una secuencia de caracteres de entrada y aplica la sangría automática. El gvim compatible con la GUI podría "saber" que los datos entrantes provienen del portapapeles y, por lo tanto, deshabilitará el autoindenting para tal fin.
DevSolar
Eso es correcto. El terminal trata la operación "pegar" como entrada de caracteres sin formato.
Ignacio Vazquez-Abrams
Esto no es solo un problema de vim: puede obtener un efecto similar al pegar en el antiguo editor de DOS en un símbolo del sistema. Este programa parece faltar en Windows 7 de 64 bits, presumiblemente porque realmente es una aplicación antigua de DOS de 16 bits y no valía la pena la molestia de actualizarlo. Sin embargo, está en Windows XP, y pegar en eso (1) funciona muy lentamente, representando la entrada carácter por carácter, y (2) hace un verdadero desastre.
Steve314
16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

Alternar la sangría automática para pegar código

Fondo

Si usa los comandos de Vim para pegar texto, no ocurre nada inesperado. El problema solo surge al pegar desde otra aplicación, y solo cuando no está utilizando una versión GUI de Vim. En una versión de consola o terminal de Vim, no existe un procedimiento estándar para pegar texto desde otra aplicación. En cambio, el terminal puede emular el pegado insertando texto en el búfer del teclado, por lo que Vim cree que el texto ha sido escrito por el usuario. Después de que finalice cada línea, Vim puede mover el cursor para que la siguiente línea comience con la misma sangría que la anterior. Sin embargo, eso cambiará la sangría ya en el texto pegado.

Pegar alternar

Ponga lo siguiente en su vimrc (cambie a la clave que desee):

set pastetoggle=<F2>

Para pegar desde otra aplicación:

  • Comience el modo de inserción.
  • Presione F2 (activa la opción 'pegar').
  • Use su terminal para pegar texto desde el portapapeles.
  • Presione F2 (desactiva la opción 'pegar').

Luego se conservará la sangría existente del texto pegado.

No es necesario que inicie el modo de inserción primero, pero si está en modo normal y tiene una asignación para F2, esa asignación se aplicará y la función 'pastetoggle' no funcionará.

A algunas personas les gusta la retroalimentación visual que se muestra en la línea de estado con la siguiente alternativa para su vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

La primera línea establece una asignación para que presionar F2 en modo normal invierta la opción 'pegar' y luego muestre el valor de esa opción. La segunda línea le permite presionar F2 cuando está en modo de inserción, para activar y desactivar 'pegar'. La tercera línea permite mostrar si 'pegar' está activado en modo de inserción.

aXqd
fuente
1
+1 para la solución de teclas de acceso rápido. Para los no demasiado firmes en VIM (como yo) que ya han asignado las teclas F a otra cosa (como yo), <C-F2> sería Ctrl-F2 ...
DevSolar
excelente - ahora estoy usando esto
hoju
¿por qué no simplemente asignar las teclas de pegado para hacer esto automáticamente, como <S-Insert> o <Ctrl + V>, junto con sus funciones originales? O bien, escriba una función que deshabilite el pegado cuando se escriben más de unos pocos caracteres de entrada en el búfer en el tiempo de un segundo, es solo una idea, por supuesto, para mí tengo casi TODAS mis teclas asignadas a otras cosas, así que es un dolor , Incluso tengo un teclado con 12 teclas F y + 15 teclas F más (teclas G), y con eso, tres niveles, que todavía no son suficientes :) pero eso soy solo yo. El único problema es, el menú del botón derecho, que no se envían esc esc para indicar una operación de inicio de pegado ...
osirisgothra
2

Es el autoindent que está jugando contigo.

set autoindent
set smartindent

Intente deshabilitarlos cuando corte y pegue su código, y luego habilítelos nuevamente cuando haya terminado.

Johan
fuente
-2

La menor cantidad de esfuerzo para lograr esto es (se puede poner en .vimrc):

:set paste

Luego pegue su código.

h2obro
fuente
3
La 'paste'opción nunca fue creada de forma permanente. Inhabilita muchas cosas, incluidas las asignaciones y abreviaturas. Además, una respuesta previa ya cubre la 'paste'opción.
Heptita el
2
¡Bienvenido a Super User! Esto duplica una respuesta existente y no agrega contenido nuevo. No publique una respuesta a menos que realmente tenga algo nuevo que aportar.
Toby Speight