極稀に、任意の文字で囲まれた範囲を選択したり削除したりしたいことが本当にたまーにあったので書いてみた。名前が適切かどうかは知らん。
Operator-pending mode の時に、デフォルトでは if{char} か af{char} で指定した文字で囲まれた範囲を対象にできる。b じゃありません。b は block がすでにあるし、使い方的にも f の方が分かりやすいだろうし。
これがあれば、
こことか
csv,value-01,value-02,value-03 ^^^^^^^^
こことか
for (int i = 0; i < len; i++) // ^^^^^^^^
こことか
list.with_index do |e, i| # ^^^^
こことか!
str = "(" + func(a, b) + ")" # ^^^^^^^^^^^^
ここなんかも!
<Plug>(textobj-between-a){char} *<Plug>(textobj-between-a)* ^^^^^^^^^^^^^^^^^^^^^^^^^
選択できるわけです!誰得!便利!
…と、記事書いてる途中で気付いたんだけど、if/af ってもうすでに textobj-function が使ってるじゃん。被った。
まあいつか被るのは宿命なので下手に回避せずにユーザに任せることにする。私はなんだかんだ言って textobj-function はほとんど使ってないので以下のように iF/aF に退避。
omap iF <Plug>(textobj-function-i) omap aF <Plug>(textobj-function-a) vmap iF <Plug>(textobj-function-i) vmap aF <Plug>(textobj-function-a)
ちなみに、内部で getchar() を使ってる。この辺り普通のものと違うので、何か問題になるかも。
マッピングのみで実現するには今の textobj-user の仕様では非常に面倒だったので。せめて関数にコンテキスト渡せればなぁ。