aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugin/put.vim36
1 files changed, 36 insertions, 0 deletions
diff --git a/plugin/put.vim b/plugin/put.vim
new file mode 100644
index 0000000..62a0013
--- /dev/null
+++ b/plugin/put.vim
@@ -0,0 +1,36 @@
+" A small plugin to replace a text object with the contents of a register.
+"
+" This is invoked with the 'cp' command. For example
+"
+" cpiw - replace the inner word with the contents of the default register
+" "ncpiw - replace the inner word with the contents of register 'n'
+"
+" Notably, this command does not alter the contents of the default register, so
+" this command may be repeated without worry for changing the editor state.
+
+noremap <silent> cp <cmd>call <sid>setcpreg(v:register)<bar>set operatorfunc=<sid>put<cr>g@
+
+let s:savereg = ''
+let s:cpbuf = '"'
+function! s:setcpreg(r) abort
+ let s:cpbuf = a:r
+endfunction
+
+function! s:put(arg, ...) abort
+
+ if a:0
+ echo a:1
+ let vis = '`<' . a:arg . '`>'
+ elseif a:arg == 'line'
+ let vis = "'[V']"
+ elseif a:arg == 'block'
+ let vis = "`[\<C-v>`]"
+ else
+ let vis = "`[v`]"
+ endif
+
+ let save = getreg('"')
+ silent! exec printf("norm %s\"%sp", vis, s:cpbuf)
+ call setreg('"', save)
+
+endfunction