Vim Advent Calendar 2013 175日目: 横幅が統一ではない矩形をヤンクしたり削除したりするプラグインをつくった

この記事は Vim Advent Calendar 2013 175日目の記事になります。


さて、以前、矩形なオブジェクトを対象とする textobj をつくりました。


上記で作った textobj は、


: カーソル位置
: 範囲

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

の用に幅が同じオブジェクトに対しては有効なのですが、幅が違うオブジェクトの場合には対処できません。

" アカウント名のみヤンクしたい
NeoBundle "Shougo/unite.vim"
NeoBundle "t9md/vim-choosewin"
NeoBundle "thinca/vim-qfreplace"
NeoBundle "koron/codic-vim"
NeoBundle "anyakichi/vim-textobj-xbrackets"


このように矩形の対象としたいオブジェクトの幅が統一していない場合に操作するためのプラグインをつくりました。
最初に言っておくと operator を書いてありますが実際には operator ではなくて operator の機能をエミュレートしているので注意してください。

[設定例]

" 下の行に向かって入力した {motion} にマッチしなくなるまでの範囲を操作する
" -head は先頭が同じ列の場合のみマッチする

" ヤンク
nmap YY <Plug>(operator-blockwise-yank-head)
" 削除
nmap DD <Plug>(operator-blockwise-delete-head)
" 変更
nmap CC <Plug>(operator-blockwise-change-head)

[使い方]

(operator-blockwise-yank)iw するとカーソル位置から下の行に向かって iw にマッチしなくなる範囲までを矩形選択でヤンクします。
ヤンク以外にも (operator-blockwise-delete) で削除したり、(operator-blockwise-change) 変更したりする事ができます。
他に

" 列に関係なくマッチ
<Plug>(operator-blockwise-yank)
" 先頭が同じ列の場合のみマッチ
<Plug>(operator-blockwise-yank-head)
" 末尾が同じ列の場合のみマッチ
<Plug>(operator-blockwise-yank-tail)

のようなマッピングもあります。
また、operator#blockwise#mapexpr() を使用することで任意の operator で操作することができます。

" operator-replace
" https://github.com/kana/vim-operator-replace
" マッチしたそれぞれのオブジェクトに operator-replace を適用する
nmap <expr> SS operator#blockwise#mapexpr_head("\<Plug>(operator-replace)")

[キャプチャ]

(operator-blockwise-delete)i"

https://cloud.githubusercontent.com/assets/214488/3074723/8f568f68-e34f-11e3-84b5-340558aaa021.gif

(operator-blockwise-change-head)iw

https://cloud.githubusercontent.com/assets/214488/3074722/7c37cbcc-e34f-11e3-96a4-dc01f5ec660d.gif


言葉で説明するのは難しいので実際に使ってみてください(投げやり。
最初にも書きましたが、このプラグイン

"homu"
"mamimami"
"an"

みたいなテキストがある場合に簡単に "" 内のテキストを操作するためにつくったプラグインです。
なにか要望や不具合があったら Issues までお願いします。