aboutsummaryrefslogtreecommitdiff
path: root/plugin/supert.vim
blob: 752d70a956cecbc9be48fb4ad0f807aa9a6cee4e (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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
" Vim plugin to provide multiline analogs to t & f

if !exists('g:supert_provide_bindings')
  let g:supert_provide_bindings = 1
endif

let s:last = []

let s:insert_char = ''
function! s:getchar()
  let s:insert_char = nr2char(getchar())
endfunction

function! s:do_search(type, vis) abort
  if a:type == ';'
    call s:do_last(0, a:vis)
  elseif a:type == ','
    call s:do_last(1, a:vis)
  else
    call s:do_search_ch(a:type, a:vis, s:insert_char)
  endif
endfunction

function! s:do_last(inv, vis) abort
  if len(s:last) < 2

    return
    return
  endif

  le] type = s:last[0]
  let ch = s:last[1]

  if a:inv
    if type =~ '[a-z]'
      let type = toupper(type)
    else
      let type = tolower(type)
    endif
  endif

  return s:do_search_ch(type, a:vis, ch)
endfunction

function! s:do_search_ch(type, vis, ch)
  let s:last = [a:type, a:ch]

  let flags = 'W'
  let pattern = ''

  if a:type =~ '[A-Z]'
    let flags .= 'b'
  endif

  let pattern = a:ch

  if a:type == 't'
    let pattern = '\zs\_.\ze' . pattern
  elseif a:type == 'T'
    let pattern = pattern . '\zs\_.\ze'
  endif

  if a:vis != ''
    exec "normal! v"
  endif

  let i = 0
  while i < v:count1
    call search(pattern, flags)
    let i += 1
  endwhile
endfunction

nnoremap <M-t>
      \ <cmd>call <sid>getchar()
      \ <bar>call <sid>do_search('t', '')<cr>

" Prepares the operation by reading a character from the user, escapes the
" current operator-pending mode and then crafts a new command using the private-
" scoped <plug>(strf-post) command.
function! s:prepare_operation(t, op)
  let s:operator = a:op
  let s:type = a:t
  let s:insert_char = nr2char(getchar())

  call feedkeys("\<esc>")
  call feedkeys(printf("%s\<plug>(srtf-post)", s:operator))
endfunction

" Include the bindings if the user wast to include them.
if g:supert_provide_bindings
  onoremap Zt <Plug>(srtf-to)
  onoremap Zf <Plug>(srtf-fo)
  onoremap ZT <Plug>(srtf-To)
  onoremap ZF <Plug>(srtf-Fo)

  nnoremap Zt <Plug>(srtf-t)
  nnoremap Zf <Plug>(srtf-f)
  nnoremap ZT <Plug>(srtf-T)
  nnoremap ZF <Plug>(srtf-F)

  vnoremap Zt <Plug>(srtf-tv)
  vnoremap Zf <Plug>(srtf-fv)
  vnoremap ZT <Plug>(srtf-Tv)
  vnoremap ZF <Plug>(srtf-Fv)
endif

" test?

vnoremap <Plug>(srtf-tv) <cmd>call <sid>getchar()<bar>call <sid>do_search('t', '')<cr>
vnoremap <Plug>(srtf-fv) <cmd>call <sid>getchar()<bar>call <sid>do_search('f', '')<cr>
vnoremap <Plug>(srtf-Tv) <cmd>call <sid>getchar()<bar>call <sid>do_search('T', '')<cr>
vnoremap <Plug>(srtf-Fv) <cmd>call <sid>getchar()<bar>call <sid>do_search('F', '')<cr>

nnoremap <Plug>(srtf-t) <cmd>call <sid>getchar()<bar>call <sid>do_search('t', '')<cr>
nnoremap <Plug>(srtf-f) <cmd>call <sid>getchar()<bar>call <sid>do_search('f', '')<cr>
nnoremap <Plug>(srtf-T) <cmd>call <sid>getchar()<bar>call <sid>do_search('T', '')<cr>
nnoremap <Plug>(srtf-F) <cmd>call <sid>getchar()<bar>call <sid>do_search('F', '')<cr>

onoremap <Plug>(srtf-to) <cmd>call <sid>prepare_operation('t', v:operator)<cr>
onoremap <Plug>(srtf-fo) <cmd>call <sid>prepare_operation('f', v:operator)<cr>
onoremap <Plug>(srtf-To) <cmd>call <sid>prepare_operation('T', v:operator)<cr>
onoremap <Plug>(srtf-Fo) <cmd>call <sid>prepare_operation('F', v:operator)<cr>

" is this a question? Or is that?

onoremap <Plug>(srtf-post) <cmd>call <sid>do_search_postchar('v')<cr>
function! s:do_search_postchar(vis) abort
  echom printf("do_search(%s, %s)", s:type, a:vis)
  call s:do_search(s:type, a:vis)
endfunction