Desactivando sangría automática al pegar texto en vim

Estoy haciendo el esfuerzo de aprender Vim.

Cuando pego código en mi documento desde el portapapeles, obtengo espacios adicionales al comienzo de cada nueva línea:

line line line 

Sé que puedes desactivar la sangría automática pero no puedo hacer que funcione porque tengo otras configuraciones en conflicto o algo así (que se ven bastante obvias en mi .vimrc pero no parecen importar cuando las saco).

¿Cómo desactivo la sangría automática cuando pego el código pero todavía tengo la sangría automática de vim cuando estoy escribiendo el código? Aquí está mi archivo .vimrc :

 set expandtab set tabstop=2 set shiftwidth=2 set autoindent set smartindent set bg=dark set nowrap 

Para desactivar la autoinscripción al pegar código, hay un modo especial de “pegar”.

Tipo

 :set paste 

Luego pega tu código. Tenga en cuenta que el texto en la información sobre herramientas ahora dice -- INSERT (paste) -- .

Después de pegar el código, apague el modo de pegado, para que la sangría automática cuando escriba funcione correctamente nuevamente.

 :set nopaste 

Sin embargo, siempre me pareció engorroso. ¡Es por eso que mapeo modo que pueda cambiar entre los modos pegar y no pegar mientras edita el texto! Yo agrego esto a .vimrc

 set pastetoggle= 

Para evitar efectos no deseados al pegar, hay una opción que debe establecerse:

 set paste 

Un comando útil para tener en .vimrc se set pastetoggle= o algún otro botón, para alternar fácilmente entre pegar y no pasar.

Suelo usar :r! cat :r! cat y luego pegar ( shift + insert ) el contenido y CTRL+D

No es necesario habilitar y deshabilitar, uso directo.

Si está trabajando localmente, puede pegar desde el portapapeles del sistema con la secuencia de teclas:

"+p

Este es un comando vim adecuado, por lo que no debe preocuparse por ingresar a un modo de inserción o desactivar la autoinscripción primero.

Por supuesto, si está trabajando de forma remota (consola a través de SSH, por ejemplo), esto no funcionará y debe ir a :set noai , insertar modo, pegar en la consola, dejar insertmode,: :set ai ruta como se describe en otra parte.

Los usuarios de Mac pueden evitar el formateo automático leyendo directamente de la mesa de trabajo con:

 :r !pbpaste 

Aquí hay una publicación de alguien que descubrió cómo reasignar el evento pegar para activar automáticamente el modo pegar y luego retroceder. Funciona para mí en tmux / iTerm en MacOSX.

Agregue esto a su ~/.vimrc y solo tendrá que presionar F2 antes y después de pegar:

 set pastetoggle= 

Mientras configura el modo pegar con paste/nopaste/pastetoggle está perfectamente bien, aún tiene que habilitar manualmente el modo pegar antes de pegar y deshabilitar el modo pegar después de pegar. Siendo la persona perezosa que soy, a continuación, es la mejor solución que he encontrado hasta ahora, que alterna automáticamente el modo pegar cuando pegas.

Aquí hay un pequeño truco que usa el modo de pegado entre corchetes del terminal para establecer / desarmar automáticamente el modo pegar de Vim cuando pegas. Pon el siguiente en tu .vimrc:

 let &t_SI .= "\[?2004h" let &t_EI .= "\[?2004l" inoremap   [200~ XTermPasteBegin() function! XTermPasteBegin() set pastetoggle=[201~ set paste return "" endfunction 

Ahora puede pegar sin activar o desactivar explícitamente el modo pegar: se maneja automáticamente por usted.

Fuente: Coderwall

Acabo de poner set clipboard=unnamed en mi .vimrc. Eso hace que el mapa del buffer de pegado predeterminado sea el portapapeles de X.

Entonces, si marcó un poco de texto en un terminal, simplemente puedo presionar p para pegarlo en vim. Del mismo modo, puedo tirar cosas en vim (por ejemplo, YY para tirar de la línea actual en el búfer) y hacer clic en el medio en cualquier ventana para pegarlo.

No sé. Lo encuentro muy conveniente.

Al trabajar dentro de un terminal, el complemento vim-bracketed-paste vim manejará automáticamente las pastas sin necesidad de presionar ninguna tecla antes o después del pegado.

Funciona al detectar el modo de pegado entre corchetes, que es una secuencia de escape enviada por terminales “modernos” compatibles con X-term como iTerm2, gnome-terminal y otros terminales que utilizan libvte. Como una ventaja adicional, también funciona para las sesiones de tmux. Lo estoy usando con éxito con iTerm2 en una Mac que se conecta a un servidor Linux y usa tmux.

Pegue esto en su ~ / .vimrc y sea feliz:

 " enables :Paste to just do what you want command Paste execute 'set noai | insert | set ai' 

Editar: en la reflexión,: :r !cat es un enfoque mucho mejor ya que es corto, semántico y no requiere vimrc personalizado. ¡Usa eso en cambio!

Esto funciona para mí (caso de + registro, lo que uso como buffer de intercambio entre aps):

 imap   :set noai+:set ai 

Aunque :pastetoggle o :paste y :nopaste debería funcionar bien (si está implementado, no siempre son como podemos ver en la discusión) Recomiendo pegar usando el enfoque directo "+p o "*p y leyendo con "+r o "*r :

Vim tiene acceso a diez tipos de registros ( :help registers ) y el interlocutor está interesado en quotestar y quoteplus de la sección

  1. Selección y soltar registros "* , "+ y “~

Use estos registros para almacenar y recuperar el texto seleccionado para la GUI. Ver quotestar y quoteplus . Cuando el portapapeles no está disponible o no funciona, se usa el registro sin nombre en su lugar. Para sistemas Unix, el portapapeles solo está disponible cuando la función + xterm_clipboard está presente. {no en Vi}

Tenga en cuenta que solo hay una distinción entre “* y” + para sistemas X11.

:help x11-selection aclara aún más la diferencia de * y + :

  quoteplus quote+ 

Hay tres selecciones X documentadas: PRIMARIA (que se espera represente la selección visual actual, como en el modo Visual de Vim), SECUNDARIA (que está mal definida) y CLIPBOARD (que se espera que se use para operaciones de corte, copia y pegado )

De estos tres, Vim usa PRIMARY al leer y escribir el registro “* (por lo tanto, cuando las selecciones X11 están disponibles, Vim establece un valor predeterminado para ‘portapapeles’ de” autoselección “) y CLIPBOARD cuando lee y escribe el” + registro “. Vim no accede a la selección SECUNDARIA.

Ejemplos: (asumiendo los valores de opción por defecto)

  • Seleccione una URL en modo Visual en Vim. Vaya a su navegador y haga clic en el botón central del mouse en el campo de texto de la URL. El texto seleccionado será insertado (¡con suerte!). Nota: en Firefox puedes establecer la preferencia middlemouse.contentLoadURL en true en about: config, luego la URL seleccionada se usará al presionar el botón central del mouse en la mayoría de los lugares en la ventana.

  • Seleccione un texto en su navegador arrastrando con el mouse. Vaya a Vim y presione el botón central del mouse: se insertará el texto seleccionado.

  • Seleccione un texto en Vim y haga “+ y. Vaya a su navegador, seleccione un texto en un campo de texto arrastrándolo con el mouse. Ahora use el botón derecho del mouse y seleccione” Pegar “en el menú emergente. El texto seleccionado se sobrescribe con el texto de Vim. Tenga en cuenta que el texto en el registro “+” permanece disponible al hacer una selección Visual, lo que hace que otro texto esté disponible en el registro “*. Eso permite sobrescribir el texto seleccionado.

Si está en un Mac, Macvim parece manejarlo bien sin tener que alternar entre pegar.

brew install macvim –override-system-vim

Por favor, lea este artículo: Alternar sangría automática para pegar código

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

 nnoremap  :set invpaste paste? set pastetoggle= set showmode 

La forma más rápida que conozco para pasar rápidamente al modo de inserción de pegar para una captura de una sola pasada es que tpope está intacto , lo que incluye yo y yO , presumiblemente mnemónicos para “abrir”. Solo están documentados en su vimdoc, como:

No se ha proporcionado un alternar para ‘pegar’ porque el caso de uso típico de envoltura de una inserción solitaria es tan inútil: se alterna dos veces, pero solo se pega una vez (YOPO). En su lugar, presione yo o yO para invocar o u O con ‘pegar’ ya configurado. Al salir del modo de inserción, se establece ‘nopaste’ automáticamente.

Otra forma de pegar es a través de y soltar el contenido del registro (aquí el registro global). Ver:: :h i_ctrl-r y h i_CTRL-R_CTRL-O .

De la documentación de ayuda vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

Entonces, para pegar contenidos en vim sin sangría automática, use * en la mayoría de los sistemas Unix.

Nota: esto solo funciona si vim se comstack con el clipboard .

Tristemente encontré el complemento vim mencionado que no funcionaba con iTerm2 3.0.15 (para ser justos, no sé si esto se rompió en las versiones anteriores), pero en su lugar encontré este truco.

Map command-p para hacer el pegado y usar las teclas iTerm2 vim. Obviamente, esto solo funciona para iTerm2.

Cómo funciona. Uso “jk” para ingresar al modo de escape, así que también necesitarás:

: inoremap jk

en tu .vimrc.

Luego solo invoca P para ingresar al modo pegar, “+ p para pegar desde el portapapeles y luego P para deshabilitar el modo pegar.

enter image description here

De vim: ]p

Desde afuera: "*]p o "+]p