aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--autoload/paste_insert.vim70
-rw-r--r--doc/paste_insert.txt8
2 files changed, 71 insertions, 7 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
diff --git a/doc/paste_insert.txt b/doc/paste_insert.txt
index 9b63079..73036e4 100644
--- a/doc/paste_insert.txt
+++ b/doc/paste_insert.txt
@@ -8,7 +8,7 @@ after the insert ends, to avoid the annoyances caused by forgetting to do so.
It includes a timeout if insert mode isn't entered within 'updatetime'
seconds, or if the user navigates away from the buffer or window. It can also
-be cancelled with CTRL-C in normal mode.
+be cancelled with a key in normal mode, by default CTRL-C.
REQUIREMENTS *paste_insert-requirements*
@@ -25,6 +25,12 @@ MAPPINGS *paste_insert-mappings*
*<Plug>(PasteInsert)*
The `<Plug>(PasteInsert)` map in normal mode just does `:PasteInsert`.
+OPTIONS *paste_insert-options*
+
+ *g:paste_insert_cancel*
+Set `g:paste_insert_cancel` to the key you want to cancel the pending paste in
+normal mode. This defaults to '<C-C>', for CTRL-C.
+
AUTHOR *paste_insert-author*
Written and maintained by Tom Ryder <tom@sanctum.geek.nz>.