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)
[使い方]
ヤンク以外にも
他に
" 列に関係なくマッチ <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)")