textobj-multiblock つくった

この記事は Vim Advent Calendar 2012 119日目の記事になります。
まだまだ参加者は募集していますよ!

[概要]

textobj で特定の範囲(括弧)を選択する場合 i( や i{、i" なんかを使用します。
これをいちいち使い分けえるのが煩わしかったので ( にも { にも " にも反応する textobj をつくってみました。
これは次のような範囲に反応します。

    * : カーソル位置
    - : 有効な範囲

    " g:textobj_multiblock_blocks に設定されてある括弧に反応する
    (---*---)
    [---*---]
    {---*---}


    " " や ' も指定できる
    "---*---"
    '---*---'


    " ネストしている場合
    (   (---*---)   )
    (-*-(-------)---)
    {-*-(---(-------)---)--}


    " 次のような場合は g:textobj_multiblock_blocks に
    " 先に設定されている括弧が優先される
    (-*-{-------)   }
    (   {-------)-*-}

    let g:textobj_multiblock_blocks = [["(", ")"], ["{", "}"]]
    (---{---*---)   }

    let g:textobj_multiblock_blocks = [["{", "}"], ["(", ")"]]
    (   {---*---)---}


    " + に反応して欲しい場合は次のような設定
    let g:textobj_multiblock_blocks = [["+", "+"]]
    +---*---+

[インストール]

このプラグインを使用する場合、kana さんが作成された vim-textobj-user を予め導入しておく必要があります。

NeoBundle "kana/vim-textobj-user"
NeoBundle "osyo-manga/vim-textobj-multiblock"

[使い方]

適当にマッピングして下さい。
わたしは次のようにマッピングして使用しています。

omap ab <Plug>(textobj-multiblock-a)
omap ib <Plug>(textobj-multiblock-i)
vmap ab <Plug>(textobj-multiblock-a)
vmap ib <Plug>(textobj-multiblock-i)

[注意]

バグというか仕様なんですが、この textobj を使用した際にウィンドウのカーソル位置がズレる場合があります(バッファ上のカーソル位置がズレるのではなくてウィンドウの位置がズレる。
これは処理の中で search を使用しているからなんですが…諸事情でカーソル位置を一旦移動させる必要があるのでこうなってしまいます。
修正しました。


その他、不具合等があったらお知らせ下さい。