Pasting a huge amount of text into vim is slow?

帅比萌擦擦* 提交于 2020-06-24 03:08:32

问题


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.


回答1:


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.




回答2:


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).




回答3:


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.




回答4:


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)



来源:https://stackoverflow.com/questions/18258561/pasting-a-huge-amount-of-text-into-vim-is-slow

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!