aboutsummaryrefslogtreecommitdiff
path: root/plugin/repeat-yank.vim
blob: 50118f7a9dfab0b9109e891e93c1efc23678096b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
" Makes the 'yank' operator a repeatable operator. When repeating, the yank
" operator will yank-append into the provided register, seperating each yank
" entry with a newline.
"
" This is ergonomic for collecting snippets (like words) across a file and then   

let s:repeat_yank_first=1
let s:repeat_yank_reg=''

function! s:do_repeatable_yank(typ)
  let reg = s:repeat_yank_reg
  let repeat = ! s:repeat_yank_first

  if s:repeat_yank_first
    let s:repeat_yank_first = 0
  else
    let last_reg_info = getreginfo(reg)
  endif

  if a:typ == 'char'
    exec 'normal! `[v`]"' . reg . 'y'
  else
    exec "'[,']yank " . reg
  endif

  if repeat
    let cur_reg_info = getreginfo('"')
    call setreg(
          \ reg,
          \ last_reg_info.regcontents + cur_reg_info.regcontents,
          \ last_reg_info.regtype )
  endif
endfunction

function! s:setup_repeatable_yank() abort
  let s:repeat_yank_reg = v:register
  let s:repeat_yank_first = 1
endfunction

if exists('g:override_native_yank_behavior') && g:override_native_yank_behavior
  " Option for overriding default yank behavior.
  nmap yy gy_
  nmap Y y$
  nnoremap y <cmd>call <sid>setup_repeatable_yank()<cr><cmd>set operatorfunc<sid>=do_repeatable_yank<cr>g@
else
  " By default make a new 'g' command 'gy' and 'gY' for this repeatable yank.
  nmap gyy gy_
  nmap gY y$
  nnoremap gy <cmd>call <sid>setup_repeatable_yank()<cr><cmd>set operatorfunc=<sid>do_repeatable_yank<cr>g@
endif