MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Vimでファイル名検索やgrepをgrep.vimというプラグインで快適にした話

目次

 

はじめに

自分はvimが大好きですが、

デフォルトで一番使いづらいなと思っていたのがgrep機能(vimgrep)です。

 

vimgrepはvimのデフォルト機能に入っているので便利ですが、

検索が非常に遅いため、かなりイライラしてしまいました。

 

そこで外部grepとして、

外部のツールを連携させることもできますが、

検索フォーマットを覚えるのが面倒で、

あまり使いこなせていませんでした。

 

そこで下記で説明するgrep.vimというプラグインを

導入した所、非常に便利で高速に

ファイル名検索やgrepができるようになったので

紹介したいと思います。

 

grep.vimのインストール

grep.vimは下記のGitHubリポジトリで公開されています。

github.com

 

英語ですがこちらがマニュアルです。

 

ですのでインストールは上記のファイルをDLしてパスを通すか、

Neobundleを使っている場合は、下記でインストールできます。

NeoBundle 'vim-scripts/grep.vim'

 

Windowsでgrep.vimを使う場合

grep.vimは裏でUnixツールのgrepやfindを使っています。

UnixやMacでは、元々それらのツールが付いているので問題無いですが、

windowsの場合は下記のリンク先からインストールする必要があります。

 

自分は、Git For Windowsをインストールした時に付いてきた、

Git BashののUnixユーティリティのexeファイルがあったので

それらを使おうと思ったのですが、

git-for-windows.github.io

WindwosのC:Program Filesのスペースのせいで

パスが上手く認識できなかったようなので、

下記のコマンドでシンボリックリンクを貼りました。

mklink /d "C:\Gitbin" "C:\Program Files\Git\bin"

 

そして下記のようにvimrcに設定を追記しました。

elseif has("win32")
    " Windows環境用のコード

    "grep.vim用にGitbashのgrepにパスを通す"
    "Program filesのディレクトリ名の間のスペースによって
    "おかしい挙動をしたため、エイリアスを使った"
    let Grep_Path = 'C:\Gitbin\grep.exe' 
    let Grep_Xargs_Path = 'C:\Gitbin\xargs.exe' 
    let Grep_Find_Path = 'C:\Gitbin\find.exe'
    let Grep_Shell_Quote_Char = '"'
    
endif

grep.vimの使い方

色々機能がありますが、

自分がメインで使っている機能だけを説明します。

 

拡張子やディレクトリ設定して再帰的にgrepする

自分が一番使っている機能は再帰的にgrepする

:Rgrepです。

 

検索したい文字列の上にカーソルが乗った状態で、

:Rgrepと入力すると、

下記のように、カーソル下の単語が検索文字として入力されているはずです。

f:id:meison_amsl:20160117180250p:plain

検索文字がその文字でいい場合はOKを押します。

また以前の検索履歴を上下キーでたどることができるので、

以前検索したものを再度検索することも簡単です。

 

すると、続いて検索ディレクトリの設定になります。

デフォルトでは、今のカレントディレクトリが入力されています。

f:id:meison_amsl:20160117180356p:plain

 

最後に検索するファイルパターンの設定になります。

すでに検索するファイルの拡張子などがわかっている場合は、

ちゃんと指定しておくと、検索が高速になります。

下記は.pyファイルを検索する場合です。

f:id:meison_amsl:20160117180655p:plain

 

すると、検索結果がQuickfixとして表示されます。

あとは開きたいファイルの上でEnterを押せば、

そのファイルを開くことができます。

 

ちなみに<C-w>Enterを押すと、

現在のファイルを残したままで

ファイルを開くことができます。

 

また自分の場合、下記をvimrcに追記し、

grとコマンドすると:Rgrepが起動するようにしています。

nnoremap <expr> gr ':Rgrep<CR>'

 

ファイル名検索

grepではなく、あるファイル名を指定して、

そのファイル名のファイルのパスを高速で検索する場合にも、

このgrep.vimを使うと便利です。

 

まず、:Rgrepを起動し、

検索文字を*にします。

f:id:meison_amsl:20160117183324p:plain

続いて、再帰検索のディレクトリを決定します。

最後にファイル名の指定で、

検索したいファイル名を入力します。

f:id:meison_amsl:20160117183446p:plain

すると、入力したファイル名のファイルが

Quickfixで表示されます。

f:id:meison_amsl:20160117183557p:plain  

ファイル名で検索する時に便利です。

 

より快適にgrepするためのvimrc設定

コマンドラインからのgrepも同じですが、

あらかじめ検索するファイルを間引いておくと

より一層検索が早くなります。

 

自分の場合、

下記の設定をvimrcに追記することで、

.svn .gitフォルダを検索対象外にしたり、

バイナルファイルやバックアップファイルを

検索しないようにしています。

let Grep_Skip_Dirs = '.svn .git'  "無視するディレクトリ
let Grep_Default_Options = '-I'   "バイナルファイルがgrepしない
let Grep_Skip_Files = '*.bak *~'  "バックアップファイルを無視する

jvgrepを使う

上記の記事を書いた頃は、

Linux,Macのデフォルトのgrepと、

WindowsではGit for windowsのgrepを使っていましたが、

日本語のgrepなどをしたくなったので、

今月のsoftware designで紹介されていた

ソフトウェアデザイン 2016年 05 月号 [雑誌]

ソフトウェアデザイン 2016年 05 月号 [雑誌]

jvgrepを導入しました。

github.com

 

jvgrepはgo製のツールで、

日本語のgrepが簡単にできたり、

検索が高速であることが特徴のようです。

 

使い方としては、

下記の方法でjvgrepをインストールして、

あとは下記の.vimrc設定をすることで、

jvgrepが利用できる時は、

grepがjvgrepに置き換えられます。

if executable('jvgrep')
  set grepprg=jvgrep
endif

Macでのインストール

brewで一発です。

$ brew install jvgrep

Ubuntuでのインストール

goをインストールして

ソースからコンパイルしてもよかったですが、

goのインストールが面倒だったので、

自分は下記のリンクから

Linux用バイナリをDLして、

/usr/binにおいて置いてしまいました。

Releases · mattn/jvgrep

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com