¿Puedo acelerar pegar en vim?


12

Copié una parte del HTML de una página web y quería guardarlo en un archivo. Para eso comencé una nueva vim sesión en una ventana de terminal, con un (nuevo) nombre de archivo especificado en la línea de comandos, presioné ipara ingresar al modo de inserción y luego CtrlShift+ Vy esperé mientras se [-- INSERT --]mostraba en la parte inferior y esperé ...

Como vimno respondía después de varios segundos, abrí 'Editor de texto' desde el menú Aplicaciones → Accesorios pegué el texto (que apareció en una fracción de segundo, lo guardé con un nuevo nombre, lo cerré y eliminé la sesión de Vim que todavía no se hizo, 1,5 minutos después. La cantidad de texto fue de 186K en 3200 líneas, no excesivo diría, ni con líneas demasiado largas.

¿Hay alguna manera de acelerar este tipo de inserciones vimy / o hay una explicación de por qué esto es tan lento en comparación con el uso del editor de texto, de lo contrario horrible y orientado al mouse?

(El% de CPU según topno supera el 5%, aunque tengo algunos procesadores libres en el sistema, por lo que podría haber algún problema relacionado con E / S, que no existe al leer el mismo texto de un archivo)

Información de la versión:
Ubuntu 12.04
Vim: 7.3, con parches proporcionados por Ubuntu 12.04
bash: 4.2.25
gnome-terminal: 3.4.1.1


1
Creo que es lento porque tiene que analizar la entrada e intentar formatearla, etc. No estoy seguro de la opción para hacer esto, pero supongo que podría deshabilitar temporalmente esa función w / in vim, pegar y luego vuelve a habilitarlo. También intente usar la :set pastefunción para ver si mejora las cosas. Verlo :help pastedescribe cómo vimno hace distinción b / w escribiendo y pegando.
slm

También esperaría vitratar de analizar el archivo al leerlo (después de guardar la forma @ l0b0 sugerida). Pero eso funciona rápido.
Anthon

Es cierto, pero me imagino que tiene que volver a analizar todo lo que ya está analizado + el nuevo personaje a medida que lo pegue. Eso parece ser lo que sucede cuando edita un archivo también, hasta cierto punto.
slm

el :set pasteno parece realmente hacer una diferencia (no estoy usando un cronómetro, solo el reloj de pared).
Anthon

OK, fue solo un pensamiento ...
slm

Respuestas:


14

Para guardar una gran cantidad de texto del portapapeles en un archivo rápidamente, puede ejecutar cat > file.txt, pegar el contenido y luego presionar Ctrl- d.

Si tiene instalado xsel , puede hacer :r !xselpara insertar la selección "primaria" (también conocida como "mouse") en Vim, o :r !xsel -bpara insertar el búfer " Ctrl- portapapeles" ( - c). También puede guardar la selección directamente en un archivo con xsel >file.txto xsel -b >file.txt. Esto elimina la necesidad de pegar por separado + acciones EOF y evita imprimir todo el búfer de copia en el terminal.

Si no tiene xsel sino xclip, los comandos correspondientes son xclip -outpara la selección primaria o xclip -out -selection clipboardpara el búfer del portapapeles.


1
Gracias, eso al menos funciona sin tener que volver al mouse, e insertar el archivo en vim (por ejemplo, cuando no empiezo con un archivo vacío) es lo suficientemente rápido.
Anthon

No entiendo por qué esto no se pudo vincular a ctrl + shift + v no tiene absolutamente ningún sentido en todo esto.
mchid

2

Este es un problema de búfer a disco. Vim intenta mantener su trabajo seguro y no asume que puede escribir varios miles de caracteres por segundo. Lea :help swap-filepara algunos detalles sobre el almacenamiento en búfer. La solución a su problema es esta:

Desactive el archivo de intercambio de vim con:

vim -n <your file>

o desde dentro de vim antes de la pasta:

:set noswapfile

Ver :help swapfilepara más detalles.

Otra opción es simplemente desactivar la sincronización con el disco del archivo de intercambio, :set swapsync=pero esta opción requiere más pulsaciones de teclas para deshacer y soy flojo. :)

¡Desactivar el intercambio no es seguro para las operaciones normales! Inmediatamente después de la pasta, ya sea para uso :set swapfileo :set swapsync=fsyncpara volver a un comportamiento normal (aunque técnicamente, un comportamiento normal podría haber sido sincronización y no fsync , cheque con :set swapsync?antelación si desea seguir este camino).


1
esto no
aceleró

1

Si tiene xterm_clipboardfunción, puede usar los registros *y +. Estos registros interactúan con el búfer de selección primaria X11 y el portapapeles (respectivamente).

Por lo tanto, si ha copiado algo a través de CTRL+ c, puede pegarlo en vim con "+p.

Si simplemente lo ha resaltado sin copiar, puede pegarlo con "*p.
También puede hacer que el *búfer sea ​​el búfer predeterminado haciendo :set clipboard=unnamed. Entonces cualquier yank ( y), paste ( p), etc., que no especifique un registro usará el *registro. También se agregó Vim 7.3.74 clipboard=unnamedplus, que usará el +registro por defecto.

También puede copiar cosas en la selección del portapapeles y tampones primarias dando un tirón, por ejemplo: "+yy.

 

Tenga en cuenta que, como se mencionó, todas estas capacidades necesitan la xterm_clipboardfunción. Puede ver si tiene esta característica haciendo :versiondentro de vim, o vim --versiondesde el shell, y busque +xterm_clipboard. Si dice -xterm_clipboard, no lo tiene y tendría que volver a compilar vim.


No tengo esa característica. ¿Volvería a compilar ayuda incluso si vim no se ejecuta en xterm? (Estoy usando gnome-terminal).
Anthon

@Anthon Si está utilizando GUI VIM, entonces creo que los registros también están habilitados. xterm_clipboardes solo si se ejecuta vim desde la terminal.
Patrick

Esto es solo texto, sin GUI VIM, pero no se ejecuta desde xterm.
Anthon

Oh, lo siento, leí mal. Sí se xterm_clipboardaplica a cualquier emulador de terminal, no solo a xterm. Yo mismo uso urxvt.
Patrick
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.