2010-03-31 14 views
16

Cuando pego cosas del portapapeles, normalmente son (siempre) multilínea, y en esos casos (y solo en esos casos), me gustaría que se active :set paste, ya que de lo contrario, la tabulación aumentará con cada línea (¡todos lo han visto!).Pegar desde el portapapeles y alternar automáticamente: establecer pegar

Aunque el problema con :set paste es que no se comporta bien con set smartindent, haciendo que el cursor salte al principio de una nueva línea en lugar de en la sangría correcta. Entonces me gustaría habilitarlo solo para esta instancia.

Estoy usando Mac, conectando a una máquina Debian con vim, y pegando en modo Insertar usando cmd-v.

Saludos.

+1

No creo que haya ninguna razón para migrar esta pregunta: no solo se aceptan preguntas vim como pertenecientes a SO (http://meta.stackexchange.com/questions/25925/vim-questions-so-or-su), se trata de un editor de texto de programador, que se utiliza para realizar una tarea que es común al programar. – Cascabel

+1

@Jefromi: Pegar es común cuando se hace cualquier tipo de edición de texto, pero concedo que las preguntas de Vim/Emacs se han considerado aceptables para SO incluso cuando no están relacionadas directamente con la programación. @Jonatan: Recomiendo encarecidamente que no se use ''shistindent''. Consulte http://virtual.wikia.com/wiki/Restoring_indent_after_typing_hash#Using_filetype_indentation para obtener una explicación de por qué. – jamessan

+0

@jamessan: El punto es que pegar con este problema de formato específico es una tarea de programación muy, muy común. En ninguna otra parte se pegan rutinariamente bloques de texto con sangría que varían de línea a línea. – Cascabel

Respuesta

7

No uso 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 literales de control-O y control-R, que puede escribir con^V^O (control-v control-o) y^V^R (control-v control-r). Control-O en modo insertar le permite ejecutar un comando y luego regresar al modo insertar; aquí puede usarlo para colocarlo en el registro del portapapeles.

Esto funcionó para mí cuando los probé asignados a una clave diferente, por lo que debe estar todo listo.

No es necesario mapear nada cuando no está en modo insertar; solo puede usar "+p.

+0

Con respecto a '" + p' ... dependiendo de su sistema operativo, puede necesitar cambiar eso a '" * p'. Para mi computadora (osx) necesitaba usar la segunda versión. – agbodike

1

Tienes razón en que solo deberías habilitar 'paste' cuando lo necesites. Hace más que solo afectar la sangría. Puede leer todo lo que afecta en su documentation. Una opción relacionada que es muy útil para facilitar el uso de 'paste' es 'pastetoggle'.

Si estaba utilizando X-forwarding y un terminal que puede comunicar correctamente las acciones del mouse, también puede aprovechar la opción 'mouse'. Con :set mouse=a, Vim es consciente de lo que está haciendo el mouse y, por lo tanto, no realizará la sangría automática cuando recibe un pegado de varias líneas mediante un clic en el botón central del mouse.

Incluso sin la capacidad del mouse, el reenvío X podría ayudar porque Vim hará lo mismo cuando pegue manualmente desde el portapapeles o los registros de selección ("+ y "* respectivamente).

+0

Gracias. Pedí ayuda para obtener X-forwarding y Mouse y lo que no funciona (http://superuser.com/questions/98350/vim-and-mouse-with-ssh-from-mac-to-linux), pero nunca lo resolvió todo. Examinaré el pegado, eso debería resolverlo. La documentación de Vim (y el conjunto de características) es realmente enorme. –

3

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 la que se detuvo el modo Insertar última vez en el búfer.

UPD:

Jefromi registró una mejor solución. Lo he modificado un poco

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

Inserta el texto del panel y coloca el cursor justo después.

+0

Eso está bien, pero eso solo funciona con Shift-Insert, ¿verdad? Y eso no funcionaría desde mi Mac, a menos que esté equivocado. –

+0

Podría ser mapeado fácilmente a lo que prefiera. por ejemplo. –

+0

@Jonatan Littke: Mi respuesta muestra cómo asignar esto a command-v, y cómo hacerlo de manera más eficiente. – Cascabel

0

Esto debería poder resolverse con una secuencia de comandos de vim. (Odio las secuencias de comandos vim, por lo que tendría que ser una imposición mucho más grave para hacer que lo resuelva yo mismo.) Incluso con iTerm2's "paste slowly" mode, el valor predeterminado es dividir los datos para pegar en trozos de 16 bytes y enviar uno cada 0.125 segundos . Por lo tanto, debería ser capaz de detectar mediante programación un fragmento de 16 teclas 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 iba a funcionar para la mayoría de los casos.

Cuestiones relacionadas