ripgrep 20170211.857(in MELPA)
Front-end for ripgrep, a command line search tool

概要

ripgrep.el は、超高速grepことripgrep(rg) のEmacsインターフェースです。
<2016-10-02 Sun>現在、MELPAに登場したばかりの出来立てほやほやですが、十分便利に使えます。
現時点においてM-x ripgrep-regexpのみがコマンドとして使えます。

M-x ripgrep-regexpを実行すると、正規表現と検索対象のディレクトリを聞いてきます。
するとM-x grep同様に正規表現にマッチした行が出力されます。

rgはWindowsバイナリも配布されていますので、Windowsユーザにとっても嬉しいのではないでしょうか?

20161002091001.png
Fig1: M-x ripgrep-regexp

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてripgrepを使う方は
以下のコマンドを実行します。

M-x package-install ripgrep

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name ripgrep

ripgrepとは

ripgrepとは、2016年9月に登場したばかりの超高速grepです。
その速度は目をみはるほどで、高速grepと名高いthe_silver_searcher(ag) をもはるかに凌ぐほどです!!
しかもagのように不要なファイル検索をしないし、GNU grepの高速性をも兼ね備えています。
開発して間がないですが、すでにたくさんのオプションを持っていて、乗り変えを検討してもいいと思います。

なぜ高速かというと、ripgrepがRust で書かれているからです。
Rustは安全性、速度、並行性にフォーカスしたシステムプログラミング言語であることに加え、
Rustの正規表現エンジンが超高速であることです。
Rustに興味がある方は日本語の解説ページ があります。
ripgrepのベンチマークについては作者の記事 があります。

ripgrepをインストールする

ripgrepはLinux/Mac/Windowsバイナリが配布されていますので、
Rustの開発環境をインストールする必要はありません。
<2016-10-02 Sun>現在毎日のようにリリースされています!
やばいです。

https://github.com/BurntSushi/ripgrep/releases
からバイナリをダウンロードしてください。

Windowsの方はMinGW(gnu)かMSVCのどちらかのバイナリを選べます。
MSVC版を使う場合はMicrosoft Visual C++ Build Tools をインストールする必要があります。

見よ、この速さ!

Linuxカーネルツリーで検索したところ、agの3倍も速いっ!!

https://github.com/BurntSushi/ripgrep より

Tool Command Line count Time
ripgrep rg -n -w '[A-Z]+_SUSPEND' 450 0.245s
The Silver Searcher ag -w '[A-Z]+_SUSPEND' 450 0.753s
git grep LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND' 450 0.823s
git grep (Unicode) LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND' 450 2.880s
sift sift --git -n -w '[A-Z]+_SUSPEND' 450 3.656s
The Platinum Searcher pt -w -e '[A-Z]+_SUSPEND' 450 12.369s
ack ack -w '[A-Z]+_SUSPEND' 1878 16.952s

おすすめオプション

「-S」オプションは大文字小文字の区別において空気読んでくれます。
すべてが小文字ならば大文字小文字区別せず、大文字が含まれていれば区別するようになります。

「--no-heading」オプションはgrep形式の出力となります。
実際ripgrep.elでも使われています。

設定 161002090545.ripgrep.el(以下のコードと同一)

;;; rgバイナリの位置
(setq ripgrep-executable "~/.cargo/bin/rg")
;;; rgに渡すオプション
(setq ripgrep-arguments '("-S"))

実行方法

$ wget http://rubikitch.com/f/161002090545.ripgrep.el
$ emacs -Q -f package-initialize -l 161002090545.ripgrep.el

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。