diff options
-rw-r--r-- | plugin/charadd.vim | 65 |
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 |