Someone showed me how to do this before but I can\'t figure out what it was now.
I know about :set paste
but this is not the problem.
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).
Use "*p
or "*P
to paste from the system clipboard instantly.
Vim must be compiled with +clipboard for this to work.
See :help clipboard for more information.
In my experience :set syntax=off
helps before pasting, see https://askubuntu.com/a/223061/240577 I've seen 'slow' behavior/high cpu usage with vim/gvim/mvim on osx, ubuntu, redhat and windows when pasting large blocks of content and syntax highlighting is on.
For some filetypes :set syntax=off
makes no difference because the slowdown is caused by foldexpr
. Setting an empty foldexpr
makes pasting fast again.
Doing it manually is stupid (and slow!). Luckily vim supports bracketed paste in many terminals and enables paste
automatically, so it's possible to hook into that and temporarily disable foldexpr
:
function! s:paste_toggled(new, old) abort
if a:new && !a:old
let b:saved_foldexpr = &foldexpr
let &l:foldexpr = ''
elseif !a:new && a:old && exists('b:saved_foldexpr')
let &l:foldexpr = b:saved_foldexpr
unlet b:saved_foldexpr
endif
endfunc
augroup FastPaste
autocmd OptionSet paste call s:paste_toggled(v:option_new, v:option_old)
augroup END
(source: https://github.com/liskin/dotfiles/blob/69ab04e64e001da90232eaf2c5856337d58c785f/.vim/plugin/fastpaste.vim)