aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Rahm <rahm@google.com>2022-08-30 18:53:23 -0600
committerJosh Rahm <rahm@google.com>2022-08-30 18:53:23 -0600
commit7b33a180b311ebaaf565d485a75d17439f9dd271 (patch)
tree2294706af4f770fc66ebefb57ec3142aa86b4a6d
parent9fdbd6eca7d1c466288b8be5b0a3b922e0472125 (diff)
downloadfieldmarshal.vim-7b33a180b311ebaaf565d485a75d17439f9dd271.tar.gz
fieldmarshal.vim-7b33a180b311ebaaf565d485a75d17439f9dd271.tar.bz2
fieldmarshal.vim-7b33a180b311ebaaf565d485a75d17439f9dd271.zip
joiner.vim: wip.
-rw-r--r--plugin/joiner.vim70
1 files changed, 70 insertions, 0 deletions
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 = '<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 <Plug>(joiner-leader)
+ \ :<C-u>let g:JoinerJoinText=function("<SID>join_text_collapse")<cr>
+ \:<C-u>let g:joiner_join_text=' '<cr>
+ \:<C-u>set operatorfunc=<SID>joiner_do<cr>
+ \g@
+
+vnoremap <Plug>(joiner-leader)
+ \ :<C-u>let g:JoinerJoinText=function("<SID>join_text_collapse")<cr>
+ \:<C-u>let g:joiner_join_text=' '<cr>
+ \gv:<C-u>call joiner_do(visualmode(), 1)<cr>
+
+if g:joiner_include_bindings
+ exec printf('nmap %s <Plug>(joiner-leader)', g:joiner_leader)
+ exec printf('vmap %s <Plug>(joiner-leader)', g:joiner_leader)
+endif