Vim Advent Calendar 2013 107日目: Vim で矩形なオブジェクトを対象とする為の textobj を書いた

この記事は Vim Advent Calendar 2013 107日目の記事になります。
通常、テキストオブジェクト iw の範囲は


: カーソル位置
: 範囲

NeoBundle "Shougo/vimproc.vim"
NeoBundle "Shougo/unite.vim"
NeoBundle "Shougo/unite-outline"
NeoBundle "Shougo/vimfiler.vim"

のような形になります。
これを下方向に向けて矩形の範囲を対象とするテキストオブジェクトをつくりました。


NeoBundle "Shougo/vimproc.vim"
NeoBundle "Shougo/unite.vim"
NeoBundle "Shougo/unite-outline"
NeoBundle "Shougo/vimfiler.vim"

[プラグイン]

NeoBundle "osyo-manga/vim-textobj-blockwise"

[使い方]

iw で選択したい場合は、Iw、a( を使用したい場合は A( という風に i と a を大文字で使用した場合に矩形の範囲を対象とします。
またビジュアルモードの場合は で開始した場合にのみ矩形選択を行います。
この場合は通常のテキストオブジェクトと同じように iw や a( で選択する事ができます。
矩形の範囲は下方向に使用したテキストオブジェクトと同じ幅までを対象とします。
ですので、途中で幅(文字数)が変わった場合や空白行があった場合はそこまでの範囲となります。

[設定]

”デフォルトのキーマッピングを設定してほしくない場合はプラグインの読み込み前に
" 0 を設定しておく
let g:textobj_blockwise_enable_default_key_mapping = 0

" 自分でキーマッピングして使用する場合
" iw を対象とする
omap <expr> <Leader>iw textobj#blockwise#mapexpr("iw")

" ビジュアルモード時に 2j や 3l で矩形選択を行いたい場合
" カウントを入力した場合に矩形選択を行う
vmap <expr> l mode() == "\<C-v>" && v:count >= 1 ? textobj#blockwise#mapexpr("l")  : "l"
vmap <expr> h mode() == "\<C-v>" && v:count >= 1 ? textobj#blockwise#mapexpr("h")  : "h"

[範囲例]


: カーソル位置
: 範囲

" Iw
" 同じ iw の範囲が続くまで
homu
mami
mado
an

" I(
( homu )
( mami )
( mado )
( an )

[cIw]

https://f.cloud.github.com/assets/214488/2436964/04c70a28-ade2-11e3-88b7-0ed9a83b4704.gif

[iw]

https://f.cloud.github.com/assets/214488/2436966/04f3f86c-ade2-11e3-811f-4dbbf080e794.gif


同じ幅でなければ矩形選択はできませんが、同じような構文が続いている行を操作する場合はそこそこ便利なんじゃないかと思います。