sandwich, textobjでGenericsを扱う
以下の内容を実装したプラグインを作りました
code:vim
args " saiwffunc => func(args)
func(args) " sdf => args
code:vim
omap <silent> if <Plug>(textobj-functioncall-innerparen-i)
xmap <silent> if <Plug>(textobj-functioncall-innerparen-i)
omap <silent> af <Plug>(textobj-functioncall-i)
xmap <silent> af <Plug>(textobj-functioncall-i)
code:vim
" func(arg)
" <-------> af
" <-> if
この2つを組み合わせてGenericsをtextobjとして扱えるようにしつつ、sandwichでも対象にできるようにする
functioncallを使ったGenericsのtextobjの定義
code:vim
let g:textobj_functioncall_generics_patterns = [
\ {
\ 'header' : '\<\%(\h\k*\.\)*\h\k*',
\ 'bra' : '<',
\ 'ket' : '>',
\ 'footer' : '',
\ },
\ ]
onoremap <silent> <Plug>(textobj-functioncall-generics-i) :<C-u>call textobj#functioncall#ip('o', g:textobj_functioncall_generics_patterns)<CR>
xnoremap <silent> <Plug>(textobj-functioncall-generics-i) :<C-u>call textobj#functioncall#ip('x', g:textobj_functioncall_generics_patterns)<CR>
onoremap <silent> <Plug>(textobj-functioncall-generics-a) :<C-u>call textobj#functioncall#i('o', g:textobj_functioncall_generics_patterns)<CR>
xnoremap <silent> <Plug>(textobj-functioncall-generics-a) :<C-u>call textobj#functioncall#i('x', g:textobj_functioncall_generics_patterns)<CR>
omap <silent> ig <Plug>(textobj-functioncall-generics-i)
xmap <silent> ig <Plug>(textobj-functioncall-generics-i)
omap <silent> ag <Plug>(textobj-functioncall-generics-a)
xmap <silent> ag <Plug>(textobj-functioncall-generics-a)
これでGenericsがtextobjとして扱えるようになる
code:vim
" Foo<Bar>
" <------> ag
" <-> ig
functioncallは textobj#functioncall#{i, ip, a, ap} にパターンを渡してtextobjを作ることができる
デフォルトはbra, ketが ( ) で定義されているので < > でGenericsのパターンを定義している
今回はsandwichで取り回したい形の都合上、functioncallの i (inner)と a (around) ではなくて i (inner) と ip (inner paren) を使う
作成したGenerics textobjをsandwichで使えるようにする
code:vim
let g:sandwich#recipes += [
\ {
\ 'expr': 1,
\ 'cursor': 'inner_tail',
\ },
\ {
\ 'noremap': 0,
\ },
\ ]
function! InputGenerics() abort
let genericsname = input('Generics Name: ', '')
if genericsname ==# ''
throw 'OperatorSandwichCancel'
endif
return genericsname . '<'
endfunction
上記で saiwg (や saagg ) sdg srgg が使えるようになる