lgrep y rgrep en Emacs
(6)
Estoy teniendo problemas con los greps 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) Usando rgrep obtengo 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 el GNU W32 Utils (grep, find, xargs, etc.). Grep v2.5.3 y encuentra v4.2.20.
¿Qué me estoy perdiendo?
ACTUALIZAR:
Lástima que uno no puede aceptar respuestas múltiples ... ya que la solución a mis problemas está dispersa.
grep -i -nH "global" *.c *.h
Esto resuelve el primer problema. Gracias luapyad!
(setq find-program "c://path//to//gnuw32//find.exe")
emacs estaba usando Windows find.exe. Forzar el hallazgo gnu32 solucionó el segundo problema. Gracias scottfrazer.
Sin embargo, todavía me gusta ack mejor.
Normalmente solo uso Mx grep
y alterno los argumentos de línea de comando cuando se me solicita si es necesario. Pero solo intenté ejecutar Mx lgrep
y obtuve lo mismo que tú. Simplemente significa que ningún archivo coincide con *.[ch]
en el directorio actual. Puede personalizar las opciones predeterminadas para incluir -r
y buscar recursivamente a través de directorios secundarios también:
M-x customize-group RET grep RET
Busque lgrep en ese búfer para buscar / editar la plantilla de Grep.
En lo que respecta a Mx rgrep
, sospecho que tiene algo que ver con la versión de Windows de que no me gusten 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.
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 de uno de los Utilities de GNU W32. Tratar:
(setq find-program "c://path//to//gnuw32//find.exe")
Creo que el problema general es que windows cmd "shell" se comporta de manera muy diferente a un shell unix con respecto a las expresiones regulares de expansión de archivos y comodines.
Para responder a su (a) anterior intente usar:
grep -i -nH "global" *.c *.h
(Aún obtendrá un "argumento inválido" si no existen * .c''s o * .h''s).
O puede usar la opción de línea de comando --include=/*.[ch]
para hacer que Windows grep haga una coincidencia de patrón de nombre de archivo "apropiada" (ver grep --help
para otras opciones)
Descubrí que usar:
(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ías tener un espacio alrededor del camino y lo estropearás eventualmente.
Observe que utilicé los dos programas en mi archivo .emacs
.
Espero que sea de alguna ayuda para algún otro programador que lo necesite;)
Vale la pena expandir el comentario de Adam Rosenfield a una respuesta:
grep -r --include=/*.[ch] --exclude=/*{CVS,.svn,arch} -i -nH
Para que el ejemplo dado en esta pregunta funcione, usa esto:
grep -i -nH --include=/*.[ch] "global" *
También es útil configurar la variable grep-command
proporciona los valores predeterminados a Mx grep
:
(setq grep-command "grep -i -nH --include=/*.[ch] ")
También aquí hay algunos otros parámetros de línea de comando útiles para grep:
-n print the line number
-s suppress error messages
-r recursive