shiftwidth - vim split editor




Desactivar la sangría automática al pegar texto en vim (13)

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>

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


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.


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.


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á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.


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>




auto-indent