lgrep и rgrep в Emacs - PullRequest
       13

lgrep и rgrep в Emacs

6 голосов
/ 17 февраля 2009

У меня проблемы с greps в Emacs.

a) grep, похоже, не понимает. [Ch] для поиска файлов .c и .h. Это опция по умолчанию, предоставляемая Emacs командой lgrep . Пример ищет слово «global» в файлах .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

Этот формат недействителен?

б) Используя 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

Я использую Emacs 22.3.1 в Windows XP с утилитами GNU W32 (grep, find, xargs и т. Д.). Grep v2.5.3 и найти v4.2.20.

Чего мне не хватает?

UPDATE:

Жаль, что нельзя принять несколько ответов ... так как решение моих проблем разбросано.

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

Это решает первую проблему. Спасибо, Луапяд!

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

emacs действительно использовал Windows find.exe. Заставить gnu32 найти исправить вторую проблему. Спасибо Скоттфразер.

Однако мне все еще нравится ack best.

Ответы [ 6 ]

6 голосов
/ 14 ноября 2010

Я узнал, что с помощью:

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

Работает лучше в окнах, так как у вас может быть пространство, лежащее вокруг дорожки, и вы в конечном итоге облажаетесь.

Обратите внимание, что я использовал две программы в моем файле .emacs.

Надеюсь, это поможет другому программисту;)

5 голосов
/ 17 февраля 2009

Ну всегда есть Ack и Ack.el

5 голосов
/ 17 февраля 2009

Для а) похоже, что в текущем каталоге просто нет файлов .c или .h.

Для б) Windows пытается использовать свой собственный поиск вместо поиска из утилиты GNU W32. Попробуйте:

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

4 голосов
/ 18 февраля 2009

Комментарий Адама Розенфилда стоит расширить до ответа:

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
2 голосов
/ 17 февраля 2009

Я думаю, что общая проблема заключается в том, что "оболочка" windows cmd ведет себя совершенно иначе, чем оболочка unix, в отношении регулярных выражений и подстановочных знаков расширения имени файла.

Чтобы ответить на ваши вопросы, указанные выше, попробуйте:

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

(Вы по-прежнему получите «неверный аргумент», если нет * .c или * .h).

Или вы можете использовать параметр командной строки --include=\*.[ch], чтобы заставить Windows grep выполнить "правильное" сопоставление с образцом имени файла (другие параметры см. В grep --help)

1 голос
/ 17 февраля 2009

Я обычно просто использую 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, но я не знаком с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...