onoremap a% Vcall search('{') normal! % onoremap i% call search() normal! v%o vnoremap a% V/{% vnoremap i% /{v%oo " " 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 anb call inner(v:operator, 'a', '(', ')', v:false) onoremap inb call inner(v:operator, 'i', '(', ')', v:false) vnoremap anb call inner(v:operator, 'a', '(', ')', v:false) vnoremap inb call inner(v:operator, 'i', '(', ')', v:false) onoremap anB call inner(v:operator, 'a', '{', '}', v:false) onoremap inB call inner(v:operator, 'i', '{', '}', v:false) vnoremap anB call inner(v:operator, 'a', '{', '}', v:false) vnoremap inB call inner(v:operator, 'i', '{', '}', v:false) onoremap an< call inner(v:operator, 'a', '<', '>', v:false) onoremap in< call inner(v:operator, 'i', '<', '>', v:false) vnoremap an< call inner(v:operator, 'a', '<', '>', v:false) vnoremap in< call inner(v:operator, 'i', '<', '>', v:false) onoremap an[ call inner(v:operator, 'a', '\[', '\]', v:false) onoremap in[ call inner(v:operator, 'i', '\[', '\]', v:false) vnoremap an[ call inner(v:operator, 'a', '\[', '\]', v:false) vnoremap in[ call inner(v:operator, 'i', '\[', '\]', v:false) " Change 'last' objects. onoremap alb call inner(v:operator, 'a', '(', ')', v:true) onoremap ilb call inner(v:operator, 'i', '(', ')', v:true) vnoremap alb call inner(v:operator, 'a', '(', ')', v:true) vnoremap ilb call inner(v:operator, 'i', '(', ')', v:true) onoremap alB call inner(v:operator, 'a', '{', '}', v:true) onoremap ilB call inner(v:operator, 'i', '{', '}', v:true) vnoremap alB call inner(v:operator, 'a', '{', '}', v:true) vnoremap ilB call inner(v:operator, 'i', '{', '}', v:true) onoremap al< call inner(v:operator, 'a', '<', '>', v:true) onoremap il< call inner(v:operator, 'i', '<', '>', v:true) vnoremap al< call inner(v:operator, 'a', '<', '>', v:true) vnoremap il< call inner(v:operator, 'i', '<', '>', v:true) onoremap al[ call inner(v:operator, 'a', '\[', '\]', v:true) onoremap il[ call inner(v:operator, 'i', '\[', '\]', v:true) vnoremap al[ call inner(v:operator, 'a', '\[', '\]', v:true) vnoremap il[ call inner(v:operator, 'i', '\[', '\]', v:true) " 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 \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! \v%\o\" else exec "normal! \v%" endif endfunction