Pegar desde el portapapeles y automáticamente alternar “: conjunto pegar”

StackOverflow https://stackoverflow.com/questions/2555559

  •  23-09-2019
  •  | 
  •  

Pregunta

Cuando me pega cosas desde el portapapeles, que son normalmente (siempre) multilined, y en esos casos (y sólo aquellos casos), me gustaría :set paste para ser activado, ya que de lo contrario la tabulación se incrementará con cada línea ( que todo lo ha visto!).

Aunque el problema con :set paste es que no se comporta bien con set smartindent, haciendo que el cursor para saltar al comienzo de una nueva línea en lugar de en el guión correcto. Así que me gustaría que le permita sólo para este ejemplo.

Estoy utilizando Mac, sshing a una máquina Debian con Vim, y pegar tanto en modo Insert usando cmd + v .

¿Fue útil?

Solución

Yo no uso un Mac, pero creo que tengo el prefijo aquí: <D-v> debe significar cmd-v. Para el modo de inserción:

:imap <D-v> ^O:set paste<Enter>^R+^O:set nopaste<Enter>

o en realidad, acaba de hacer esto:

:imap <D-V> ^O"+p

El ^ O y ^ R son literal de control-O y control-R, que puede escribir con ^ V ^ O (control-v de control-o) y ^ V ^ R (control-v de control-r). Control-S en el modo de inserción le permite ejecutar un comando luego regresar al modo de inserción; aquí se puede utilizar para poner en el registro portapapeles.

Esto funcionó para mí cuando probé les asignan a una tecla diferente, por lo que debe estar todo listo.

No hay necesidad de direccionar nada cuando no está en modo de inserción; sólo puede utilizar "+p.

Otros consejos

Tengo el siguiente en mi .vimrc:

inoremap <S-Insert> <ESC>:setl paste<CR>gi<C-R>+<ESC>:setl nopaste<CR>gi

gi es iniciar el modo de inserción en la misma posición que en el modo de inserción se detuvo la última vez en el búfer en uso.

Actualización:

Jefromi registró una solución mejor. He jugado con un poco

inoremap <S-Insert> <ESC>"+p`]a

Se inserta el texto del portapapeles y lo coloca el cursor derecho después de ella.

Tienes razón en que sólo se debe permitir que 'paste' cuando lo necesite. Hace más que sólo afecta a la sangría. Usted puede leer todo lo que afecta en su documentación . Una opción relacionada que es muy útil para facilitar el uso de 'paste' es 'pastetoggle' .

Si se utiliza X-reenvío y un terminal que pueda comunicarse adecuadamente las acciones del ratón, usted podría también tomar ventaja de la '' opción ratón. Con :set mouse=a, Vim se hace consciente de lo que el ratón está haciendo y por lo tanto no va a realizar la sangría automática cuando se recibe una multilínea pegar a través de un clic-botón central del ratón.

Incluso sin la capacidad del ratón, X-reenvío podría ayudar porque Vim hacer lo mismo al pegar manualmente a partir de los registros del portapapeles o de selección ("+ y "* respectivamente).

Esto debería ser solucionable con un script de Vim. (Odio Vim secuencias de comandos, por lo que tendría que ser una imposición mucho más grave como para provocar a solucionar yo mismo.) Incluso con iTerm2 de 'pegar lentamente' modo , el valor predeterminado es romper los datos para ser pegada en 16 trozos de bytes y enviar uno cada 0,125 segundos. Por lo tanto, usted debe ser capaz de detectar mediante programación un trozo de 16 bytes de pulsaciones de teclas "" y hacer algo al respecto.

En pseudocódigo que se vería así:

if too_fast_too_be_human():
    set('pastemode', True)
else
    set('pastemode', False)

# where either
def too_fast_too_be_human
    char_threshold = 16
    return len(input_buffer) > char_threshold

# or
def too_fast_too_be_human
    static byte_times = []
    char_threshold = 16
    time_threshold = 0.125
    byte_times.append(now())
    while(len(byte_times) > char_threshold):
        byte_times.unshift()
    return (byte_times[-1] - byte_times[0]) < time_threshold

Existen debilidades a eso, sino que trabajarían para la mayoría de los casos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top