" 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 = [] 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, nr2char(getchar())) endif endfunction function! s:do_last(inv, vis) abort if len(s:last) < 2 return endif let 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 == 'v' exec "norm gv" elseif a:vis == 'o' exec "norm v" endif let i = 0 while i < v:count1 call search(pattern, flags) let i += 1 endwhile endfunction nnoremap (supert-replace-t) :silent call do_search('t', '') nnoremap (supert-replace-T) :silent call do_search('T', '') nnoremap (supert-replace-f) :silent call do_search('f', '') nnoremap (supert-replace-F) :silent call do_search('F', '') vnoremap (supert-replace-t) :silent call do_search('t', 'v') vnoremap (supert-replace-T) :silent call do_search('T', 'v') vnoremap (supert-replace-f) :silent call do_search('f', 'v') vnoremap (supert-replace-F) :silent call do_search('F', 'v') onoremap (supert-replace-t) :silent call do_search('t', 'o') onoremap (supert-replace-T) :silent call do_search('T', 'o') onoremap (supert-replace-f) :silent call do_search('f', 'o') onoremap (supert-replace-F) :silent call do_search('F', 'o') onoremap (supert-replace-,) :silent call do_search(',', 'o') onoremap (supert-replace-;) :silent call do_search(';', 'o') vnoremap (supert-replace-,) :silent call do_search(',', 'v') vnoremap (supert-replace-;) :silent call do_search(';', 'v') nnoremap (supert-replace-,) :silent call do_search(',', '') nnoremap (supert-replace-;) :silent call do_search(';', '') if g:supert_provide_bindings nnoremap (supert-replace-t) nnoremap (supert-replace-T) nnoremap (supert-replace-f) nnoremap (supert-replace-F) vnoremap (supert-replace-t) vnoremap (supert-replace-T) vnoremap (supert-replace-f) vnoremap (supert-replace-F) vnoremap (supert-replace-t) vnoremap (supert-replace-T) vnoremap (supert-replace-f) vnoremap (supert-replace-F) vnoremap (supert-replace-;) vnoremap (supert-replace-,) nnoremap (supert-replace-;) nnoremap (supert-replace-,) endif