30

通常,我知道文件名但不记得或发现指定确切的目录很麻烦。我希望能够做到:

find-file x/y/*/some_file.txt

where*将允许在递归目录中搜索,而不仅仅是当前目录。

4

9 回答 9

34

如此处所述:

M-x find-name-dired

提供目录和模式后,匹配的文件将显示在 Dired 缓冲区中。您可以浏览文件列表(C-nC-p等)并根据需要打开文件(Ret)。

于 2013-11-20T12:35:23.653 回答
10

我一直在寻找该功能,现在我对我的发现感到满意:我正在使用helm-projectile.

Projectile是一个项目交互库。项目是 VCS 目录或包含 .projectile 文件的目录。它基于 GNU find(但也提供了纯 emacs lisp 实现)

https://github.com/bbatsov/projectile

(您可以使用 安装它packages.el)。您可以单独使用它:调用projectile-find-file(或projectile-mode和 Cc pf)。它ido默认用于完成,但在这种情况下,我更喜欢helm-projectile.

由于该功能,我的同事一直告诉我使用 Sublime Text。幸运的是,我找到了弹丸 :)

于 2013-11-08T10:57:25.243 回答
6

ido-find-file这样做:当您输入的文件名与当前目录中的任何内容都不匹配时,它会使用类似locate的内容来匹配您针对系统上所有文件编写的内容。

设置只有一行:

(ido-mode)

在此之后,C-x C-f将调用ido-find-file. 另外,我通常会添加:

(setq ido-enable-flex-matching t)

因为我喜欢它,但有了它你会locate得到更多的结果,即foo也会匹配froo

于 2013-09-27T06:19:14.397 回答
4

对于项目目录中的文件,我使用了Fiplr,它使用同一作者的模糊搜索库。

https://github.com/d11wtq/fiplr

这可从 MELPA 获得。

我没有尝试过的其他解决方案是https://github.com/technomancy/find-file-in-project

于 2013-09-28T00:19:51.607 回答
2

编辑:我发现更好projectile,请参阅我的其他答案。

有 find-recursive.el :  http ://www.webweavertech.com/ovidiu/emacs/find-recursive.txt

下载它,把它放在你的加载路径中并在你的 .emacs 中使用它:(它不能通过 ELPA 或 el-get 获得)

(require 'find-recursive)      

现在当你调用 Mx find-recursive 时,它​​会要求一个文件名来递归搜索,一个基本目录,然后你必须在结果列表中选择一个文件。不幸的是,它没有集成到 ido 中,但我喜欢它,它有时很有用。

于 2013-09-27T09:26:44.873 回答
2

这是一个解决方案,可让您选择搜索的文件和子目录。要使用它,您需要Dired+Icicles

该命令仅在 Dired 中使用,是icicle-visit-marked-file-of-content-recursive(或-other-window它的版本)。它绑定到M-+ C-F(对于其他窗口,使用M-+ C-O-- 是的,那些是大写FO)。

它能做什么:

  • 作为完成的候选,它提供当前 Dired 目录中标记的所有文件,加上任何具有 Dired 缓冲区的标记子目录中的所有文件,以此类推。

  • 您可以访问与您的 minibuffer 输入匹配的任意数量的此类候选人,包括所有候选人。您可以访问一些与 minibuffer 输入模式匹配的模式,然后更改模式以匹配并访问其他模式——所有这些都在同一个命令调用中。

  • 匹配”您的输入可能意味着一个或两个

    • 匹配文件
    • 匹配文件内容

    也就是说,您的输入可以是两部分(通过点击分隔C-M-j:文件名部分和文件内容部分。通过匹配文件名缩小选择范围,并通过匹配这些文件中的文本进一步缩小范围。这个搜索很快 - - 只要在文件中找到一个匹配项,它就会成功。

    您可以省略任何一部分:仅匹配文件名(快速)或仅匹配文件内容(自然较慢)。

  • 您可以组合输入模式 -渐进式完成。以增量方式和交互方式添加额外的模式来匹配,比尝试提出一个可以满足您需要的正则表达式要容易得多。

  • 每个输入模式(两部分模式的每个部分)都可以是一个正则表达式。也可以使用模糊匹配。

  • 您也可以在 Dired 缓冲区中插入子目录,而不是将它们作为单独的 Dired 缓冲区。Dired 缓冲区中标记的任何文件和子目录都以相同的方式处理。

    如果您不想下降到标记的子目录,可以使用命令的非递归版本icicle-visit-marked-file-of-content,绑定到C-FC-O对于其他窗口)。

如果您还使用Bookmark+,那么您可以为 Dired 缓冲区或一组 Dired 缓冲区添加书签。书签记录了标记了哪些文件和子目录,插入了哪些子目录,省略了哪些文件和子目录。跳转到这样的书签可以恢复所有这些内容。这为您提供了一种快照项目的方法,然后您可以使用M-+ C-F等进行搜索。

于 2013-11-13T16:50:33.513 回答
1

列出了很多选项,我正在使用下一个命令:

find-file-in-current-directory

你可以像这样把它放在你的 .emacs 中:

;; Find file in current directory:
(global-set-key (kbd "C-M-,") 'find-file-in-current-directory)

对于使用 fsf 工具的人来说,界面看起来非常熟悉(https://github.com/junegunn/fzf

于 2017-07-12T14:40:23.050 回答
1

如果你有 helm,你可以使用这个:

(defun my/helm-find-file-recursively ()
   "Recursively find files in glob manner, in the specified directory."
   (interactive)
   (helm-find 'ask-for-dir))

(global-set-key (kbd "C-c o f") 'my/helm-find-file-recursively)
于 2020-05-24T13:45:48.240 回答
0

Icicles命令icicle-locate(或者icicle-locate-file,如果您没有locate适用于您的操作系统的程序)就是为此而设计的。在给定目录(包括根目录)下的任意位置找到文件。~HOME

您可以匹配绝对文件名的任何部分(即路径和文件名)。您可以使用多种匹配,包括正则表达式、子字符串和模糊匹配。

于 2013-09-27T00:41:40.370 回答