shiftwidth multiple indent vim configuration editor indentation auto-indent

multiple - Desactivar la sangría automática al pegar texto en vim



vim shiftwidth (19)

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 conflictivas o algo así (lo cual parece bastante obvio en mi .vimrc pero no parece importar cuando las elimino).

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

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


Acabo de poner set clipboard=unnamed en mi .vimrc. Eso hace que el mapa de búfer de pegar predeterminado al portapapeles X.

Entonces, si marcho 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 la línea actual en el búfer) y hacer clic con el botón central en cualquier ventana para pegarla.

No sé. Me parece super conveniente.


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

set pastetoggle=<F2>


Aunque :pastetoggle o :paste y :nopaste deberían estar funcionando bien (si se implementan, no siempre son lo que podemos ver en la discusión) Recomiendo pegar con el método directo "+p o "*p y leer con "+r o "*r :

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

  1. Los registros de selección y caída "* , "+ y "~

Utilice 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, en su lugar se utiliza el registro sin nombre. Para los sistemas Unix, el portapapeles solo está disponible cuando está presente la función + xterm_clipboard. {no en Vi}

Tenga en cuenta que solo hay una distinción entre "* y" + para los 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 que 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 cortar, copiar y pegar operaciones) ).

De estos tres, Vim usa PRIMARIO al leer y escribir el "* registro (por lo tanto, cuando las selecciones de X11 están disponibles, Vim establece un valor predeterminado para ''portapapeles'' de" selección automática "), y CLIPBOARD al leer y escribir el" + registro ". Vim no accede a la selección SECUNDARIA.

Ejemplos: (asumiendo los valores de opción predeterminados)

  • 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 (¡esperemos!). Nota: en Firefox puede establecer la preferencia middlemouse.contentLoadURL en about: config, luego se usará la URL seleccionada al presionar el botón central del mouse en la mayoría de los lugares de la ventana.

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

  • Seleccione un texto en Vim y haga "+ y. Vaya a su navegador, seleccione un texto en un campo de texto arrastrando 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 cuando se realiza una selección visual, lo que hace que otro texto esté disponible en el" * registro. Eso permite sobrescribir el texto seleccionado.

Cuando se trabaja dentro de un terminal, el complemento vim-bracketed-paste vim manejará automáticamente las pastas sin necesidad de pulsar las teclas antes o después de pegar.

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 un bono adicional funciona también para sesiones tmux. Lo estoy usando con éxito con iTerm2 en una Mac que se conecta a un servidor Linux y uso tmux.


Desde vim: ]p

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


Esto funciona para mí (caso para registro +, lo que uso como el intercambio de búfer entre aplicaciones):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>


La forma más rápida que conozco de ir rápidamente al modo de pegar-insertar para pegar de una sola vez es imparable de tpope, que presenta yo y yO , presumiblemente mnemotécnicos para "abrir". Sólo están documentados en su vimdoc, como:

No se ha proporcionado una palanca para "pegar" porque el caso de uso típico de la 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 oo O con ''pegar'' ya establecido. Al salir del modo de inserción se establece ''nopaste'' automáticamente.


Lamentablemente, encontré que el complemento de vim mencionado no funciona con iTerm2 3.0.15 (para ser justos, no sé si esto no funcionó en versiones anteriores), pero en su lugar encontré este truco.

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

Cómo funciona. Uso "jk" para ingresar al modo de escape, por lo que también necesitarás:

: inoremap jk

en tu .vimrc.

Luego simplemente invoca P para ingresar al modo de pegado, "+ p para pegar desde el portapapeles y luego P para deshabilitar el modo de pegado. Hth.


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

:r !pbpaste


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

De la documentación de ayuda de vim:
Insert the contents of a register literally and don''t auto-indent. Does the same as pasting with the mouse<MiddleMouse>. 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 <CR><CO>* en la mayoría de los sistemas UNIX.

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


Para evitar efectos no deseados mientras se pega, hay una opción que debe configurarse:

set paste

Un comando útil para tener en su .vimrc se set pastetoggle=<F10> o algún otro botón, para alternar fácilmente entre pegar y rechazar.


Pega esto en tu ~ / .vimrc y sé feliz:

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

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


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

A algunas personas les gusta la informació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


Si bien la configuración del modo de paste/nopaste/pastetoggle con paste/nopaste/pastetoggle está perfectamente bien, todavía tiene que habilitar manualmente el modo de pegar antes de pegar y deshabilitar el modo de pegar después de pegar. Siendo la persona perezosa que soy, a continuación se encuentra la mejor solución que he encontrado hasta ahora, que alterna automáticamente el modo de pegado cuando pegas.

Aquí hay un pequeño truco que usa el modo de pegado entre corchetes del terminal para configurar / deshabilitar automáticamente el modo de pegado de Vim cuando pegas. Ponga lo siguiente en su .vimrc:

let &t_SI .= "/<Esc>[?2004h" let &t_EI .= "/<Esc>[?2004l" inoremap <special> <expr> <Esc>[200~ XTermPasteBegin() function! XTermPasteBegin() set pastetoggle=<Esc>[201~ set paste return "" endfunction

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

Fuente: Coderwall


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 hay necesidad de preocuparse por ingresar un modo de inserción o apagar el autoindent primero.

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


Si estás en un mac, macvim parece manejarlo bien sin tener que alternar pegar.

brew install macvim - override-system-vim


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

No es necesario habilitar y deshabilitar, uso directo.


Aquí hay una publicación de alguien que descubrió cómo volver a asignar el evento de pegado para activar y desactivar automáticamente el modo de pegado. Funciona para mí en tmux / iTerm en MacOSX.


Actualización: Mejor respuesta aquí: https://.com/a/38258720/62202

Para desactivar el autoindent al pegar el código, hay un modo especial de "pegar".

Tipo

:set paste

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

Una vez que haya pegado el código, desactive el modo de pegado, de modo que la auto-sangría cuando escriba vuelva a funcionar correctamente.

:set nopaste

Sin embargo, siempre me pareció engorroso. ¡Es por eso que mapeo <F3> tal manera que puede cambiar entre los modos de pegar y no-gusto mientras edita el texto! Agrego esto a .vimrc

set pastetoggle=<F3>