2009-02-17 27 views
6

Tengo problemas con los greps en Emacs.lgrep y rgrep en Emacs

a) grep no parece entender el. [Ch] para buscar archivos .c y .h. Esta es una opción predeterminada proporcionada por Emacs con el comando lgrep. El ejemplo es buscar la palabra "global" en archivos .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 

¿Este formato no es válido?

b) El uso de rgrep me sale el siguiente error:

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 

estoy usando Emacs 22.3.1 en Windows XP con la GNU W32 Utilidades (grep, find, xargs etc.). Grep v2.5.3 y encuentra v4.2.20.

¿Qué me estoy perdiendo?

ACTUALIZACIÓN:

Lástima que no se puede aceptar múltiples respuestas ... ya que la solución a mis problemas se extendió a cabo.

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

Esto soluciona el primer problema. Gracias luapyad!

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

emacs estaba utilizando Windows find.exe. Forzar el hallazgo gnu32 solucionó el segundo problema. Gracias scottfrazer.

Sin embargo, todavía me gusta ack mejor.

+1

Una forma más sencilla de usar rgrep es: grep -r --include = \ * [ch] --exclude = \ */{CVS. , .svn, arch, .hg, _darcs, .git, .bzr} -i -nH global. –

+1

¿Podría cambiar su publicación para reflejar con precisión la respuesta para find-program? Me causaste algunas dificultades hoy. La diferencia es la necesidad de barras diagonales dobles. (set-find-program "C: \\ path \\ to \\ gnuw32 \\ find.exe") –

+0

@Matthew Talbert, creo que el procesador de reducción se estaba tragando las barras invertidas adicionales. Envié una edición para arreglar eso. – Alan

Respuesta

5

Bueno, siempre hay Ack y Ack.el

+0

¡Doh! ¡Me olvidé por completo de Ack! Me encanta en Vim. ¡Gracias! – cschol

1

Normalmente uso M-x grep y modifico los argumentos de línea de comando cuando se me solicita si es necesario. Pero intenté ejecutar M-x lgrep y obtuve lo mismo que tú. Simplemente significa que ningún archivo coincide con *.[ch] en el directorio actual. Puede personalizar las opciones por defecto para incluir -r y buscar de forma recursiva a través de directorios secundarios, así:

M-x customize-group RET grep RET 

Buscar lgrep en ese búfer para encontrar/editar la plantilla Grep.

En cuanto a M-x rgrep va, sospecho que tiene algo que ver con la versión de Windows de find que no le gusta las opciones predeterminadas. Ese comando funciona bien para mí en Linux. Busque rgrep en ese mismo búfer de personalización y ajuste esas opciones hasta que el hallazgo de Windows sea satisfactorio.

Lo siento, no puedo ser más útil con las opciones de Windows, pero no estoy familiarizado con ellas.

5

Para a) parece que simplemente no hay archivos .c o .h en el directorio actual.

Para b) Windows está tratando de usar su propio hallazgo en lugar del de los Utilitarios de GNU W32. Proveedores:

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

+0

Esto me ayudó hoy. ¡Gracias! –

2

creo que el problema general es las ventanas CMD "cáscara" se comporta de manera muy diferente a un shell de Unix con respecto a las expresiones regulares de expansión de nombre de archivo y comodines.

para responder a sus (a) anterior intento usando:

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

(Usted seguirá recibiendo un "argumento no válido" si no * * de .c o .h de existir).

O opción de línea de comandos --include=\*.[ch] se puede utilizar para hacer ventanas grep do "adecuada" patrón de nombres correspondiente (ver grep --help para otras opciones)

3

Adam Rosenfield comentario es vale la expansión en una respuesta:

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

Para que el ejemplo dado en este trabajo pregunta, utilice esto:

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

También es útil para establecer la variable grep-command que proporcionan valores por defecto a M-x grep:

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

También aquí están algunos otros parámetros de línea de comandos útiles para GREP:

-n print the line number 

-s suppress error messages 

-r recursive 
6

descubrí que utilizando:

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

Funciona mejor en ventanas, ya que podría tener un espacio alrededor del camino y se estropeará eventualmente.

Aviso Utilicé los dos programas en mi archivo .emacs.

espero que sea de alguna ayuda para algún otro programador que lo necesiten;)