Utilice siempre: establecer pegar, ¿es una buena idea?

19

En un terminal vim, pegar datos del portapapeles a menudo desordena la sangría del código. Solo sabía que si uso :set pastela sangría no está rota. Sin embargo, después de pegar datos, ¿debería :set nopastevolver a hacerlo ? ¿Qué pasa si no, qué problema viene?

Benjamín
fuente
¿Qué hay de probar por ti mismo? ¿O leyendo la documentación ?
romainl
1
Consulte también "Modo de pegado entre corchetes" en mi respuesta a "Pegar código en la ventana de terminal en vim" stackoverflow.com/a/7053522/754997 . Si su emulador de terminal lo admite, puede hacer arreglos para que le diga a Vim que cambie automáticamente al modo pegar / desde cada vez que pegue texto en el terminal.
Chris Page
1
@romainl Me parece bastante plausible que tanto 1) intente y espere para ver si hay consecuencias negativas de usar siempre pegar set (+ - nopaste), y 2) rtfm-ing (como un usuario de nivel inferior o intermedio como el OP) , son menos útiles que preguntar a quienes tienen experiencia con las opciones. Preguntar aquí parece un enfoque más inteligente, y documentar esto ayudará a otros.
belacqua

Respuestas:

5

Como otros han escrito, no desea dejar el conjunto 'pegar'. Solo quería señalar que con un buen emulador de terminal y un compilado y configurado correctamente vim, no debería necesitar cambiar 'pegar'. Necesita un buen emulador de terminal, como xterm o GNOME Terminal, vim con la función X11 incluida y la opción 'mouse' establecida en 'a'. Luego vim"sabrá" cuándo está pegando con el mouse y establecerá y deshabilitará efectivamente la opción 'pegar' para usted.

Una forma de obtener un vimcon la función X11 es ejecutar gvimcon la -vopción o crear un alias,

alias vim='gvim -v'

Luego pon

set mouse=a

en tu ~ / .vimrc.

garyjohn
fuente
Cuando configuro mouse = a, no puedo copiar texto. "Copiar" aparece atenuado en el menú contextual y en el menú de la aplicación.
Lee Daniel Crocker
@LeeDanielCrocker: Copyestará atenuado o no estará visible a menos que se haya seleccionado algún texto. ¿Cómo selecciona el texto que se copiará?
garyjohn
Solo con el mouse. FYI, "y" funciona bien ... tira del texto y lo copia al teclado del sistema. Son solo los menús los que no funcionan. Si el mouse está configurado en "r", los menús funcionan, pero el mouse incluye los números de línea. Entonces, en general, puedo vivir con mouse = a, solo tengo que recordar tirar en lugar de copiar.
Lee Daniel Crocker
7

Esta publicación tiene mi respuesta favorita, https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode

Básicamente, si comienza en modo Insertar y usa Ctrl + Shift + V o hace clic con el botón derecho en pegar con el mouse, Vim detecta que esto proviene de un terminal y establece automáticamente el modo pegar, luego lo desarma una vez hecho, para que no pierda las teclas reasignadas (que no puede funcionar en modo pegar porque está escribiendo datos sin procesar) y vuelve a un estado "sano" cuando se hace.

Por solo vim (pon tu .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

Si usa vim debajo de Tmux (todavía va en .vimrc)

function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif

  let tmux_start = "\<Esc>Ptmux;"
  let tmux_end = "\<Esc>\\"

  return tmux_start . substitute(a:s, "\<Esc>", "\<Esc>\<Esc>", 'g') . tmux_end
endfunction

let &t_SI .= WrapForTmux("\<Esc>[?2004h")
let &t_EI .= WrapForTmux("\<Esc>[?2004l")

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
dragon788
fuente
¿Asumo que una de las let &t_SI .= "\<Esc>[?xxxxx"líneas está detectando el atajo de pegar del teclado? ¿Funciona esto para Mac también dado el acceso directo diferente?
duda1ejack
@ duda1ejack Estos realmente están detectando las secuencias de escape de Xterm, no cómo se llamaron (es decir, 2004h es un comienzo de pegado), siempre que su terminal admita los códigos de tecla Xterm y los pase a Vim, debería funcionar bien en Mac.
dragon788
Dios mio. eres mi héroe. He escrito así: configurar nopaste tantas veces g'd.
maxwell
3

Como sugirió romainl, la documentación explica que la configuración de la 'paste'opción deshabilita varias otras opciones, y seguramente encontrará que, más temprano que tarde, le causará problemas. Por esta razón, existe la 'pastetoggle'opción. Ver:

:help 'paste'
:help 'pastetoggle'
Heptita
fuente
1

Si algo existe, debe tener su significado. Debería echar un buen vistazo a la documentación de vim que es muy útil.

  :help 'paste'
  :help 'pastetoggle'

Una vez que leas, es posible que quieras esto:

" Toggle paste mode
"   (prefer this over 'pastetoggle' to echo current state)
nmap <leader>p :setlocal paste! paste?<cr>

Espero que encuentres útil esta publicación :)

Dzung Nguyen
fuente
1

IIRC cuando pega en vim, esencialmente piensa que usted escribió todos esos caracteres usted mismo. Por lo tanto, si la sangría automática está activada, sangrará el contenido por usted, pero el texto pegado generalmente ya contiene sangría, por lo que la sangría se "desordena". Cambiar al modo pegar desactiva cosas como la sangría automática.

Si te gusta la sangría automática a medida que escribes, deberías volver a cambiarla a nopaste una vez que hayas terminado de pegar. Pruébelo y observe cómo debe hacer toda la sangría manualmente en modo pegar.

Sumudu Fernando
fuente