Pasting a huge amount of text into vim is slow?

前端 未结 4 903
梦毁少年i
梦毁少年i 2021-01-31 03:12

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.

相关标签:
4条回答
  • 2021-01-31 03:41

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

    0 讨论(0)
  • 2021-01-31 03:44

    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.

    0 讨论(0)
  • 2021-01-31 03:55

    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.

    0 讨论(0)
  • 2021-01-31 03:55

    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)

    0 讨论(0)
提交回复
热议问题