Posted at

Ack.vim でビジュアルモードで選択した文字列から直接コード検索する


はじめに

プロジェクト内でコードの検索をかけるときに、Ack.vim をよく使っています。その Ack.vim で、ビジュアルモードで選択した部分を直接検索する方法を調べたので、簡単にまとめます。


課題

今まで Ack.vim でコード検索をするときは、以下のような手順を踏んで実行していました。


  • 検索したい文字列をビジュアルモードで選択してヤンク


  • :Ack と入力した後にヤンクした文字列をペースト

  • Enter キーを押して実行

しかし上記の手順を何度も繰り返していると、段々と億劫になってくるところがありました。

そのため、以下のような手順で検索をかけられると楽になるなと思い、方法を探していました。


  • 検索したい文字列をビジュアルモードで選択

  • ショートカットキーで選択した文字列に対して :Ack を実行


tl;dr

Using Ack.vim on visual selection - Stack Overflow にやりたいことそのものが紹介されていました。

以下のコマンドを .vimrc に追記することで実現できました。

vnoremap <Leader>g y:Ack <C-r>=fnameescape(@")<CR><CR>


やっていること

上記についてそれぞれやっていることを記載します。

コマンド
詳細

vnoremap {lhs} {rhs}
ビジュアルモードのとき、キー入力 {lhs}{rhs} に割り当てる

<Leader>g
特殊文字列 <Leader>g の組み合わせ。(mapreader に何も設定していない場合、<Leader> はバックスラッシュが使用される)

y
選択文字列をヤンク

:Ack

Ack コマンド実行

<C-r>=
このコマンド以降で実行された式の評価値を利用する

fnameescape(@")<CR>
選択した部分をエスケープして Enter

<CR>
Enter

こちらによって、検索したい箇所を選択してから<Leader>g を入力するだけで、Ack を実行できるようになりました。

@" の部分がビジュアルモードで選択されている部分を表しているようなのですが、なぜこの文字列で表せるのかまでは調べきれませんでした。。


おわりに

普段良く使うコマンドのキー入力を減らすことができると、より負担が軽くなることを感じました。他にも何度も使っているコマンドを見つけたら、より便利になる方法を探してみたいと思います。


参考