" 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