Posso accelerare incollando in VIM?


12

Ho copiato una parte dell'HTML da una pagina Web e volevo salvarla in un file. Per questo ho iniziato una nuova vim sessione in una finestra del terminale, con un (nuovo) nome file specificato nella riga di comando, ho premuto iper arrivare alla modalità di inserimento e poi CtrlShift+ Ve ho aspettato mentre era [-- INSERT --]mostrato in fondo e ho aspettato ...

Dato che vimnon rispondeva dopo alcuni secondi, ho aperto 'Editor di testo' dal menu Applicazioni → Accessori incollato il testo (che è apparso in una frazione di secondo, salvato con un nuovo nome, chiuso e ucciso la sessione di Vim che ancora non è stato fatto, 1,5 minuti più tardi. La quantità di testo era 186K in 3200 righe, non eccessivo direi, né con righe troppo lunghe.

C'è un modo per accelerare questo tipo di inserimenti in vime / o c'è una spiegazione del perché questo è così lento rispetto all'utilizzo dell'editor di testo, altrimenti orribile e orientato al mouse?

(La% CPU secondo topnon supera il 5%, anche se ho alcuni processori liberi nel sistema, quindi potrebbe trattarsi di un problema legato all'I / O, che non esiste quando si legge lo stesso testo da un file)

Informazioni sulla versione:
Ubuntu 12.04
Vim: 7.3, con patch fornite da Ubuntu 12.04
bash: 4.2.25
gnome-terminal: 3.4.1.1


1
Penso che sia lento b / c che debba analizzare l'input e provare a formattarlo, ecc. Non sono sicuro dell'opzione per farlo, ma presumo che tu possa disabilitare temporaneamente quella funzione con / in vim, fare l'incollaggio e quindi riattivarlo. Prova anche a utilizzare la :set pastefunzione per vedere se migliora le cose. Vedi :help pastecome descrive come vimnon fa distinzione in b / n digitando e incollando.
slm

Mi aspetto vidi provare ad analizzare il file durante la lettura (dopo aver salvato il modo suggerito da @ l0b0). Ma funziona velocemente.
Anthon,

È vero, ma sto immaginando che debba analizzare tutto ciò che è già analizzato + il nuovo personaggio mentre lo stai incollando. Questo sembra essere quello che succede quando modifichi anche un file, fino a un certo punto.
slm

il :set pastenon sembra fare davvero la differenza (non sto usando un cronometro, solo l'orologio da parete).
Anthon,

OK, era solo un pensiero ...
slm

Risposte:


14

Per salvare un sacco di testo negli Appunti su file rapidamente, è possibile eseguire cat > file.txt, incollare il contenuto, quindi premere Ctrl- d.

Se hai xsel installato, puoi fare :r !xselper inserire la selezione "principale" (aka. "Mouse") in Vim, o :r !xsel -bper inserire il buffer "appunti" ( Ctrl- c). È inoltre possibile salvare la selezione direttamente in un file con xsel >file.txto xsel -b >file.txt. Ciò elimina la necessità di incollare separatamente + azioni EOF ed evita di stampare l'intero buffer di copia nel terminale.

Se non hai xsel ma xclip, i comandi corrispondenti sono xclip -outper la selezione primaria o xclip -out -selection clipboardper il buffer degli appunti.


1
Grazie, questo funziona almeno senza dover tornare al mouse e l'inserimento del file in vim (ad es. Quando non inizio con un file vuoto) è abbastanza veloce.
Anthon,

Non capisco perché questo non possa essere associato a ctrl + shift + v non ha assolutamente senso in tutto questo.
mchid

2

Questo è un problema flush-to-disk del buffer. Vim cerca di mantenere il tuo lavoro sicuro e non presume che tu possa digitare diverse migliaia di caratteri al secondo. Leggi :help swap-fileper alcuni dettagli sul buffering. La soluzione al tuo problema è questa:

Disattiva il file di scambio di vim con:

vim -n <your file>

o dall'interno di vim prima della pasta:

:set noswapfile

Vedi :help swapfileper maggiori dettagli.

Un'altra opzione è semplicemente disattivare la sincronizzazione con il disco del file di scambio con :set swapsync=ma questa opzione richiede più sequenze di tasti per annullare e io sono pigro. :)

La disattivazione dello scambio non è sicura per le normali operazioni! Immediatamente dopo l'incollaggio, utilizzare :set swapfileo :set swapsync=fsyncper tornare al comportamento normale (anche se tecnicamente, il comportamento normale potrebbe essere stato sincronizzato e non sincronizzato , verificare in :set swapsync?anticipo se si desidera seguire questa strada).


1
questo non ha accelerato le cose per me ...
partecipare il

1

Se si dispone di xterm_clipboardfunzionalità, è possibile utilizzare i registri *e +. Questi registri si interfacciano con il buffer di selezione principale X11 e gli Appunti (rispettivamente).

Quindi, se hai copiato qualcosa tramite CTRL+ c, puoi incollarlo con Vim "+p.

Se l'hai semplicemente evidenziato senza copiarlo, puoi incollarlo con "*p.
È inoltre possibile *impostare il buffer come buffer predefinito :set clipboard=unnamed. Quindi qualsiasi yank ( y), paste ( p), ecc., Che non specifica un registro, utilizzerà il *registro. Vim 7.3.74 anche aggiunto clipboard=unnamedplus, che utilizzerà il +registro per impostazione predefinita.

È anche possibile copiare le cose nelle primarie buffer di selezione e degli appunti da strattoni, per esempio: "+yy.

 

Si noti che, come detto, queste funzionalità richiedono tutte la xterm_clipboardfunzionalità. Puoi vedere se hai questa funzione eseguendo :versionall'interno di VIM o vim --versiondalla shell e cercando +xterm_clipboard. Se dice -xterm_clipboard, non ce l'hai e dovresti ricompilare vim.


Non ho quella funzione. La ricompilazione sarebbe di aiuto anche se VIM non è in esecuzione con xterm? (Sto usando gnome-terminal).
Anthon,

@Anthon Se stai usando GUI VIM, credo che anche i registri siano abilitati. xterm_clipboardè solo se si esegue vim dal terminale.
Patrick,

Questo è solo testo, nessuna GUI VIM, ma non è in esecuzione xterm.
Anthon,

Oh, scusa se ho letto male. Sì si xterm_clipboardapplica a qualsiasi emulatore di terminale, non solo a xterm. Io stesso uso urxvt.
Patrick,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.