在Emacs中,如何在固定的目录集中搜索文件名?

时间:2014-04-21 00:48:41

标签: emacs grep emacs-helm

在Emacs中,是否有一种模式或函数可以让我在预先指定的一组固定的非连续目录中搜索文件名(但不在文件中)中的字符串?

我相信projectile-mode允许我在项目中搜索文件名,但我相信项目被定义为包含文件的目录。我需要在几个不同的目录中搜索。

2 个答案:

答案 0 :(得分:2)

图书馆Icicles可以为此提供帮助。

  1. Icicle 模式下,所有命令(包括文件查找(访问)命令)都允许您同时处理多个输入模式。例如,要访问名称与Unix / Linux glob模式/a/b/c匹配的目录foo*.el中的所有文件,以及名称与glob模式/x/y匹配的dir bar*toto*.c中的所有文件,可以做到这一点:

      
     C-x C-f /a/b/c/foo*.el /x/y/bar*toto*.c M-R
    
      

    M-R是导致您的迷你缓冲输入被解析为多个文件名模式的原因。 (如果需要一个匹配带空格的文件名的模式,则用"..."括起模式。)

    请参阅this页面,其中介绍了这个简单的多输入功能。

  2. 您可以创建一组文件名以便以后重复使用,包括持久(即在另一个Emacs会话中重用)。 This page描述了此功能。

    要执行此操作,请在C-x C-f之后键入与所需文件匹配的文件名模式(例如,在特定目录中),然后点击TABS-TAB完成模式(并在弹出窗口*Completions*中显示匹配项),然后点击C-M->(或C-u C-M->以永久保存)。

    这里的模式不是glob模式 - 你没有将它们传递给shell。它们是Emacs Lisp regexp,或子串模式,或前缀模式,或模糊匹配模式,......一般来说,regexps是你的朋友。

    使用C-M-> 标记保存匹配文件名列表。您可以保存为Lisp变量或文件,或仅使用无变量保存到内存。

    现在将您的迷你缓冲区输入(您仍在相同的C-x C-f命令调用中)更改为其他目录和文件名模式,然后单击C->将新匹配添加到已保存的集合中你使用第一个模式创建。根据需要重复多个目录和文件模式。如果您不想立即访问这些文件,请以C-g结尾;如果您不想访问RET则结束。

    重复使用 一组已保存的文件名,请使用C-x C-f,然后点击C-M-<。 (要检索持久保存的集合,请先使用C-uC-u C-M-<。)这样做的目的是将当前的文件名匹配集定义为已保存名称集中的匹配项。点击RET访问所有人。或者您可以添加或减去集合,以打开稍微不同的集合。

    在完成期间,您还可以组合候选集:补充,联合,交集,集合差异。这些操作有快捷键。

    您还可以使用Lisp定义一个集合以供以后重用。交互式执行此操作的简便方法是在文件名完成期间使用M-x icicle-candidate-set-define。它会提示您输入一个评估为文件名字符串列表的Lisp sexp。

  3. 另一种方式:在Dired缓冲区中,标记您想要的文件,然后使用C-M->将它们保存为可以重复使用的集合,如上面的#2所示。转到另一个Dired目录,在那里标记文件,然后使用C->将它们添加到您从第一个Dired缓冲区定义的集合中。等等。

    您甚至可以使用M-+ C-M->(以及M-+ C->同样收集Dired缓冲区中的所有标记文件以及其标记的子目录中的标记文件(或其标记的子目录中的所有文件) 1}})。

  4. 除了在文件中保存一组文件名外,如上所述,您还可以使用Emacs书签。如果您使用库Bookmark+,那么您可以使用Dired书签(记住标记等)轻松地为文件和目录设置书签。您还可以使用任意数量的自由格式代码 标记 文件和目录(作为书签)。每个标签实际上定义了一组书签。有关这些功能的详细信息,请参阅书签+ 文档。

    虽然它是 Bookmark + (不需要另一个)的单独库,但 Icicles 提供了许多方法来使用此类书签+ 功能,包括轻松访问标记有特定标签集的文件和目录。

    这应该足以让你入门。

答案 1 :(得分:2)

如果您开始使用helm,我专门为此目的制作了helm-cmd-t。如果github不清楚如何使用它,请在github上打开问题。