Can I speed up pasting into vim?

I copied a part of the HTML out of a web page and wanted to save it in a file.
For that I started a new vim session in a terminal window, with a (new) filename specified on the commandline, hit i to get to insert mode and then CtrlShift+V and waited while [-- INSERT --] showed at the bottom and waited…

As vim was non-responsive after several seconds, I opened ‘Text Editor’ from the Applications→Accessoiries menu pasted the text (which showed up within a fraction of a second, saved it under a new name, closed, and killed the Vim session that still was not done, 1.5 minutes later.
The amount of text was 186K in 3200 lines, not excessive I would say, nor with overly long lines.

Is there a way to speed up these kind of insertions in vim and/or is there an explanation why this is so slow compared to using the, otherwise horrible and mouse oriented, Text Editor?

(The %CPU according to top doesn’t come above 5%, although I have some processors free in the system, so it might be some I/O bound problem, that doesn’t exist when reading the same text from a file)

Version info:
Ubuntu 12.04
Vim: 7.3, with patches as supplied by Ubuntu 12.04
bash: 4.2.25
gnome-terminal: 3.4.1.1

Asked By: Anthon

||

To save a lot of clipboard text to file quickly, you can run cat > file.txt, paste the contents, then press Ctrld.

If you have xsel installed, you can do :r !xsel to insert the “primary” (aka. “mouse”) selection in Vim, or :r !xsel -b to insert the “clipboard” (Ctrlc) buffer. You can also save the selection directly to a file with xsel >file.txt or xsel -b >file.txt. This removes the need for separate pasting + EOF actions, and avoids printing the entire copy buffer in the terminal.

If you have no xsel but xclip, the corresponding commands are xclip -out for the primary selection, or xclip -out -selection clipboard for the clipboard buffer.

Answered By: l0b0

If you have xterm_clipboard feature, you can use the * and + registers. These registers interface with the X11 primary selection buffer, and clipboard (respectively).

Thus if you’ve copied something via CTRL+c, you can paste it in vim with "+p.

If you’ve simply highlighted it without copying, you can paste it with "*p.
You can also make the * buffer the default buffer by doing :set clipboard=unnamed. Then any yank (y), paste (p), etc, that doesn’t specify a register will use the * register. Vim 7.3.74 also added clipboard=unnamedplus, which will use the + register by default.

You can also copy things into the primary selection & clipboard buffers by yanking, for example: "+yy.

 

Note, that as mentioned, these capabilities all need the xterm_clipboard feature. You can see if you have this feature by doing :version inside vim, or vim --version from the shell, and look for +xterm_clipboard. If it says -xterm_clipboard, you do not have it and would have to recompile vim.

Answered By: phemmer

This is a buffer flush-to-disk problem. Vim tries to keep your work safe and doesn’t assume you can type several thousand characters per second. Read :help swap-file for some details on the buffering. The solution to your problem is this:

Turn off vim’s swapfile either with:

vim -n <your file>

or from within vim before the paste:

:set noswapfile

See :help swapfile for more details.

Another option is to simply turn off the syncing to disk of the swap file with :set swapsync= but this option takes more keystrokes to undo and I’m lazy. 🙂

Turning off swap is not safe for normal operations! Immediately after the paste, either use :set swapfile or :set swapsync=fsync to revert back to normal behavior (though technically, normal behavior might have been sync and not fsync, check with :set swapsync? beforehand if you want to go this route).

Answered By: linux_sa
Categories: Answers Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.