From 7b33a180b311ebaaf565d485a75d17439f9dd271 Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Tue, 30 Aug 2022 18:53:23 -0600 Subject: joiner.vim: wip. --- plugin/joiner.vim | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 plugin/joiner.vim (limited to 'plugin') diff --git a/plugin/joiner.vim b/plugin/joiner.vim new file mode 100644 index 0000000..929a326 --- /dev/null +++ b/plugin/joiner.vim @@ -0,0 +1,70 @@ +" Joiner. Ability to join lines in a text object. + +if ! exists('g:joiner_include_bindings') + let g:joiner_include_bindings = 1 +endif + +if ! exists('g:joiner_leader') + let g:joiner_leader = '+' +endif + +function! s:join_text_literal(yanked, yankedtype) abort + if !exists('g:joiner_join_text') + let g:joiner_join_text = ' ' + endif + return join(a:yanked, g:joiner_join_text) +endfunction + +function! s:join_text_collapse(yanked, yankedtype) abort + let changed = [] + if !exists('g:joiner_join_text') + let g:joiner_join_text = ' ' + endif + for y in a:yanked + call add(changed, substitute(y, '^\s\+', '', 'g')) + endfor + return join(changed, g:joiner_join_text) +endfunction + +function! s:joiner_do(type, ...) abort + if a:0 + psilent exe "norm! gvy" + elseif a:type == 'line' + " yank the text described by the motion + silent exe "norm! '[V']y" + else + silent exe "norm! `[v`]y" + endif + + let yanked = getreg('"', 1, v:true) + let yankedtype = getregtype('"') + + if !exists('g:joiner_join_text') + let g:joiner_join_text = ' ' + endif + + let changed = [g:JoinerJoinText(yanked, yankedtype)] + + call setreg('"', changed, yankedtype) + + norm gvp + + " Reset the yanked text to what it was originally. + call setreg('"', yanked, yankedtype) +endfunction + +noremap (joiner-leader) + \ :let g:JoinerJoinText=function("join_text_collapse") + \:let g:joiner_join_text=' ' + \:set operatorfunc=joiner_do + \g@ + +vnoremap (joiner-leader) + \ :let g:JoinerJoinText=function("join_text_collapse") + \:let g:joiner_join_text=' ' + \gv:call joiner_do(visualmode(), 1) + +if g:joiner_include_bindings + exec printf('nmap %s (joiner-leader)', g:joiner_leader) + exec printf('vmap %s (joiner-leader)', g:joiner_leader) +endif -- cgit