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 を使用しているからなんですが…諸事情でカーソル位置を一旦移動させる必要があるのでこうなってしまいます。
修正しました。
その他、不具合等があったらお知らせ下さい。