| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
前の章までで紹介した isearch や occur は,検索したいファイルを Meadow で開いてい る必要があります.しかし,どのファイルに目的の箇所があるか分からない場合に,いち いちすべて開いて検索していくのも面倒です.そこで, grep というコマンドがあります. これは,多数のファイルを検索することができるコマンドです.
そこで,ここでは grep の使い方や様々なカスタマイズを紹介します.
Cygwin をインストールできない環境の時に, grep や grep-find と同等のことをしたい 時には,当サイトオリジナルの color-moccur の moccur-grep と moccur-grep-find を利用できます.サブディレクトリのファイルも外部コマンド無しで 検索できます.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
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-nやM-pを使います(もちろん単純にカーソル移動を使っても構いま せん).
これで一致項目を表示していくと,山のようにバッファができてしまうので,C-x C-b でバッファ一覧を出し d で消すものに印をつけれ,xで消してしまい ましょう.
また、 grep バッファでは SPC と BS で上下へスクロールできます。
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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
サブディレクトリのファイルも含めて該当するファイルをgrepで検索することができます.
grepだけでは現在のディレクトリにあるファイルしか検索できません.このため,サブディ レクトリに複数のファイルを分けている場合などには,個々のディレクトリのファイルを 検索する必要があり面倒です.
サブディレクトリのファイルも検索できるようになります.
標準機能ですので,そのままで利用できます.
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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
grepの結果バッファでカーソルを移動させるだけで,その行を別ウィンドウに表示させる ことができます.
grep を使うことで,一致箇所を一覧することができます.しかし,そこで表示されるの は一致した行だけなので,似たような行が複数あるとどこだか分かりません.
grep の結果バッファでカーソルを移動させると,別ウィンドウにバッファが作成され, 一致箇所が表示されます.
これにより,一致した箇所が分かりやすくなります.
同様の機能を持つcolor-grepをインストールしてあります.
標準機能ですので,インストールは不要です.
設定は不要です.
まず,grepで検索を行います.次に結果のバッファにカーソルを移動させます.
そして,C-c C-f と入力します.これで,カーソルを移動させると,その該当箇所 を別ウィンドウに表示させることができます.
ただし,調子にのって表示させていくと,後にたくさんバッファが残りますが.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
grep や grep-find と比べると以下の点で優れています.
要は基本的には grep/grep-find で,その操作性を少し良くしたものです.
設定してあります.
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") |
これで使うことができます.
普通の grep です.対話式なので,普通の grep よりは馴染みやすいです.
grep-find です.サブディレクトリまで検索することができます.検索するディレクトリ の補完もできるので,便利です.
dired で m によりマークをつけたものだけを対象に grep ができます.
dired-do-igrep の find 版です
今開いているファイルのみを対象に grep ができます.
C-x C-b でバッファリストを表示し,m でマークをつけてから,M-x Buffer-menu-igrep とすると,マークをつけたバッファのみを対象に grep ができます.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
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 に設定する値が検索したいファイルのあるディレクトリ指定になります.
4 番目が「 nil 」なら,「~/mylisp/」下のファイルのみ検索します.「 t 」なら,サ ブディレクトリのファイルも検索します (find を使うため,遅くなります) .
さらに,「 2ch 」の例のように「 sub 」を設定することもできます.
例えば,「~/navi2ch/html/」というディレクトリ下に「 os 」「 software 」「 unix 」「 english 」というディレクトリがあり,それぞれに大量のファイルがあるとします.
この場合に, find を使うと,それだけで時間がかかってしまいます.そこで,「 2ch 」の例のように「 sub 」という設定を使います.
そうすると,名前入力後にどのディレクトリを検索するか聞くようになります.そのため, 例えば,「~/navi2ch/html/os/」だけを検索するということが簡単にできます.設定も簡 単で済みます.
「 subfind 」は,「 sub 」の「 find 」版です.つまり,「~/navi2ch/html/os/」のサ ブディレクリも対象になります.
また,「 dir 」も指定できます.これを指定すると,指定したディレクトリを基点に検索 するディレクトリを,ファイルを開く際と同様の操作で指定することができます. find を 用いる「 dirfind 」もあります.
M-x mgrep とします.そうすると,ミニバッファにカーソルが移動します ので,ここで,「 mylisp 」などの名前を入力します.
次に,検索したい文字を入力します.これで,そのディレクトリのファイルを検索できま す.
私は使ってますが,時々エラーが出ます.また,環境によっては動かないかもしれません.
mgrep の変更履歴
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ここでは grep の検索結果画面関連の設定について紹介します.
まずは紹介しているものの比較を書いておきます.ただし,私は grep-edit の作者であ り,多少贔屓目になってしまうかもしれません.
まず grep バッファを編集して,それを適用するスタイル. grep バッファの変更は一気に適 用されるので,確認はない.
XEmacs では動かない
基本は置換.コマンドを実行すると,まず grep バッファが置換され,一行一行置換するか 確認される.
置換する必要のない行も確認される. XEmacs でも動く.
51.7.1 grep の検索結果を直接編集する ― grep-edit (2010/07/22) 51.7.2 検索結果で置換 ― globrep (2008/03/08)
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
古い 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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
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とすると、そ の編集を適用してくれます。これも、一行一行確認しながら、適用していきます。変更し ていない行も確認しなければなりません。
| [ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |