aboutsummaryrefslogtreecommitdiff
path: root/autoload/paste_insert.vim
diff options
context:
space:
mode:
Diffstat (limited to 'autoload/paste_insert.vim')
-rw-r--r--autoload/paste_insert.vim69
1 files changed, 64 insertions, 5 deletions
diff --git a/autoload/paste_insert.vim b/autoload/paste_insert.vim
index 675fa5a..277f333 100644
--- a/autoload/paste_insert.vim
+++ b/autoload/paste_insert.vim
@@ -1,12 +1,71 @@
+" Autoloaded entry point function
function! paste_insert#() abort
+
+ " Set up an event table
augroup paste_insert
autocmd!
- autocmd CursorHold,CursorMoved,User *
- \ set nopaste paste?
- \|autocmd! paste_insert
+
+ " Set up the paste and tell the user
+ autocmd User Start
+ \ call s:Start() | echo 'Paste ready'
+
+ " When starting insert mode, add completion hook for when we leave
autocmd InsertEnter *
\ autocmd paste_insert InsertLeave *
- \ doautocmd paste_insert User
+ \ 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
+
+ " Exit condition reporting
+ autocmd User Abort
+ \ echo 'Paste aborted'
+ autocmd User Cancel
+ \ echo 'Paste cancelled'
+ autocmd User Complete
+ \ echo 'Paste completed'
+ autocmd User Timeout
+ \ echo 'Paste timeout'
+
+ " End the paste and clear the events table
+ autocmd User Abort,Cancel,Complete,Timeout
+ \ call s:Stop() | autocmd! paste_insert
+
augroup END
- set paste paste?
+
+ " Trigger the starting actions
+ doautocmd paste_insert User Start
+
+endfunction
+
+" Key that cancels the pending paste in normal mode, defaults to CTRL-C
+let s:cancel = get(g:, 'paste_insert_cancel', '<C-C>')
+
+" Start the paste: save cancel key's prior function, remap it, set 'paste'
+function! s:Start() abort
+ let s:maparg = maparg(s:cancel)
+ let command = join([
+ \ 'nnoremap'
+ \,s:cancel
+ \,':<C-U>doautocmd paste_insert User Cancel<CR>'
+ \])
+ execute command
+ set paste
+endfunction
+
+" Stop the paste: unset 'paste', restore prior function of cancel key
+function! s:Stop() abort
+ set nopaste
+ let command = join(
+ \ s:maparg !=# ''
+ \ ? ['nnoremap', s:cancel, s:maparg]
+ \ : ['nunmap', s:cancel]
+ \)
+ execute command
+ unlet s:maparg
endfunction