在Emacs中,是否有一种模式或函数可以让我在预先指定的一组固定的非连续目录中的文件名(但不在文件中)中搜索字符串?
我相信projectile-mode
允许我在项目中搜索文件名,但我相信项目被定义为包含文件的目录。我需要在几个不同的目录中进行搜索。
库Icicles可以帮助实现这一点。
-
在Icicle模式中,所有命令,包括文件查找(访问)命令,都允许您同时对多个输入模式进行操作。例如,要访问目录
/a/b/c
中名称与Unix/Linux glob模式foo*.el
相匹配的所有文件,以及目录/x/y
中名称与glob图案bar*toto*.c
相匹配的全部文件,可以执行以下操作:C-x C-f /a/b/c/foo*.el /x/y/bar*toto*.c M-R
M-R
是导致迷你缓冲区输入被解析为多个文件名模式的原因。(如果您需要一个用空格匹配文件名的模式,请用"..."
将该模式括起来。)请参阅本页,其中介绍了这个简单的多输入功能。
-
您可以创建一组文件名,以便稍后重用,包括持久重用(即在另一个Emacs会话中重用)此页面介绍了此功能。
要做到这一点,在
C-x C-f
之后,您键入一个与您想要的某些文件匹配的文件名模式(例如,在特定目录中),然后点击TAB
或S-TAB
来完成该模式(并在弹出窗口*Completions*
中显示匹配),然后再点击C-M->
(或C-u C-M->
来持久保存)。这里的模式不是glob模式——您没有将它们传递给shell。它们是Emacs Lisp regexp,或子字符串模式,或前缀模式,或模糊匹配模式,。。。一般来说,regexp是您的朋友。
使用
C-M->
标记或保存匹配文件名的列表。您可以保存到Lisp变量或文件中,也可以不使用任何变量保存到内存中。现在,将迷你缓冲区输入(仍然处于相同的
C-x C-f
命令调用中)更改为不同的目录和文件名模式,然后点击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,它的计算结果为文件名字符串列表。 -
还有另一种方法:在Dired缓冲区中,标记您想要的文件,然后使用
C-M->
将它们保存为一个集,您可以像上面的#2那样重用它们。转到另一个Dired目录,在那里标记文件,然后使用C->
将它们添加到从第一个Dired缓冲区定义的集合中。等等。通过使用
M-+ C-M->
(类似地,对于M-+ C->
),您甚至可以从Dired缓冲区中收集所有标记的文件及其标记子目录中的标记文件(或其标记子目录的所有文件)。
除了如上所述在文件中保存一组文件名之外,您还可以使用Emacs书签。如果您使用库Bookmark+,那么您可以使用Dired书签轻松地为文件和目录集添加书签(记住标记等)。您还可以使用任意数量的自由格式标记文件和目录(作为书签)。实际上,每个标签都定义了一组书签。有关这些功能的更多信息,请参阅书签+文档。
尽管它是Bookmark+的一个独立库(两者都不需要另一个),但Icicles提供了许多使用Bookmark+能的方法,包括轻松访问带有特定标签集的文件和目录。
这应该足以让你开始。
如果您对使用helm持开放态度,我专门为此制作了helm-cmd-t。如果github不清楚如何使用它,就会在github上打开问题。