Vim で textobj の範囲を取得する
vim-textobj-multitextobj で textobj の範囲を取得したかったんですが、以下の様な実装に。
function! s:pos_less_equal(a, b) return a:a[0] == a:b[0] ? a:a[1] <= a:b[1] : a:a[0] <= a:b[0] endfunction let s:region = [] let s:type = "" function! OperatorTextobjRegion(type) let s:type = a:type let s:region = [getpos("'[")[1:], getpos("']")[1:]] endfunction nnoremap <silent> <Plug>(textobj-region-operator) \ :<C-u>set operatorfunc=OperatorTextobjRegion<CR>g@ function! TextobjRegion(textobj) let pos = getpos(".") let s:region = [] let tmp = &operatorfunc silent execute "normal \<Plug>(textobj-region-operator)" . a:textobj let &operatorfunc = tmp if !empty(s:region) && !s:pos_less_equal(s:region[0], s:region[1]) return ["", []] endif call setpos(".", pos) return deepcopy([s:type, s:region]) endfunction echo TextobjRegion("iw") " => ['char', [[6, 1, 0], [6, 8, 0]]] echo TextobjRegion("\<Plug>(textobj-multiblock-i)") " => ['char', [[38, 29, 0], [38, 48, 0]]]
範囲を取得する用の operator を用意して、それを介して範囲を取得しています。
他にも手段はあるだろうか。