LoginSignup
11
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-10-20

問題

行とかファイル全体とかではなく、特定の範囲内で検索をしたいことがある。その場合、ヴィジュアルモードで選択して検索するのではなく、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に対応した言語が少なくて悲しい……。

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12