Ruby
Vim

ブロックの仮引数をテキストオブジェクトとして扱う

More than 3 years have passed since last update.

|で囲まれたブロックの仮引数を変更したいときに、ci|で変更できるよう、vim-textobj-userの設定をした。


.vimrc

" vim-textobj-user

call textobj#user#plugin('charpairs', {})
call textobj#user#plugin('charpairs', {
\ 'bar_a': {
\ 'pattern': '|[^|]*|',
\ 'select': 'a<Bar>'
\ },
\ 'bar_i': {
\ 'pattern': '|\zs[^|]*\ze|',
\ 'select': 'i<Bar>'
\ }
\ })

1度、空の辞書を渡しているのは、キーの名前(bar_aなど)を変更したときに、

古いキー名を参照してしまい、エラーになるのを回避するため。

あと、virtical_bar_aのように、_a_iの箇所以外にアンダースコアがある名前は使えなかった。

参考サイト:

'pattern': [a, b] does not work when a and b are equal #15

 

追記:

vim-textobj-betweenでもキーマップを変更すれば、ci|でブロックの仮引数をテキストオブジェクトとして扱えるが、

上述のvim-textobj-userと違い、カーソルが|で囲まれた内側にいる場合のみ有効。


.vimrc

" vim-textobj-between

let g:textobj_between_no_default_key_mappings = 1
vmap i<Bar> <Plug>(textobj-between-i)<Bar>
omap i<Bar> <Plug>(textobj-between-i)<Bar>
vmap a<Bar> <Plug>(textobj-between-a)<Bar>
omap a<Bar> <Plug>(textobj-between-a)<Bar>