6

Emacs の grep に問題があります。

a) grep は、.c および .h ファイルを検索するための .[ch] を理解していないようです。これは、lgrepコマンドで Emacs によって提供されるデフォルトのオプションです。この例では、.c/.h ファイルで「global」という単語を検索しています。

grep -i -nH "global" *.[ch]
grep: *.[ch]: No such file or directory

Grep exited abnormally with code 2 at Mon Feb 16 19:34:36

このフォーマットは無効ですか?

b) rgrepを使用すると、次のエラーが表示されます。

find . "(" -path "*/CVS" -o -path "*/.svn" -o -path "*/{arch}" -o -path "*/.hg" -o -path "*/_darcs" -o -path "*/.git" -o -path "*/.bzr" ")" -prune -o  -type f "(" -iname "*.[ch]" ")" -print0 | xargs -0 -e grep -i -nH "global"
FIND: Wrong parameter format

Grep finished (matches found) at Mon Feb 16 19:37:10

Windows XP で Emacs 22.3.1 を GNU W32 Utils (grep、find、xargs など) とともに使用しています。v2.5.3 を grep し、v4.2.20 を見つけます。

私は何が欠けていますか?

アップデート:

残念ながら、複数の回答を受け入れることはできません...私の問題に対する解決策が分散しているためです。

grep -i -nH "global" *.c *.h

これにより、最初の問題が解決されます。ありがとうございます!

(setq find-program "c:\\path\\to\\gnuw32\\find.exe")

emacs は確かに Windows の find.exe を使用していました。gnu32 find を強制すると、2番目の問題が修正されました。ありがとうスコットフレイザー。

しかし、私は今でもackが一番好きです。

4

6 に答える 6

6

私はそれを使用してそれを見つけました:

(setq find-program "\"C:/path/to/GnuWin32/bin/find.exe\"")
(setq grep-program "\"C:/path/to/GnuWin32/bin/grep.exe\"")

パスの周りにスペースがあり、最終的に台無しになる可能性があるため、ウィンドウでより適切に機能します。

.emacsファイルで 2 つのプログラムを使用したことに注意してください。

困っている他のプログラマーの助けになれば幸いです;)

于 2010-11-13T21:43:34.780 に答える
5

a) の場合、現在のディレクトリに .c または .h ファイルがないように見えます。

b) Windows は、GNU W32 Utils からのものではなく、独自の検索を使用しようとしています。試す:

(setq find-program "c:\\path\\to\\gnuw32\\find.exe")

于 2009-02-17T04:30:21.490 に答える
5

まあ、AckAck.elは常にあります。

于 2009-02-17T09:17:06.480 に答える
4

Adam Rosenfield のコメントは、回答に拡張する価値があります。

grep -r --include=\*.[ch] --exclude=\*{CVS,.svn,arch} -i -nH

この質問の例を機能させるには、次を使用します。

grep -i -nH --include=\*.[ch] "global" *

grep-commandデフォルトを提供する変数を次のように設定することも役立ちますM-x grep

(setq grep-command "grep -i -nH --include=\*.[ch] ")

また、grep のその他の便利なコマンド ライン パラメータを次に示します。

-n print the line number

-s suppress error messages

-r recursive
于 2009-02-17T23:12:42.820 に答える
2

一般的な問題は、ファイル名展開の正規表現とワイルドカードに関して、Windows コマンド「シェル」の動作が UNIX シェルとは大きく異なることだと思います。

上記の(a)に答えるには、次を使用してみてください。

grep -i -nH "global" *.c *.h

(*.c または *.h が存在しない場合でも、「無効な引数」が返されます)。

または、コマンド ライン オプション--include=\*.[ch]を使用して、Windows grep に「適切な」ファイル名パターン マッチングを実行させることもできます (grep --help他のオプションについては、を参照してください)。

于 2009-02-17T05:09:34.097 に答える
1

通常、M-x grep必要に応じてプロンプトが表示されたら、コマンドライン引数を使用して変更します。しかし、私は走ってみてM-x lgrep、あなたと同じものを得ました。*.[ch]これは単に、現在のディレクトリに一致するファイルがないことを意味します。デフォルトのオプションをカスタマイズして、-r子ディレクトリを含めて再帰的に検索することもできます。

M-x customize-group RET grep RET

そのバッファーで lgrep を検索して、Grep テンプレートを見つけて編集します。

これまでのところ、デフォルト オプションM-x rgrepが気に入らないという Windows バージョンと関係があるのではないかと思います。findこのコマンドは、Linux でうまく機能します。同じカスタマイズ バッファで rgrep を検索し、Windows の検索結果が満足するまで、これらのオプションを微調整します。

申し訳ありませんが、Windows のオプションについてこれ以上詳しく説明することはできませんが、私はそれらに精通していません。

于 2009-02-17T03:39:26.497 に答える