Vim の text-object で日本語と英語の括弧を包括的に扱う

私はコードだけでなく日本語のテキスト編集も Vim で行うことが多い。その際に、たとえば「全角カギカッコ内を変更」したくなったりすることがある。

Vim にはテキストオブジェクトという便利な機能が存在する(詳細はたとえば ここ などを参照)。 このテキストオブジェクトを拡張する Vim Plugin として vim-textobj-user が存在し、このプラグインの拡張として全角カッコ類を扱う vim-textobj-jabraces が存在する。しかしこの拡張のデフォルトキーバインドは括弧の種類ごとに異なり、たとえば〔〕内は ijt, 【】内は ijs などと覚えにくいものとなっている。できればこれらを一つのキーバインドで扱いたい(たとえば ib と打てばカーソル位置に応じて〔〕内も【】内も選択できるようにしたい)。

複数の半角括弧を一つのキーバインドで扱えるようにする拡張は存在する(vim-textobj-multiblock)。これを導入すれば [] 内も {} 内もひとつのキーバインドで扱うことができる。この機能をさらに拡張して全角カッコも含むようにしたい。

ありがたいことに複数のテキストオブジェクトをまとめる拡張である vim-textobj-multitextobj が存在するので、これを用いて上記目的を実現できる。以下のように NeoBundle を用いてインストール・設定を行うと、 ab, ib で半角・全角カッコ内を選択することが可能になる。

NeoBundle 'kana/vim-textobj-user'
NeoBundle 'kana/vim-textobj-jabraces'
NeoBundle 'osyo-manga/vim-textobj-multiblock'
NeoBundle 'osyo-manga/vim-textobj-multitextobj'

if neobundle#tap('vim-textobj-multiblock')
    let g:textobj_multitextobj_textobjects_i = [
    \ "\<Plug>(textobj-multiblock-i)",
    \ "\<Plug>(textobj-jabraces-parens-i)",
    \ "\<Plug>(textobj-jabraces-braces-i)",
    \ "\<Plug>(textobj-jabraces-brackets-i)",
    \ "\<Plug>(textobj-jabraces-angles-i)",
    \ "\<Plug>(textobj-jabraces-double-angles-i)",
    \ "\<Plug>(textobj-jabraces-kakko-i)",
    \ "\<Plug>(textobj-jabraces-double-kakko-i)",
    \ "\<Plug>(textobj-jabraces-yama-kakko-i)",
    \ "\<Plug>(textobj-jabraces-double-yama-kakko-i)",
    \ "\<Plug>(textobj-jabraces-kikkou-kakko-i)",
    \ "\<Plug>(textobj-jabraces-sumi-kakko-i)",
    \]
    let g:textobj_multitextobj_textobjects_a = [
    \ "\<Plug>(textobj-multiblock-a)",
    \ "\<Plug>(textobj-jabraces-parens-a)",
    \ "\<Plug>(textobj-jabraces-braces-a)",
    \ "\<Plug>(textobj-jabraces-brackets-a)",
    \ "\<Plug>(textobj-jabraces-angles-a)",
    \ "\<Plug>(textobj-jabraces-double-angles-a)",
    \ "\<Plug>(textobj-jabraces-kakko-a)",
    \ "\<Plug>(textobj-jabraces-double-kakko-a)",
    \ "\<Plug>(textobj-jabraces-yama-kakko-a)",
    \ "\<Plug>(textobj-jabraces-double-yama-kakko-a)",
    \ "\<Plug>(textobj-jabraces-kikkou-kakko-a)",
    \ "\<Plug>(textobj-jabraces-sumi-kakko-a)",
    \]
    omap ab <Plug>(textobj-multitextobj-a)
    omap ib <Plug>(textobj-multitextobj-i)
    vmap ab <Plug>(textobj-multitextobj-a)
    vmap ib <Plug>(textobj-multitextobj-i)
endif