Vimで、特定の範囲内(textobj)で検索する

  • 11
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

問題

行とかファイル全体とかではなく、特定の範囲内で検索をしたいことがある。その場合、ヴィジュアルモードで選択して検索するのではなく、textobjの範囲内でできると便利そう。

たとえば、以下のようなすげー長い関数があった時に、

function longLongFunction ($arg) {
   $foo = $arg + 'foo';

    // ... とても長い ...

   $bar = $arg + 'bar';
}

この関数内で$argがどんな使われ方をしているか検索したいことがある。普通に検索すると、別の関数で定義されている$argもひっかかってしまうし、textobjをヴィジュアルモードで選択して検索するのは二度手間だし、表示も微妙。

解決

vim-operator-searchを使う。

上記のブログの通り、以下のように設定しているとする。

nmap <Space>s <Plug>(operator-search)
nmap <Space>/ <Plug>(operator-search)if

前述の関数の場合、#にカーソルがあった場合、

function longLongFunction ($arg) {
   $foo = $arg + 'foo';
#
    // ... とても長い ...

   $bar = $arg + 'bar';
}

<Space>si{とするとInput search pattern:ときかれるので、arg<CR>と入力すると、上記の関数内のargが検索される。つまり、この場合のi{のように、operatorの次に入力したtextobjの範囲内で検索が行われるということ。

vim-textobj-functionに対応したプラグイン(Vim, C, Perl, Ruby, JavaScript, PHPがいまのところあるようだ)を使うと、上記の設定の2番めが使える。

たとえばPerlなら、カーソルが以下の関数内にあるときに、

sub long_long_sub {
   my $arg = shift;

   # ...

   $arg = '...'
}

<Space>/と入力するだけで、Input search pattern:ときかれ、argと入力すればよい。

議論

vim-textobj-functionに対応した言語が少なくて悲しい……。