20

我正在从 TextMate 切换到 Emacs。我真正希望在 Emacs 中拥有的 TextMate 的一个功能是使用模糊匹配的“在项目中查找”搜索框。Emacs 与ido 类似,但 ido 不会通过子目录递归搜索。它只在一个目录中搜索。

有没有办法给 ido 一个根目录并搜索它下面的所有内容?

更新:

以下问题与 Michał Marczyk 的回答中的 find-file-in-project.el 有关。

如果此消息中的任何内容听起来很明显,那是因为我使用 Emacs 不到一周。:-)

据我了解,project-local-variables 让我可以在我保留在项目根目录中的 .emacs-project 文件中定义内容。

如何将 find-file-in-project 指向我的项目根目录?

我不熟悉 Emacs Lisp 中的正则表达式语法。fip-regexp 的默认值为:

".*\\.\\(rb\\|js\\|css\\|yml\\|yaml\\|rhtml\\|erb\\|html\\|el\\)"

我认为我可以将扩展切换到适合我项目的扩展。

你能解释一下 fip-find-options 吗?从文件中:

(defvar ffip-find-options "" "使用 find-file-in-project 时传递给 `find' 的额外选项。

使用它来排除项目​​的某些部分:\"-not -regex \\"。小贩。\\"\"")

这到底是什么意思,我如何使用它来排除文件/目录?

你能分享一个示例 .emacs-project 文件吗?

4

8 回答 8

15

我为此使用 Mx rgrep。它会自动跳过很多你不想要的东西,比如 .svn 目录。

于 2010-03-04T03:01:33.173 回答
11

(更新主要是为了包括与下面提到的 RINARI 发行版中的 find-file-in-project.el 一起使用的实际设置说明。原始答案保持不变;新位出现在第二个水平规则之后。)


查看 EmacsWiki 的TextMate 页面。他们提到的最有前途的可能是这个 Emacs Lisp 脚本,它在由一些变量引导的“项目目录”下提供递归搜索。该文件以描述如何使用它的大量注释部分开头。

使它特别有前途的是以下几点:

;; If `ido-mode' is enabled, the menu will use `ido-completing-read'
;; instead of `completing-read'.

注意我自己没有使用过它......虽然我现在很可能会尝试一下,因为我已经找到了它!:-)

HTH。

(顺便说一句,该脚本是——引用 GitHub 的描述——“Rinari 不是 Rails IDE(它是 Rails 的 Emacs 次要模式)”的一部分。如果你正在做任何 Rails 开发,你可能想要检查整个事情。)


在继续之前,请配置ido.el。说真的,它本身就是必备的它将改善您在项目中查找文件的体验。请参阅Stuart Halloway 的截屏视频(我已经在对此答案的评论中提到过),了解为什么需要使用它。此外,Stu 通过以自己的方式模拟 TextMate 的项目范围的文件查找工具,展示了 ido 的灵活性;如果他的功能适合您的需要,请不要再阅读。

好的,下面是设置 RINARI 的方法find-file-in-project.el

  1. 从 RINARI 发行版中获取find-file-in-project.elproject-local-variables.el放在 Emacs 可以找到它们的某个地方(这意味着在load-path变量中的一个目录中;您可以使用(add-to-list 'load-path "/path/to/some/directory")它来添加新目录)。

  2. 添加(require 'find-file-in-project)到您的.emacs文件中。还要添加以下内容以使C-x C-M-f序列显示 find-file-in-project 提示:(global-set-key (kbd "C-x C-M-f") 'find-file-in-project).

  3. .emacs-project在您的项目根目录中创建一个名为的文件。它至少应该包含如下内容:(setl ffip-regexp ".*\\.\\(clj\\|py\\)$"). 这将使得只有名称和在cljpy将被搜索的文件;请调整正则表达式以满足您的需求。(请注意,这个正则表达式将被传递给 Unixfind实用程序,并且应该使用find's 首选的正则表达式语法。您仍然必须像 Emacs 中通常那样将正则表达式中的每个反斜杠加倍;是否还必须在括号/管道之前放置反斜杠(|) 如果您想使用他们的“神奇”正则表达式含义取决于您find的期望。上面给出的示例适用于我在 Ubuntu 机器上。如有疑问,请查找有关正则表达式的其他信息。)(注意:本段已在上次编辑中进行了修订,以修复正则表达式语法的一些混淆。)

  4. C-x C-M-f离开。

有许多可能的定制;特别是,您可以使用(setl ffip-find-options "...")将其他选项传递给 Unixfind命令,这是在find-file-in-project.el后台调用的。

如果事情似乎不起作用,请检查并仔细检查您的拼写 - 我做了(setl ffip-regex ...)一次类似的事情(注意变量名中缺少最后的“p”),最初发现没有找到任何文件感到非常困惑。

于 2010-03-03T23:31:35.857 回答
4

惊讶没有人提到https://github.com/defunkt/textmate.el(现在必须让它在 Windows 上工作......)

于 2012-03-14T21:45:00.360 回答
3

eproject has eproject-grep,这正是你想要的。

使用正确的项目定义,它只会搜索项目文件;它将忽略版本控制、构建工件、生成的文件等等。唯一的缺点是它需要在您的系统上使用 grep 命令;这种依赖很快就会被消除。

于 2010-03-04T22:36:22.377 回答
2

你可以通过使用 GNU Global 或 IDUtils 来获得你想要的效果。它们不是 Emacs 特定的,但它们具有集成该效果的 Emacs 脚本。(我自己对它们了解不多。)

您也可以选择使用 CEDET 和 EDE 项目系统。EDE 可能有点重,但它有办法只标记项目的顶部。如果你还在你的项目中保留了 GNU Global 或 IDUtils 索引文件,EDE 可以使用它在任何地方按名称查找文件,或者你可以使用 `semantic-symref' 在源文件中查找对符号的引用。CEDET 位于http://cedet.sf.net

于 2010-03-04T01:37:22.597 回答
2

为了获得纯粹的速度,我强烈建议将命令行工具The Silver Searcher(又名“ag”)与ag.el 结合使用。如果您使用 git、hg 或 svn 并搜索整个项目,ag-project交互式功能将对您的项目根目录进行有根据的猜测。

于 2013-07-16T03:09:29.413 回答
0

有关Icicles如何在此处提供帮助的信息,请参阅这些链接:

Icicles 完成匹配可以是子字符串、正则表达式、模糊(各种)或这些的组合。您还可以组合简单的模式,将匹配项相交或补充(减去)其中的一个子集

于 2011-08-21T20:46:49.640 回答
0

FileCache也可能是一种选择。但是,您需要使用file-cache-add-directory-recursively.

于 2010-03-04T07:26:19.223 回答