如何用“M-x grep”定义“M-x find”?

时间:2013-01-29 21:25:12

标签: emacs

我在Emacs中寻找一个命令M-x find,其行为与M-x grep完全相同(允许修改命令,很好地打印输出,包括找到的文件的链接,......)执行find . -iname '*|*'(光标放在垂直条上 - 用于插入搜索模式 - 如果实现起来不太复杂)。有没有人以前实现过这个? [我知道M-x find-grep]

3 个答案:

答案 0 :(得分:3)

让我们从几乎所需的 M-x find-dired开始:它从迷你缓冲区读取目录,默认为当前目录,然后读取其他find个参数。结果以dired模式打开,我认为它的结果非常好(如果您认为dired过于冗长,请查看dired-details,也许dired-details+包裹在MELPA)。

现在让它以-iname **开头,当它要求选项时,在星星之间有一个光标。查看find-dired源代码,我们可以看到它使用find-args的值作为read-string的初始输入参数。这个论点已经过时并且已弃用但非常有用。它的一个特性(正如我们在read-from-minibuffer描述中所读到的那样)是在给出字符串和整数的缺点时提供默认的点位置。

(defun marius/find-dired ()
  (interactive)
  (let ((find-args '("-iname '**'" . 10)))
    (call-interactively 'find-dired)))

我们在'**'中围绕星号添加了单引号,因为参数受shell扩展限制。

我们不是从迷你缓冲器中读取我们自己的参数 重新绑定find-args并将所有其余内容委托给find-dired。一般 find-dired会记住您在find-args中输入的最后一个参数 成为新的默认。用let重新绑定它可以确保这一点 从我们的调用find-dired的修改将被丢弃,所以 常规find-dired将使用最新的参数 常规 find-dired。如果你不使用常规find-dired,这可能无关紧要。如果想要找到我们的包装器给常规find-dired使用的参数,请改用以下定义:

(defun marius/find-dired ()
  (interactive)
  (setq find-args '("-iname '**'" . 10))
  (call-interactively 'find-dired))

答案 1 :(得分:1)

我认为find-dired符合您的要求(除非它没有使用“-iname”初始化命令,并允许您输入它。)

例如:

  • M-x find-dired RET (执行find-dired
  • C-j (接受默认目录:.
  • -iname "*.foo" RET (输入命令行参数)

结果显示在dired缓冲区中。

答案 2 :(得分:0)

您可以从:

开始
(defun eab/find-grep ()
  (interactive)
  (let ((grep-host-defaults-alist nil)
        (grep-find-command
         `(,"find . -iname '**' -type f -print0 | xargs -0 -e grep -nH -m 1 -e \"^\"" . 17)))
    (call-interactively 'find-grep)))

我也使用:

(defun eab/grep ()
  (interactive)
  (let ((grep-host-defaults-alist nil)
        (grep-command
         `(,(concat "grep -i -nH -e  *."
                    (ignore-errors
                      (file-name-extension buffer-file-name))) . 16)))
    (call-interactively 'grep)))

编辑:现在grep-find-command默认只搜索每个文件的第一行。