【问题标题】:How to define "M-x find" in the same way as "M-x grep"?如何以与“M-x grep”相同的方式定义“M-x find”?
【发布时间】:2013-01-13 14:16:06
【问题描述】:

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

【问题讨论】:

    标签: emacs


    【解决方案1】:

    让我们从 M-xfind-dired 开始,它几乎可以满足您的要求:它从 minibuffer 读取目录,默认为当前目录,然后读取其他 find 参数。结果以dired 模式打开,我认为它可以得到最好的结果(如果您认为dired 过于冗长,请查看dired-detailsdired-details+MELPA)。

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

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

    我们在'**' 中的星号周围添加了单引号,因为参数受外壳扩展的影响。

    我们不是从 minibuffer 中读取我们自己的参数,而是 重新绑定 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))
    

    【讨论】:

      【解决方案2】:

      我认为find-dired 满足您的要求(除了它不使用“-iname”初始化命令并让您输入它)。

      例如:

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

      结果显示在dired 缓冲区中。

      【讨论】:

        【解决方案3】:

        你可以从:

        (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 默认只搜索每个文件的第一行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-18
          • 2020-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多