Emacs - 如何让find-file在子目录中搜索

9
我希望能够为Emacs实现类似于Resharper的“转到文件”功能。当用户按下快捷键时,Resharper会弹出一个文本框,接受通配符字符串并显示自动完成菜单,列出与该通配符匹配的项目中的所有文件: "Go To File" dialog (来源: jetbrains.com) 目前,我知道一种比较粗糙的方法来实现类似的功能。它涉及使用带有-lR选项的dired,然后调用dired-isearch-filenames - 这将在特定根目录内的整个文件层次结构上启动增量搜索。

更新:我也知道打开大量缓冲区并将它们全部保存在内存中,然后使用switch-to-buffer的选项。这个解决方案与ido很好地配合使用,但它并不是100%牢固的(如果有一些文件被添加或删除怎么办?)。它也不能很好地与tabbar配合使用,因为选项卡将显示包含在项目中的所有文件,而不是表示我的当前上下文子集的项目。

然而,这显示了大量不必要的信息,并且缺少自动完成功能。我已经查看了idoicicles,但它们似乎只能在当前目录中浅层地工作。是否有一个Emacs插件可以帮助我实现我的目标?

4个回答

5

虽然您可能不想保持大量缓冲区打开,但可以将IDO钩入recentf中,该功能可跟踪最近打开的文件:

(recentf-mode 1)
(setq recentf-max-saved-items 300)

(defun ido-choose-from-recentf ()
  "Use ido to select a recently opened file from the `recentf-list'"
  (interactive)
  (find-file (ido-completing-read "Open file: " recentf-list nil t)))

(global-set-key [(meta f11)] 'ido-choose-from-recentf)

我已经使用这个技巧多年了,它可以满足我99%的文件切换需求。
此外,我使用 M-x rgrep,你可能还想看看 M-x find-diredM-x find-grep-dired
如果需要更多选项,请查看类似问题的答案

1
我的项目文件不是很多,所以我选择了一个简单但实用的解决方案。我只需调用“find path1 path2 .. pathN -print0”,将结果按“\0”分割并将其提供给ido-completing-read。感谢您提供的超级好主意! - Eugene Burmako

4

你尝试过使用helm吗?你可以轻松地选择搜索文件、缓冲区、命令和许多其他内容。


4

Projectile有一个名为projectile-jump-to-project-file的函数,可以做你想要的事情。还有find-file-in-project - 一个更简单的实用程序,但需要GNU find的存在。


2
您提到了“冰柱”(Icicles),但您错误地认为它“浅显易懂”。实际上,它可以按您想要的任何方式工作。您可以搜索系统中的任何文件,匹配文件名和路径的任何部分。您还可以定义一个特定文件和/或目录的项目,保存其定义,以后仅在这些文件/目录中进行搜索。(Emacs文件集是该功能的严格子集,但您可以直接使用文件集来完成同样的操作。)
这应该会有所帮助(请参阅该页面末尾的链接)。

http://www.emacswiki.org/emacs/Icicles_-_File-Name_Input


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接