" Autoloaded entry point function function! paste_insert#() abort " Set up an event table augroup paste_insert autocmd! " Set up the paste autocmd User Start \ call s:Start() " When starting insert mode, add completion hook for when we leave autocmd InsertEnter * \ autocmd paste_insert InsertLeave * \ doautocmd paste_insert User Complete " User waits too long in normal mode, timeout autocmd CursorHold * \ doautocmd paste_insert User Timeout " User leaves the buffer or window, abort autocmd BufLeave,WinLeave * \ doautocmd paste_insert User Abort " End the paste and clear the events table autocmd User Abort,Cancel,Complete,Timeout \ call s:Stop() | autocmd! paste_insert augroup END " Trigger the starting actions doautocmd paste_insert User Start endfunction " Keys that cancel a pending paste in normal mode let s:cancel_keys = get(g:, 'paste_insert_cancel_keys', ['', '']) " Start the paste: remap any cancel keys, set 'paste' function! s:Start() abort for key in s:cancel_keys if maparg(key, 'n') ==# '' execute join(['nnoremap', key, \ ':doautocmd paste_insert User Cancel']) else echoerr key.' already mapped in normal mode, refusing to remap' endif endfor set paste paste? endfunction " Stop the paste: unset 'paste', restore prior function of cancel key function! s:Stop() abort set nopaste paste? for key in s:cancel_keys execute join(['nunmap', key]) endfor endfunction