【问题标题】:Emacs recursive project searchEmacs 递归项目搜索
【发布时间】:2010-03-03 23:11:41
【问题描述】:

我正在从 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\\)"

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

你能解释一下 ffip-find-options 吗?来自文件:

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

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

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

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

【问题讨论】:

标签: emacs project textmate ido-mode


【解决方案1】:

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

【讨论】:

  • 几乎...但您仍然需要手动指定搜索的开始位置。
  • rgrep 很棒,但就像 jrockaway 所说,能够完全绕过一些交互式提示会很棒
【解决方案2】:

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


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

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

;; 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 的this screencast(我已经在对此答案的评论中提到过),了解为什么需要使用它。此外,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 的文件;请调整正则表达式以满足您的需求。 (请注意,这个正则表达式将被传递给 Unix find 实用程序,并且应该使用 find 的首选正则表达式语法。您仍然必须像 Emacs 中通常一样,将正则表达式中的每个反斜杠加倍 ; 如果您想使用它们的“神奇”正则表达式含义,是否还必须在括号/管道(|)之前放置反斜杠取决于您的find 的期望。上面给出的示例适用于我在 Ubuntu 机器上。如有疑问,请查找有关正则表达式的其他信息。)(注意:本段已在上次编辑中进行了修改,以解决正则表达式语法方面的一些混淆。)

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

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

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

【讨论】:

  • 看起来该模式只是查找文件,如生成所有文件的列表,并允许您打开一个进行编辑。
  • 其实你错了。它不是“所有文件”的列表——它使用用户可以配置的正则表达式来确定搜索的内容。此外,它理解了要在其下搜索的“项目根”的概念,并且在与 ido 结合使用时会出现模糊完成。顺便说一句,这似乎正是 OP 所要求的以及您的个人项目声称正在做的事情。
  • 感谢 Michał 的回答。我还有一些关于如何使用 find-file-in-project 的问题。我将它们放入原始问题中。
  • 好的。有空的时候我会研究一下。同时,您可能希望在 Q 中明确这些添加的问题与哪个脚本有关,如果只是为了让 Q 的新手有更多的机会来确定他们是否能够提供帮助! (我的意思是,不阅读所有现有答案和 cmets。)另外,请查看此视频:vimeo.com/1013263。它包含一个示例函数来完成与您想要的非常相似的事情(尽管我认为它使用标记文件)以及对 TextMate 在项目中的 find 与 Emacs 的 ido 的精彩讨论。
  • 我已经编辑了一些基本的设置说明——如果这有帮助,请告诉我。如果我最终制作了一个更有趣的 .emacs-project (可能在明天),我会再做一次编辑。 (显然我还没有发现对更高级选项的需求。)另外,请考虑描述一个您感兴趣的实际场景(意味着项目目录布局、文件扩展名等),也许我或其他人能够提供匹配的配置。
【解决方案3】:

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

【讨论】:

  • 这非常接近 CtrlP 功能......我一直在寻找这样的东西......永远:D......(现在,只是“Ctrl+P”我正在使用“Alt+T”:) ...)
【解决方案4】:

eprojecteproject-grep,这正是你想要的。

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

【讨论】:

  • 您是否刚刚否决了其他几个答案,其中没有一个实际上是错误的,并且包括一个应该提供与您链接到的这个项目非常相同的功能 ...?我想知道你为什么这样做?
  • 已安装 23.1(eproject 需要)。工程有效!需要注意的是,您必须配置您希望 eproject 搜索的每种语言/项目文件。最后,eproject 在搜索它认为在您的项目中的所有文件后运行 grep 注释。
  • 贡献你使用的语言,然后没有其他人需要配置它们。我想组装一堆这些已经有一段时间了。 (该 wiki 包含 Scala、Haskell 和 Perl。)
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      FileCache 也可能是一个选项。但是,您需要使用 file-cache-add-directory-recursively 手动添加项目目录。

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-06
          • 2013-06-17
          • 2011-08-15
          • 1970-01-01
          • 2017-05-10
          • 1970-01-01
          相关资源
          最近更新 更多