[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51. 全文検索 ― 日本語 grep (2010/07/22)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=japanease%20grep"
"MeadowMemo/全文検索―日本語grep"へのコメント(無し)
検索全文Elisp


この章で紹介していること

前の章までで紹介した isearch や occur は,検索したいファイルを Meadow で開いてい る必要があります.しかし,どのファイルに目的の箇所があるか分からない場合に,いち いちすべて開いて検索していくのも面倒です.そこで, grep というコマンドがあります. これは,多数のファイルを検索することができるコマンドです.

そこで,ここでは grep の使い方や様々なカスタマイズを紹介します.

Cygwin をインストールできない環境の時に, grep や grep-find と同等のことをしたい 時には,当サイトオリジナルの color-moccur の moccur-grep と moccur-grep-find を利用できます.サブディレクトリのファイルも外部コマンド無しで 検索できます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51.1 grep の使い方 (2005/11/22)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=grep%20usage"
"MeadowMemo/grepの使い方"へのコメント(無し)
検索全文Elisp

grepを実行するためには,grep コマンドが必要です.この grep コマンドは Cygwin に含まれています.そのため, Cygwin がインストールされていれ ば,利用できます.

grep の起動は M-x grep とします.すると,ミニバッファに

Run grep (like this): grep -n -e 

のように表示されます(設定や環境により実際の表示は変わります).ここで,

Run grep (like this): grep -n -e "meadow" *.*

のように入力します。すると、「 meadow 」という語を「*.*」にファイル名が一致するファ イル (*は何らかの文字を表す。つまり、「*.*」で soft.html や mylisp.el などを検索でき ることになる) を検索します。

これを実行すると

-*- mode: grep; default-directory: "~/www/soft/" -*-
Grep started at Tue Nov 22 20:35:28

grep -nH -e "meadow" *.*
abbrev.texi:486:@c category meadow
abbrev.texi:1229:<URL:http://www.ysnb.net/meadow/> を見てください」とかが簡単に書けるわけだ.
admini.texi:361:~/w/s/m.h [TAB] で ~/www/soft/meadow.html という風にファイル名を補完してくれるも

のように結果が表示されます.ただし,検索対象となるのは,現在,カーソルがあるバッ ファで C-x C-f とした時に表示されるディレクトリ内にあるファイルのみです.サ ブディレクトリは対象にはなりません.

後は見たい行にカーソルを持っていき,C-c C-c とします.これで,そのファイル の該当行へジャンプできます.また,n で検索に一致した行を次々と表示していく こともできます.前の項目は p で表示できます.これらのキーを入力すると,別ウィ ンドウにその該当箇所が表示されます.該当箇所を表示させないで,次の項目へ移動する 場合にはM-nM-pを使います(もちろん単純にカーソル移動を使っても構いま せん).

これで一致項目を表示していくと,山のようにバッファができてしまうので,C-x C-b でバッファ一覧を出し d で消すものに印をつけれ,xで消してしまい ましょう.

また、 grep バッファでは SPCBS で上下へスクロールできます。

C-c C-f とすると,カーソル移動だけで該当する行を別バッファに表示することが できます.詳しくは「51.1.2 grepの該当行を別ウィンドウに表示 (2005/11/22)」を参照ください.

51.1.1 サブディレクトリのファイルも検索 (2005/11/22)  
51.1.2 grepの該当行を別ウィンドウに表示 (2005/11/22)  



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51.1.1 サブディレクトリのファイルも検索 (2005/11/22)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=grep-find"
"MeadowMemo/サブディレクトリのファイルも検索"へのコメント(無し)
検索全文Elisp
要約

サブディレクトリのファイルも含めて該当するファイルをgrepで検索することができます.

何が問題なのか?

grepだけでは現在のディレクトリにあるファイルしか検索できません.このため,サブディ レクトリに複数のファイルを分けている場合などには,個々のディレクトリのファイルを 検索する必要があり面倒です.

何ができるのか?

サブディレクトリのファイルも検索できるようになります.

設定済み Meadow では

標準機能ですので,そのままで利用できます.

インストール方法

Cygwinが入っていて,Cygwinにパスが通っていれば,特に作業は不要です.

ただし,パスの順番には注意が必要です.9.3 Cygwin (2004/12/15) を参考にきちんと入れておく必要 があります.

設定方法

設定は必要ありません.ただし,環境によっては shell の設定が必要になるかもしれま せん.

詳しい使い方

サブディレクトリも対象にするには,M-x grep-find とします.

すると,

Run find (like this): find . -type f -print0 | xargs -0 -e grep -nH -e

のようにミニバッファに表示されますので,grepの時と同様に検索語を

Run find (like this): find . -type f -print0 | xargs -0 -e grep -nH -e "meadow"

のように入力します.これで,サブディレクトリからも検索することが可能になります.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51.1.2 grepの該当行を別ウィンドウに表示 (2005/11/22)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=grep%20followmode"
"MeadowMemo/grepの該当行を別ウィンドウに表示"へのコメント(無し)
検索全文Elisp
要約

grepの結果バッファでカーソルを移動させるだけで,その行を別ウィンドウに表示させる ことができます.

何が問題なのか?

grep を使うことで,一致箇所を一覧することができます.しかし,そこで表示されるの は一致した行だけなので,似たような行が複数あるとどこだか分かりません.

何ができるのか?

grep の結果バッファでカーソルを移動させると,別ウィンドウにバッファが作成され, 一致箇所が表示されます.

これにより,一致した箇所が分かりやすくなります.

設定済みMeadowでは

同様の機能を持つcolor-grepをインストールしてあります.

インストール方法

標準機能ですので,インストールは不要です.

設定方法

設定は不要です.

詳しい使い方

まず,grepで検索を行います.次に結果のバッファにカーソルを移動させます.

そして,C-c C-f と入力します.これで,カーソルを移動させると,その該当箇所 を別ウィンドウに表示させることができます.

ただし,調子にのって表示させていくと,後にたくさんバッファが残りますが.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51.2 日本語 grep − jVim 版 (2005/11/22)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=jvim%20grep"
"MeadowMemo/日本語grep−jVim版"へのコメント(無し)
検索全文Elisp

何が問題なのか?

Cygwin の grep では日本語が検索できません.このため,日本語を検索しても結果が一つ も表示されません.

何ができるのか?

jVim というテキストエディタがあります.これは, vim というエディタを Windows へ移 植したものです.これには,日本語が利用できる grep のバイナリも入ってます. grep.exe というファイルがそれです.このコマンドを使うことで,日本語のファイルも 検索できるようになります.

インストール方法は?

JVim から JVim 3.x をダウンロー ドしてきます.そして,解凍後,含まれている grep.exe を Cygwin の grep と置き換え ます.そのために c:/cygwin/bin/ にコピーして,上書きするだけです.上書きするのに 抵抗がある場合には,別の名前でコピーしておくといいでしょう.

設定方法は?

以下を .emacs に追加します.コマンドの名前を変えた場合にはコマンド名を変えておき ます.「-K SSE」の部分は文字コードの設定で環境に合わせて設定が必要になってきます.

 
(setq find-grep-options "-s -q -K SSE ")
(setq grep-command "grep -n -K SSE -e ")

詳しい使い方は?

Meadow を再起動後, M-x grep とすると,

Run grep (like this): grep -n -K SEE -e

と出れば設定は問題ありません. 後は, 続けて検索したい文字とマスクを入力します.

例えば, 「キーバインド」という文字を拡張子が texi のファイルに対して検索したけれ ば,

Run grep (like this): grep -n -K SEE -e "キーバインド" *.texi

とします. もちろん, 正規表現も可能です. そうすると,

cd c:/home/soft/
grep -n -K SEE -e "キーバインド" *.texi NUL
meadow.texi:4:@c kindex -> キーバインド
meadow.texi:186:キーバインドが特殊である

grep finished (matches found) at Fri Oct 11 23:08:47



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51.3 文字コードを自動判別する grep − lgrep (2005/11/22)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=lgrep"
"MeadowMemo/文字コードを自動判別するgrep−lgrep"へのコメント(2007/12/28)
検索全文Elisp

何が問題なのか?

Cygwin の grep は日本語が検索できないし, jVim の grep は文字コードの設定が繁雑.そこで, もっと簡単に日本語を検索できるようになったものが, lgrep です.

何ができるのか?

日本語の検索が可能

インストール方法は?

jVim 附属の grep よりも便利なのが lgrep です.これは, lv という日本語などを表示 できる less に附属しています.

LV Homepage よりダウンロード し,解凍後,以下のようにしてコンパイルします.コンパイルには Cygwin が必要になり ます.

 cd lv4494/src
 ./configure
 make

こうすると, lv.exe というファイルができますので,これを パスの通ったところへコ ピーします.さらに, lv.exe を lgrep.exe と改名し,同じところへコピーしておきま す.

設定方法は?

.emacs には,以下のように設定しておきます.検索結果の文字が化けるようであれば,- Oe の e を LV Homepage を参 考に適当な文字コードに変えてください.

 
(setq grep-command "lgrep -n -Oe ")
(setq grep-program "lgrep")

これがうまくいかないようなら,

 
(setq grep-command "lgrep -n -As ")
(setq grep-program "lgrep")

も試してみてください.

-A はすべての文字コードを指定します.-O なら出力の文字コードのみを指定します.

また,「 j 」が JIS ,「 e 」が EUC ,「 s 」が Shift-jis ,「 u 」がユニコード,「 u7 」が UTF-7 , 「 u8 」が UTF-8 になります.

うまく動かないようなら,「-A 」や「-O 」の後の「 e 」や「 s 」をいろいろと変更してみて ください.

詳しい使い方は?

通常通り, grep をすると日本語でも検索できます. grep の詳しい使い方は 51.2 日本語 grep − jVim 版 (2005/11/22) をどうぞ.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51.4 grep の一致項目に色付け,絞り込み ― color-grep (2007/11/07)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=color-grep"
"MeadowMemo/grepの一致項目に色付け,絞り込み―color-grep"へのコメント(無し)
検索全文Elisp

注意事項

Meadow 2.20 では利用できません。

何が問題なのか?

grep の検索結果では,C-c C-c で該当箇所へジャンプすることができます.

だけど,どこが一致したのかは,ぱっと見ては分かりません.その行から,自分で探す必 要があります.ここで,一致箇所の色が変わったら便利です.

さらに,C-c C-c で一致したファイルを検索結果を行き来するのも面倒です.カー ソルを上下に移動させるだけで,ファイルの該当箇所が表示されたら便利です.

何ができるのか?

こんな風に,一致箇所に色がつきます.

検索結果でカーソルを移動させるだけで,ファイルの該当箇所が表示されるようになりま す.

インストール方法は?

color-grep.el をダウンロードして ください.そして,このファイルをロードパスの通ったところへ置きます.

設定方法は?

以下を,.emacs に追加します. require 以外の行は好みで変えてください.

 
(require 'color-grep)
;; grep バッファを kill 時に,開いたバッファを消す
(setq color-grep-sync-kill-buffer t)

詳しい使い方は?

M-x grep として普通に使うだけです.

カーソル移動だけで,ファイルの該当箇所が表示されます.この機能は,C-c C-s でオン・オフできます.

そうすると,たくさんバッファが開かれてしまいますが, color-grep-sync-kill-buffer が t になっていると, grep の結果バッファを kill した際や grep を連続して行った際 に,開いたバッファはすべて消してくれます.もちろん,編集中のバッファは消しません し, grep を実行する前からあったバッファも消しません.

さらに, grep の結果バッファで M-r とすると,検索に一致したファイルのみで再 度 grep をして絞り込むことができます.

更新履歴



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51.5 grep を便利にしたい ― igrep (2005/11/22)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=igrep"
"MeadowMemo/grepを便利にしたい―igrep"へのコメント(無し)
検索全文Elisp

何ができるのか?

grep や grep-find と比べると以下の点で優れています.

要は基本的には grep/grep-find で,その操作性を少し良くしたものです.

設定済みMeadowでは

設定してあります.

インストール方法は?

Emacs Lisp List などから ダウンロードし,ロードパスの通ったところへ置きます.

設定方法は?

以下を .emacs に追加します

 
(autoload 'igrep "igrep"
  "*Run `grep` PROGRAM to match EXPRESSION in FILES..." t)
(autoload 'igrep-find "igrep"
  "*Run `grep` via `find`..." t)
(autoload 'dired-do-igrep "igrep"
  "*Run `grep` on the marked (or next prefix ARG) files." t)
(autoload 'igrep-insinuate "igrep"
  "Define `grep' aliases for the corresponding `igrep' commands." t)
(autoload 'igrep-visited-files "igrep"
  "*Run `grep` ... on all visited files." t)
(autoload 'dired-do-igrep-find "igrep"
  "*Run `grep` via `find` on the marked (or next prefix ARG) directories." t)
(autoload 'Buffer-menu-igrep "igrep"
  "*Run `grep` on the files visited in buffers marked with '>'." t)

;; 以下は lgrep を使うための設定
(setq igrep-program "lgrep")
(setq igrep-expression-option "-n -Oe")

これで使うことができます.

詳しい使い方は?



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51.6 メモを grep ― mgrep (2004/02/03)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=mgrep"
"MeadowMemo/メモをgrep―mgrep"へのコメント(2007/12/28)
検索全文Elisp

何が問題なのか?

grep でファイルを検索している人は多いと思います.

しかし,検索するファイルのあるディレクトリはいつも同じじゃないですか? そのたびに, そのディレクトリを開いたりするのは面倒ではないですか?

メモや情報のあるディレクトリなんて,そんなに変わるものではありませんよね.だった ら,あらかじめどこに情報があるか設定できた方が楽です.

何ができるのか?

最初に,検索したいディレクトリや検索したいファイル名を指定しておき,名前をつけて おきます.例えば,個人の設定ファイルを検索するために「 conf 」という名前で, 「 ~/mylisp 」下の「*.el 」というファイルを検索したいとしましょう.

grep なら,「 ~/mylisp 」のファイルを開いたりしてから,検索したい文字と *.el を 入力する必要があります.

M-x mgrep を使うと,もっと簡単に「 ~/mylisp 」のファイルを検索することがで きます.

インストール方法は?

mgrep.el よりダウンロードし,ロード パスの通ったところへ置きます.

設定方法は?

以下を参考に設定を.emacs に追加します.

 
(require 'mgrep)
(setq mgrep-list
      '(
        ;; name directory file find
        ("site" "e:/unix/Meadow2/1.99a6/site-lisp" "*.el" t)
        ("mylisp" "~/mylisp" "*.el" nil)
        ("texi" "~/www/soft" "*.texi" nil)
        ("2ch" "~/navi2ch/html/" "*.html" sub)
        ("find2ch" "~/navi2ch/html/" "*.html" subfind)
        ))

この mgrep-list に設定する値が検索したいファイルのあるディレクトリ指定になります.

詳しい使い方は?

M-x mgrep とします.そうすると,ミニバッファにカーソルが移動します ので,ここで,「 mylisp 」などの名前を入力します.

次に,検索したい文字を入力します.これで,そのディレクトリのファイルを検索できま す.

コメント

私は使ってますが,時々エラーが出ます.また,環境によっては動かないかもしれません.

更新履歴

mgrep の変更履歴



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51.7 grep の検索結果画面 (2010/07/22)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=grep%20buffer"
"MeadowMemo/grepの検索結果画面"へのコメント(無し)
検索全文Elisp

ここでは grep の検索結果画面関連の設定について紹介します.

まずは紹介しているものの比較を書いておきます.ただし,私は grep-edit の作者であ り,多少贔屓目になってしまうかもしれません.

51.7.1 grep の検索結果を直接編集する ― grep-edit (2010/07/22)  
51.7.2 検索結果で置換 ― globrep (2008/03/08)  



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51.7.1 grep の検索結果を直接編集する ― grep-edit (2010/07/22)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=edit%20grep"
"MeadowMemo/grepの検索結果を直接編集する―grep-edit"へのコメント(2007/12/28)
検索全文Elisp

注意事項

古い Meadow では利用できません

何が問題なのか?

多数のファイルにある文字を置換したい時,いちいちファイルを開いて該当箇所があるか 探すのも面倒です.

かといって, grep で検索しても,結局はいくつかのファイルを開いて,編集していくこ とになり,面倒です.

だったら, grep の結果を直接編集して,それをファイルへ適用できたら,ずっと楽になり ます.

何ができるのか?

grep の検索結果を編集し,その結果をファイルに適用することができる.

インストール方法は?

grep-edit.el をダウン ロードし,ロードパスの通ったところへ置きます.

設定方法は?

以下を.emacs に追加します.

 
(require 'grep-edit)

詳しい使い方は?

M-x grepで検索後, grep のバッファを編集できます.編集すると,編集した箇所 の色が変わります.編集が終わったら,C-c C-e とすると色のついた変更のみが適 用されます.変更の破棄は,C-c C-u でできます.また,適用したくない変更をリー ジョンで選択し, C-c C-r とすると,リージョン内の変更のみを破棄できます.

この変更の適用時にはバッファの保存はしていません.保存前に正しく変更されているか 確認してから保存してください.変更箇所は色を変えてますので,簡単に見つかると思い ます.

エラー処理などはほとんどしていませんので,注意して使ってください.

更新履歴



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

51.7.2 検索結果で置換 ― globrep (2008/03/08)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=globrep"
"MeadowMemo/検索結果で置換―globrep"へのコメント(無し)
検索全文Elisp

要約

grep の検索結果バッファを置換し,ファイルに適用できる

何ができるのか?

grep をして検索結果の画面から置換を行うことができます.

インストール方法

globrep.el.txt(globrep.el の名前で保存) と query.elをダウンロー ドし,ロードパスの通ったところへ置きます.

設定方法

以下を.emacs に追加します.

 
(autoload 'global-replace-lines "globrep"
  "Put back grepped lines" t)
(autoload 'global-replace "globrep"
  "query-replace across files" t)
(autoload 'global-grep-and-replace "globrep"
  "grep and query-replace across files" t)

詳しい使い方

grep をした後で,*grep*バッファに移動し,M-x global-replaceとします.すると, 置換する言葉を聞かれますので入力します.その後,一行一行確認しながら,置換してい きます.M-%と同じような動作をします.

ただし,置換対象がなくても,確認する必要があります.これが面倒で,かなり使い勝手 が悪いです.

また、あらかじめ grep バッファを編集し、M-x global-replace-linesとすると、そ の編集を適用してくれます。これも、一行一行確認しながら、適用していきます。変更し ていない行も確認しなければなりません。


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]