2009-02-17 11 views
6

Ho problemi con il greps in Emacs.lgrep e rgrep in Emacs

a) grep non sembra comprendere il [.] Ch per cercare i file .c e .h. Questa è un'opzione predefinita fornita da Emacs con il comando lgrep. L'esempio sta cercando la parola "globale" nei file .c/.h.

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 

Questo formato non è valido?

b) Utilizzando rgrep ottengo il seguente errore:

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 

Sto usando Emacs 22.3.1 su Windows XP con la GNU W32 Utils (grep, find, xargs ecc). Grep v2.5.3 e trova v4.2.20.

Cosa mi manca?

UPDATE:

Peccato non si può accettare più risposte ... dal momento che la soluzione ai miei problemi sono sparsi.

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

Questo risolve il primo problema. Grazie luapyad!

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

emacs stava effettivamente utilizzando il find.exe di Windows. Forzare il gnu32 trova risolto il secondo problema. Grazie scottfrazer.

Tuttavia, mi piace ancora ack migliore.

+1

Un modo più semplice per utilizzare rgrep è: grep -r --include = \ * [ch] --exclude = \ */{CVS. , .svn, arch, .hg, _darcs, .git, .bzr} -i -nH globale. –

+1

Potresti cambiare il tuo post per riflettere con precisione la risposta per il programma di ricerca? Mi hai fatto qualche problema oggi. La differenza è la necessità di doppie barre di sicurezza. (setq find-programma "C: \\ percorso \\ a \\ gnuw32 \\ find.exe") –

+0

@ Matthew Talbert, penso che il processore di markdown stava inghiottendo i backslash extra. Ho inviato una modifica per risolverlo. – Alan

risposta

5

Beh, c'è sempre Ack e Ack.el

+0

Doh! Ho completamente dimenticato Ack! Lo adoro in Vim. Grazie! – cschol

1

Di solito uso solo M-x grep e altero gli argomenti della riga di comando quando richiesto se è necessario. Ma ho appena provato a eseguire M-x lgrep e ho avuto la stessa cosa di te. Significa semplicemente che nessun file corrisponde a *.[ch] nella directory corrente. È possibile personalizzare le opzioni di default per includere -r e cercare ricorsivamente attraverso directory figlio così:

M-x customize-group RET grep RET 

Cerca lgrep in quel buffer per trovare/modificare il modello Grep.

Per quanto riguarda M-x rgrep, sospetto che abbia qualcosa a che fare con la versione Windows di find che non gradisce le opzioni predefinite. Quel comando funziona bene per me su Linux. Cerca rgrep nello stesso buffer di personalizzazione e modifica quelle opzioni fino a quando la ricerca di Windows non è felice.

Spiacente Non posso essere più di aiuto con le opzioni di Windows, ma non ho familiarità con loro.

5

Per a) sembra che non ci siano semplicemente file .c o .h nella directory corrente.

Per b) Windows sta tentando di utilizzare la propria ricerca anziché quella dagli GNU W32 Util. Prova:

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

+0

Questo mi ha aiutato oggi. Grazie! –

2

ritengo il problema generale è finestre CMD "shell" comporta molto diverso da un guscio unix rispetto alle espressioni regolari espansione dei nomi e jolly.

Per rispondere alla tua (a) provare a utilizzare:

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

(si continua a ottenere un "argomento non valido", se no * .c di o * .h di esistere).

Oppure si può utilizzare l'opzione della riga di comando --include=\*.[ch] per rendere le finestre grep non "corretto" modello nome del file corrispondente (vedi grep --help per altre opzioni)

3

Adam Rosenfield commento è pena l'espansione in una risposta:

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

Per rendere l'esempio dato in questo lavoro domanda, utilizzare questo:

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

E 'anche utile per impostare la variabile grep-command forniscono default M-x grep:

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

Anche qui ci sono alcuni altri parametri utili della riga di comando a grep:

-n print the line number 

-s suppress error messages 

-r recursive 
6

ho scoperto che utilizzando:

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

Funziona meglio in Windows, dal momento che potresti avere uno spazio attorno al percorso e alla fine rovinerai.

Avviso Ho usato i due programmi nel mio file .emacs.

Spero che sia di qualche aiuto a qualche altro programmatore ha bisogno;)