Emacs 以非交互方式执行rgrep

Emacs 以非交互方式执行rgrep,emacs,Emacs,我试图从一个小的Emacs Lisp实用程序运行rgrep命令,但是我得到了一个奇怪的错误。命令说明如下: rgrep是一个交互式编译的Lisp函数 (rgrep REGEXP&可选文件目录确认) 在以DIR为根的目录树中的文件中递归grep for REGEXP。 搜索仅限于与外壳模式文件匹配的文件名。 文件可能使用grep FILES alias'中定义的缩写,例如。 输入ch'相当于“*.[ch]” 使用C-u前缀,可以编辑构造的shell命令行 在它被执行之前。使用两个C-u前缀,直接编

我试图从一个小的Emacs Lisp实用程序运行rgrep命令,但是我得到了一个奇怪的错误。命令说明如下:

rgrep是一个交互式编译的Lisp函数

(rgrep REGEXP&可选文件目录确认)

在以DIR为根的目录树中的文件中递归grep for REGEXP。 搜索仅限于与外壳模式文件匹配的文件名。 文件可能使用
grep FILES alias'中定义的缩写,例如。
输入
ch'相当于“*.[ch]”

使用C-u前缀,可以编辑构造的shell命令行 在它被执行之前。使用两个C-u前缀,直接编辑并运行 `grep find命令'

在缓冲区中收集输出。当find异步运行时,您可以 在grep输出缓冲区中使用C-x`(M-x next error)或RET转到 grep找到匹配项的行

此命令与M-x lgrep和M-x共享参数历史记录 格雷普·芬德

我试着跑:

(rgrep "something" "all" "~/projects/")
我得到

 *** Eval error ***  Wrong type argument: stringp, nil
很明显,所有的参数都是字符串,所以我不明白这个nil是从哪里来的

我正在Debian测试上运行Emacs23.3


提前感谢您的帮助

我认为这是因为您没有定义“grep find template”。这就是命令在我的版本上产生错误的原因。请查看该变量的帮助

干杯

另外,这是交互调用与否的区别

"find . <X> -type f <F> -print0 | \"xargs\" -0 -e grep <C> -nH -e <R>"
“find.-type f-print0 | \“xargs\”-0-e grep-nH-e”
..在交互调用时由“grep calc defaults”设置

pps。我想你只要小心你的电话就行了。如果找不到匹配项,则会出现“Grep异常退出,代码123”错误

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

C-x b <RET> *scratch*
(grep-compute-defaults)
(rgrep "^.*\\?\=.*$" "*bash*" "~/a")
mkdir-p~/a/b
cp~/.bash*~/a/b
emacs-q
C-x b*划痕*
(grep计算默认值)
(rgrep“^.*\\?\=*$”“*bash*”“~/a”)

很多比赛

以编程方式调用
rgrep
时出现这种情况的原因是,对
grep
变量的所有
interactive
调用都在
interactive
调用中调用了
grep compute defaults
。当您以编程方式调用时,不会对其进行计算

解决此问题的最简单方法是添加

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

在您的代码中,它将强制调用(但仅在需要时调用)。

以下内容对我来说似乎正常:

(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/")

根据Emacs手册:

命令M-x lgrep(local grep)和M-x rgrep(recursive 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")

对我来说很好。尝试在Emacs中运行/out您的.Emacs(
Emacs-q
)。另外,在运行它之前,添加
(错误t上的setq debug)
以获取回溯,回溯将提供更多信息。在运行代码之前,您可能已经以交互方式运行了rgrep,并且您认为grep find template的值不是零。是的,您是正确的。然而,我不明白,如果我在rgrep之前直接调用calc defaults,我会从find中得到一些异常的退出错误。在我看来,grepfindtemplate的价值在这一点上看起来不错。你知道是什么原因造成的吗?博日达尔·巴佐夫:你对
“all”
别名的使用也可能是个问题。这看起来也会在
交互调用中处理。您可能希望将其更改为关联的regexp
“*”
。是的,我已经找到了答案。我真正的问题是在rgrep之前调用grep compute defaults会引入其他问题-现在我从rgrep执行的find命令中得到一个异常退出错误。也许除了调用grep computre默认值之外,还需要做更多的事情?