問題
行とかファイル全体とかではなく、特定の範囲内で検索をしたいことがある。その場合、ヴィジュアルモードで選択して検索するのではなく、textobjの範囲内でできると便利そう。
たとえば、以下のようなすげー長い関数があった時に、
function longLongFunction ($arg) {
$foo = $arg + 'foo';
// ... とても長い ...
$bar = $arg + 'bar';
}
この関数内で$arg
がどんな使われ方をしているか検索したいことがある。普通に検索すると、別の関数で定義されている$arg
もひっかかってしまうし、textobjをヴィジュアルモードで選択して検索するのは二度手間だし、表示も微妙。
解決
上記のブログの通り、以下のように設定しているとする。
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に対応した言語が少なくて悲しい……。