2009-02-17 8 views
6

Ich habe Probleme mit den Greps in Emacs.lgrep und rgrep in Emacs

a) grep scheint das. [Ch] nicht zu verstehen, um .c und .h Dateien zu suchen. Dies ist eine Standardoption, die von Emacs mit dem Befehl lgrep bereitgestellt wird. Das Beispiel sucht nach dem Wort "global" in .c/.h Dateien.

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 

Ist dieses Format nicht gültig?

b) Mit rgrep ich die folgende Fehlermeldung erhalten:

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 

Ich benutze Emacs 22.3.1 unter Windows XP mit dem GNU-W32 Utils (grep, find, xargs etc.). Grep v2.5.3 und finden v4.2.20.

Was fehlt mir?

UPDATE:

Schade, man kann nicht mehrere Antworten akzeptieren ... da die Lösung für meine Probleme ausgebreitet sind.

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

Dies löst das erste Problem. Danke Luapyad!

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

Emacs war in der Tat mit dem Windows find.exe. Das Erzwingen des Gnu32-Fundes hat das zweite Problem behoben. Danke Scottfrazer.

Allerdings mag ich immer noch ack am besten.

+1

Eine einfachere Art und Weise rgrep zu verwenden ist: grep -r --include = \ * [ch] --exclude = \ */{CVS. , .svn, arch, .hg, _darcs, .git, .bzr} -i -nH global. –

+1

Könnten Sie Ihren Beitrag so ändern, dass er die Antwort für das Suchprogramm genau wiedergibt? Du hast mir heute Schwierigkeiten bereitet. Der Unterschied besteht in der Notwendigkeit von doppelten Backslashes. (Setq Find-Programm "C: \\ Pfad \\ zu \\ gnuw32 \\ find.exe") –

+0

@Matthew Talbert, ich denke, dass der Markdown-Prozessor die zusätzlichen Backslashes schluckte. Ich habe eine Bearbeitung eingereicht, um das zu beheben. – Alan

Antwort

5

Nun, es verwenden ist immer Ack und Ack.el

+0

Doh! Ich habe Ack total vergessen! Liebe es in Vim. Vielen Dank! – cschol

1

Normalerweise verwende ich einfach M-x grep und ändere die Befehlszeilenargumente, wenn ich dazu aufgefordert werde. Aber ich habe gerade versucht, M-x lgrep laufen und habe das gleiche wie Sie. Es bedeutet einfach, dass keine Dateien *.[ch] im aktuellen Verzeichnis entsprechen. Sie können die Standardoptionen anpassen -r aufzunehmen und auch rekursiv durch geordneten Verzeichnissen suchen:

M-x customize-group RET grep RET 

Suche nach lgrep in diesem Puffer bearbeiten/finden die Grep Vorlage.

Soweit M-x rgrep geht, vermute ich, dass es etwas mit der Windows-Version von find nicht zu tun hat, die Standardoptionen zu mögen. Dieser Befehl funktioniert gut für Linux. Suchen Sie im selben Puffer nach rgrep und optimieren Sie diese Optionen, bis die Windows-Suche glücklich ist.

Tut mir leid, ich kann nicht mehr Hilfe mit den Windows-Optionen sein, aber ich kenne sie nicht.

5

Für a) sieht es so aus, als gäbe es einfach keine .c oder .h Dateien im aktuellen Verzeichnis.

Für b) Windows versucht, einen eigenen Fund anstelle des GNU W32 Utils zu verwenden. Versuchen:

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

+0

Das hat mir heute geholfen. Vielen Dank! –

2

denke ich, das allgemeine Problem ist die Fenster cmd "Shell" verhält sich sehr unterschiedlich auf eine Unix-Shell in Bezug auf Dateinamen Expansion regexps und Platzhalter.

Um die (a) oben Versuch zu beantworten mit:

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

(Sie werden nach wie vor ein "ungültig Argument", wenn keine * .c oder die * .h des existieren bekommen).

Oder können Sie Befehlszeilenoption --include=\*.[ch] zu windows grep machen Sie „richtige“ Dateiname Musterabgleich (siehe grep --help für andere Optionen)

3

Adam Rosenfield Kommentar ist wert in einer Antwort erweitert:

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

Um das Beispiel in dieser Frage Arbeit gegeben zu machen, verwenden Sie diese:

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

Es ist auch hilfreich, um die Variable grep-command bietet standardmäßig M-x grep einzustellen:

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

Auch einige andere nützliche Kommandozeilenparameter grep sind hier:

-n print the line number 

-s suppress error messages 

-r recursive 
6

ich herausgefunden, dass Verwendung:

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

Funktioniert besser in Fenstern, da Sie einen Platz haben könnten, der den Pfad umgibt und schließlich versauen wird.

Beachten Sie, dass ich die beiden Programme in meiner Datei .emacs verwendet habe.

Hoffe, es ist eine Hilfe zu einem anderen Programmierer brauchen;)