aboutsummaryrefslogtreecommitdiff
path: root/plugin/move.vim
blob: 2e3d3ef967ea3b34314fe7db887f6c031078b2ec (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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
onoremap <silent> a% V<cmd>call search('{') <bar> normal! %<cr>
onoremap <silent> i% <cmd>call search() <bar> normal! v%<bs>o<space><cr>

vnoremap <silent> a% <esc>V/{<cr>%
vnoremap <silent> i% <esc>/{<cr>v%<bs>o<space>o

"
" anb, anB, an<, an[
"
" "Next" objects. These objects are like ab, aB, a<, a[, etc. but will always go to the next body
" regardless of if it is nested or not.
"
onoremap <silent> anb <cmd>call <sid>inner(v:operator, 'a', '(', ')', v:false)<cr>
onoremap <silent> inb <cmd>call <sid>inner(v:operator, 'i', '(', ')', v:false)<cr>
vnoremap <silent> anb <cmd>call <sid>inner(v:operator, 'a', '(', ')', v:false)<cr>
vnoremap <silent> inb <cmd>call <sid>inner(v:operator, 'i', '(', ')', v:false)<cr>

onoremap <silent> anB <cmd>call <sid>inner(v:operator, 'a', '{', '}', v:false)<cr>
onoremap <silent> inB <cmd>call <sid>inner(v:operator, 'i', '{', '}', v:false)<cr>
vnoremap <silent> anB <cmd>call <sid>inner(v:operator, 'a', '{', '}', v:false)<cr>
vnoremap <silent> inB <cmd>call <sid>inner(v:operator, 'i', '{', '}', v:false)<cr>

onoremap <silent> an< <cmd>call <sid>inner(v:operator, 'a', '<', '>', v:false)<cr>
onoremap <silent> in< <cmd>call <sid>inner(v:operator, 'i', '<', '>', v:false)<cr>
vnoremap <silent> an< <cmd>call <sid>inner(v:operator, 'a', '<', '>', v:false)<cr>
vnoremap <silent> in< <cmd>call <sid>inner(v:operator, 'i', '<', '>', v:false)<cr>

onoremap <silent> an[ <cmd>call <sid>inner(v:operator, 'a', '\[', '\]', v:false)<cr>
onoremap <silent> in[ <cmd>call <sid>inner(v:operator, 'i', '\[', '\]', v:false)<cr>
vnoremap <silent> an[ <cmd>call <sid>inner(v:operator, 'a', '\[', '\]', v:false)<cr>
vnoremap <silent> in[ <cmd>call <sid>inner(v:operator, 'i', '\[', '\]', v:false)<cr>

" Change 'last' objects.
onoremap <silent> alb <cmd>call <sid>inner(v:operator, 'a', '(', ')', v:true)<cr>
onoremap <silent> ilb <cmd>call <sid>inner(v:operator, 'i', '(', ')', v:true)<cr>
vnoremap <silent> alb <cmd>call <sid>inner(v:operator, 'a', '(', ')', v:true)<cr>
vnoremap <silent> ilb <cmd>call <sid>inner(v:operator, 'i', '(', ')', v:true)<cr>

onoremap <silent> alB <cmd>call <sid>inner(v:operator, 'a', '{', '}', v:true)<cr>
onoremap <silent> ilB <cmd>call <sid>inner(v:operator, 'i', '{', '}', v:true)<cr>
vnoremap <silent> alB <cmd>call <sid>inner(v:operator, 'a', '{', '}', v:true)<cr>
vnoremap <silent> ilB <cmd>call <sid>inner(v:operator, 'i', '{', '}', v:true)<cr>

onoremap <silent> al< <cmd>call <sid>inner(v:operator, 'a', '<', '>', v:true)<cr>
onoremap <silent> il< <cmd>call <sid>inner(v:operator, 'i', '<', '>', v:true)<cr>
vnoremap <silent> al< <cmd>call <sid>inner(v:operator, 'a', '<', '>', v:true)<cr>
vnoremap <silent> il< <cmd>call <sid>inner(v:operator, 'i', '<', '>', v:true)<cr>

onoremap <silent> al[ <cmd>call <sid>inner(v:operator, 'a', '\[', '\]', v:true)<cr>
onoremap <silent> il[ <cmd>call <sid>inner(v:operator, 'i', '\[', '\]', v:true)<cr>
vnoremap <silent> al[ <cmd>call <sid>inner(v:operator, 'a', '\[', '\]', v:true)<cr>
vnoremap <silent> il[ <cmd>call <sid>inner(v:operator, 'i', '\[', '\]', v:true)<cr>

" ThisIsATest
function! s:inner(operator, ai, open, close, back) abort
  let opos = getpos('.')
  let i = 0

  if a:back
    while i < v:count + 1
      call search(a:close, 'b')
      let i += 1
    endwhile
  else
    while i < v:count + 1
      call search(a:open)
      let i += 1
    endwhile
  endif

  normal! %
  if (getline('.')[col('.')-1] =~ a:open)
    normal! %
  endif

  if col('.') > 1 && (getline('.')[col('.')-2] =~ a:open) && a:ai == 'i'
    if v:operator =~ "[cd]"
      " Cheese a 0-width by inserting a space to then immediately delete for d and c operators.
      exec "normal! i \<esc>v"
    elseif v:operator =~ "[y]"
      " Yank operation, don't do anything.
      call setpos('.', opos)
    else
      let [a, l, c, b] = getpos(".")
      call setpos("'<", [a, l, c, b])
      call setpos("'>", [a, l, c-1, b])
      normal! gv
    endif
    return
  endif

  if a:ai == 'i'
    exec "normal! \<esc>v%\<space>o\<bs>"
  else
    exec "normal! \<esc>v%"
  endif
endfunction