3

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

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

4

2 回答 2

2

图书馆冰柱可以帮助解决这个问题。

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

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

    M-R就是导致您的 minibuffer 输入被解析为多个文件名模式的原因。(如果您需要将文件名与空格匹配的模式,请用 . 括起该模式"..."。)

    请参阅页面,该页面描述了这个简单的多输入功能。

  2. 您可以创建一组文件名以供以后重用,包括永久重用(即,在另一个 Emacs 会话中重用)。 本页介绍了此功能。

    为此,在C-x C-f您键入与您想要的某些文件(例如,在特定目录中)匹配的文件名模式后,然后点击TABS-TAB完成该模式(并在弹出窗口中显示匹配项*Completions*),然后点击C-M->(或C-u C-M->持久保存)。

    这里的模式不是 glob 模式——你没有将它们传递给 shell。它们是 Emacs Lisp 正则表达式,或子字符串模式,或前缀模式,或模糊匹配模式,......一般来说,正则表达式是你的朋友。

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

    现在将您的 minibuffer 输入(您仍然在同一个C-x C-f命令调用中)更改为不同的 dir 和文件名模式,然后点击C->将新匹配添加到您使用第一个模式创建的保存集。重复尽可能多的目录和文件模式。C-g如果您现在不想访问这些文件,或者如果您想访问这些文件,则以结束RET

    重用 一组已保存的文件名,请使用C-x C-f然后点击C-M-<. (要检索永久保存的集合,请C-u首先使用:C-u C-M-<点击RET访问所有这些。或者,您可以添加到集合或从集合中减去,以打开一个略有不同的集合。

    在完成过程中,您还可以组合候选集:互补、并集、交集、集差。此类操作绑定了快捷键。

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

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

    M-+ C-M->您甚至可以通过使用(类似地,for )从 Dired 缓冲区中收集所有标记的文件以及在其标记的子目录中的标记文件(或在其标记的子目录中的所有文件M-+ C->)。

除了在文件中保存一组文件名,如上面所建议的,您还可以使用 Emacs 书签。如果您使用库Bookmark+,那么您可以使用 Dired 书签轻松地为文件和目录集添加书签(标记被记住等)。您还可以使用任意数量的自由格式标签来标记文件和目录(作为书签)。每个标签实际上定义了一组书签。有关这些功能的更多信息,请参阅Bookmark+文档。

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

这应该足以让你开始。

于 2014-04-21T02:39:22.990 回答
2

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

于 2014-04-21T13:30:14.500 回答