aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugin/charadd.vim65
1 files changed, 65 insertions, 0 deletions
diff --git a/plugin/charadd.vim b/plugin/charadd.vim
new file mode 100644
index 0000000..b8d25bf
--- /dev/null
+++ b/plugin/charadd.vim
@@ -0,0 +1,65 @@
+" Add/substracts a number from all the characters in a text object.
+"
+" [count]cx<obj> - increment all the characters in the text object by count,
+" except whitespace
+" [count]cX<obj> - decrement all characters in the text object by count, except
+" whitespace
+" [count]cgx<obj> - like cx, but include whitespace characters
+" [count]cgX<obj> - like cX, but include whitespace characters
+"
+" The following convinence functions are added
+"
+" cxx, cXX, cgxx, cgXX to operate on lines.
+"
+
+noremap <silent> cx <cmd>call <sid>set_dir(v:count1,0)<bar>set operatorfunc=<sid>charadd<cr>g@
+nnoremap <silent> cxx <cmd>call <sid>set_dir(v:count1,0)<bar>set operatorfunc=<sid>charadd<cr>g@_
+noremap <silent> cX <cmd>call <sid>set_dir(-v:count1,0)<bar>set operatorfunc=<sid>charadd<cr>g@
+nnoremap <silent> cXX <cmd>call <sid>set_dir(-v:count1,0)<bar>set operatorfunc=<sid>charadd<cr>g@_
+
+
+noremap <silent> cgx <cmd>call <sid>set_dir(v:count1,1)<bar>set operatorfunc=<sid>charadd<cr>g@
+nnoremap <silent> cgxx <cmd>call <sid>set_dir(v:count1,1)<bar>set operatorfunc=<sid>charadd<cr>g@_
+noremap <silent> cgX <cmd>call <sid>set_dir(-v:count1,1)<bar>set operatorfunc=<sid>charadd<cr>g@
+nnoremap <silent> cgXX <cmd>call <sid>set_dir(-v:count1,1)<bar>set operatorfunc=<sid>charadd<cr>g@_
+
+let s:dir = 1
+let s:incl = 0
+function! s:set_dir(d, i) abort
+ let s:dir = a:d
+ let s:incl = a:i
+endfunction
+
+function! s:charadd(arg, ...) abort
+ let save_a = getreg('a')
+ let save_a_type = getregtype('a')
+
+ 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
+
+ silent! exec printf("norm! %s\"ay", vis)
+ let r = getreg('a', 1)
+ let rtyp = getregtype('a')
+
+ let nl = ""
+ for c in r
+ if s:incl || ! (c =~ '\_s')
+ let n = char2nr(c)
+ let nl .= nr2char(n + s:dir)
+ else
+ let nl .= c
+ endif
+ endfor
+
+ call setreg('a', nl, rtyp)
+ silent! exec printf("norm! gv\"ap`[")
+ call setreg('a', save_a, save_a_type)
+endfunction