Выполнение rgrep неинтерактивно - PullRequest
7 голосов
/ 10 августа 2011

Я пытаюсь запустить команду rgrep из небольшой утилиты Emacs Lisp, но получаю странную ошибку. Описание команды:

rgrep - это интерактивная скомпилированная функция Lisp.

(rgrep REGEXP и необязательное подтверждение файла FILES)

Рекурсивно grep для REGEXP в FILES в дереве каталогов с корнем в DIR. Поиск ограничен именами файлов, соответствующими шаблону оболочки FILES. ФАЙЛЫ могут использовать сокращения, определенные в grep-files-aliases', e.g. entering ch 'эквивалентно `*. [Ch]'.

С префиксом C-u вы можете редактировать сконструированную командную строку оболочки до того, как он будет выполнен. С двумя префиксами C-u непосредственно редактируйте и запускайте `Grep-найти-команду».

Собрать выходные данные в буфер. Пока find работает асинхронно, вы можете используйте C-x `(M-x next-error) или RET в буфере вывода grep, чтобы перейти к строки, где grep нашел совпадения.

Эта команда делится историями аргументов с M-x lgrep и M-x Grep-поиска.

Я пытаюсь запустить:

(rgrep "something" "all" "~/projects/")

и я получаю

 *** Eval error ***  Wrong type argument: stringp, nil

Очевидно, что все параметры являются строками, поэтому я не могу понять, откуда этот ноль.

Я использую Emacs 23.3 для тестирования Debian.

Заранее спасибо за помощь!

Ответы [ 4 ]

4 голосов
/ 10 августа 2011

Я думаю, это потому, что у вас не определен 'grep-find-template'. это определенно (после отладки), почему команда выдает ошибку в моей версии. посмотрите на справку по этой переменной.

веселит.

пс. это разница между интерактивным вызовом или нет ..

"find . <X> -type f <F> -print0 | \"xargs\" -0 -e grep <C> -nH -e <R>"

.. устанавливается 'grep-calc-defaults' при интерактивном вызове

имп. Я думаю, вы просто должны быть осторожны со своим звонком. если совпадений не найдено, вы получите ошибку «Grep вышла из строя с кодом 123».

mkdir -p ~/a/b
cp ~/.bash* ~/a/b
emacs -q

C-x b <RET> *scratch*
(grep-compute-defaults)
(rgrep "^.*\\?\=.*$" "*bash*" "~/a")

.. много матчей!

3 голосов
/ 10 августа 2011

Причина, по которой вы получаете это при программном вызове rgrep, заключается в том, что все interactive вызовы вариантов grep имеют вызов grep-compute-defaults в вызове interactive.Это не оценивается, когда вы вызываете программно.

Самый простой способ исправить это - добавить

(eval-after-load "grep"
  '(grep-compute-defaults))

в ваш код, что заставит его вызываться (но толькопри необходимости).

2 голосов
/ 11 августа 2011

Для меня нормально работает следующее:

(defadvice rgrep (around rgrep-init)
  "Init grep defaults before calling rgrep non-interactively."
  (when (not (called-interactively-p))
    (grep-compute-defaults))
  ad-do-it)

(ad-activate 'rgrep)

(rgrep "something" "all" "~/projects/")
1 голос
/ 20 октября 2016

Согласно руководству по Emacs:

Команды Mx lgrep (локальный grep) и Mx rgrep (рекурсивный grep) являются более удобными для пользователя версиями grep и grep-find, которые запрашивают отдельно длярегулярное выражение для сопоставления, файлы для поиска и базовый каталог для поиска.

Для рассматриваемой проблемы нам не нужна эта «удобство для пользователя», которая мешает,Мы можем использовать обычную функцию «grep» elisp, которая лучше подходит для неинтерактивного использования.По сути, эта функция принимает в качестве аргумента любую командную строку grep, которую вам нужно использовать для достижения желаемого результата.Максимальная гибкость!

Вот как это будет выглядеть для вашего сценария:

(grep "grep --color -rn something ~/projects/")

Вот еще одно, более сложное использование параметров grep для сопоставления только полных слов в файлах Python:

(grep "grep --include=\"*.py\" --color -rnw your_pattern files_root_dir")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...