aboutsummaryrefslogtreecommitdiff
path: root/autoload
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2019-06-20 00:06:04 +1200
committerTom Ryder <tom@sanctum.geek.nz>2019-06-20 00:13:56 +1200
commit90c960afe270c51eb73e709d5117ef331aa7d44a (patch)
treef1f677bed28de7589aa5b9779566cfa32f9207a4 /autoload
parentApply a little more structure to events (diff)
downloadvim-paste-insert-90c960afe270c51eb73e709d5117ef331aa7d44a.tar.gz
vim-paste-insert-90c960afe270c51eb73e709d5117ef331aa7d44a.zip
Add better messages, customisable stop key
Diffstat (limited to 'autoload')
-rw-r--r--autoload/paste_insert.vim70
1 files changed, 64 insertions, 6 deletions
diff --git a/autoload/paste_insert.vim b/autoload/paste_insert.vim
index f055249..277f333 100644
--- a/autoload/paste_insert.vim
+++ b/autoload/paste_insert.vim
@@ -1,13 +1,71 @@
+" Autoloaded entry point function
function! paste_insert#() abort
+
+ " Set up an event table
augroup paste_insert
autocmd!
- autocmd User Error,Finish
- \ set nopaste paste? | autocmd! paste_insert
- autocmd CursorHold,CursorMoved,BufLeave,WinLeave *
- \ doautocmd paste_insert User Error
+
+ " 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 Finish
+ \ 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