読者です 読者をやめる 読者になる 読者になる

MyEnigma

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

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

Vim

grep Pocket Reference (Pocket Reference (O'Reilly))

grep Pocket Reference (Pocket Reference (O'Reilly))

目次

 

はじめに

自分は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

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

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

grep Pocket Reference (Pocket Reference (O'Reilly))

grep Pocket Reference (Pocket Reference (O'Reilly))