我目前正处于转换过程的开始,转发Emacs。但是我有两个基本问题。
如何从特定路径递归搜索多个文件?我假设我必须使用find
/ grep
/ dired
,但我不确定。例如,我想在路径*.scala
找到所有C:/src/xxx
个文件。当找到这些文件时,我还想立即在缓冲区中打开它们。我目前熟悉的唯一方法是 C-x C-f 。
当所有这些文件都在缓冲区中时,我如何搜索所有缓冲区,并获得某种结果列表和/或可能从结果导航到结果?说我想找到文字case Int =>
的所有地方。
答案 0 :(得分:9)
我同意phimuemue的回答,但我也会指出M-x rgrep
,它将运行必要的find / grep,以便在不实际打开文件的情况下显示所有匹配项。选择匹配然后打开该行号的相关文件。在某些情况下,这可能比打开所有这些文件更好。
另见:
答案 1 :(得分:3)
对于A部分,您可能会看here。
对于B部分,您可能会看一下multi-occur-in-matching-buffers
,它可以让您指定要使用的缓冲区(例如,所有缓存.*.scala
以查找所有scala文件)以及要查找的内容(例如case Int =>
)。这将为您提供所有出现的列表。
答案 2 :(得分:1)
您正在尝试查找所有“case Int =>”在C:/ src中的* .scala文件中
最简单的方法(假设默认的Emacs设置)是使用M-x rgrep
。它会询问您搜索字符串,文件类型和目录(按此顺序,并且提示标记为没有混淆)。只需输入case Int =>
,*.scala
和C:/src/xxx
。
您应该看到的是一个新缓冲区,其中包含“case Int =>”的出现列表在该目录中的所有.scala文件中。如果单击某个匹配项,Emacs将打开该文件并导航到包含该文件的行。
请注意,如果您尝试搜索并替换多个文件,则可以使用dired
选项执行此操作。您可以找到有关该选项的信息here。
答案 3 :(得分:1)
*问题A ***
在 Icicles 中, C-x C-f 默认为多命令。这意味着当你完成一组文件名时:
您可以选择性地(例如,访问)多个候选人(例如 C-RET , C-mouse-2 )。
< / LI>您可以对名称与当前输入相匹配的所有文件采取行动 - 例如,全部访问它们。
其他 Icicles 文件命令也是如此,包括那些允许您匹配绝对文件名的命令,这意味着您的迷你缓冲区模式不仅可以匹配文件名的非目录部分,目录部分也是如此。
例如,带有前缀arg的 C-x C-f 匹配绝对文件名。并且M-x icicle-locate-file
对给定目录下的所有文件执行相同的操作。
(您可以使用多命令作为普通命令: Cx Cf 在使用 RET 或 mouse-2 时正常工作如果你不使用额外的键绑定来处理多个文件,那么你永远不会知道它们之间的区别。)
请参阅http://www.emacswiki.org/emacs/Icicles_-_File-Name_Input
*问题B ***
你想要的是冰柱搜索。
icicle-search-file
搜索您指定的集合中的所有文件。icicle-search-buffer
搜索您指定的集合的所有缓冲区。icicle-search
同时执行:带有前缀为负的文件arg,带有非负前缀arg的缓冲区。这些命令允许您指定正则表达式来定义搜索上下文:要搜索的文件或缓冲区的各个部分。例如,.*
表示搜索每一行。
定义搜索上下文后,在迷你缓冲区中键入一些文本,并将候选搜索上下文缩小为与文本匹配的内容。你可以点击 M-SPC 来组合多个这样的模式。
然后您可以导航到所选的搜索命中: C-RET 或 C-mouse-2 来访问,或使用 C-down循环/访问。您甚至可以通过各种方式对匹配的候选项进行排序,轻松比较它们或更改周期顺序。
请参阅http://www.emacswiki.org/emacs/Icicles_-_Search_Commands%2c_Overview
答案 4 :(得分:0)
我认为你是人为地限制了答案。您不需要将所有文件加载到Emacs中以查找这些事件。而且,一旦你发现了正则表达式的出现,你就可以通过击键轻松跳转到文件中的那一行。
我最喜欢的方法是使用 M-x igrep-find ,因为我比Emacs的igrep
更喜欢grep-find
界面。
您可以在emacswiki上找到igrep库:igrep.el
用法是
M-x igrep-find case Int => RET
将填充所有匹配的缓冲区,然后(如发生,grep-find,编译等),您可以使用 Cx` 或 Mx next-error < / kbd>循环比赛。