Emacs递归项目搜索

时间:2010-03-03 23:11:41

标签: emacs project textmate ido-mode

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

有没有办法让ido成为根目录并搜索其下的所有内容?

更新

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

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

据我了解,project-local-variables允许我在.emacs-project文件中定义我保留在项目根目录中的东西。

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

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

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

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

你能解释一下ffip-find-options吗?来自档案:

(defvar ffip-find-options   “”   “在使用项目中的find-file时传递给`find'的额外选项。

使用它来排除项目​​的部分内容:\“ - not -regex \\”。 vendor。 \\“\”“)

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

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

8 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:11)

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


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

特别有希望的是以下几点:

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

注意我自己没有用过它......虽然我已经找到了它但我可能会试一试! : - )

HTH。

(BTW,该脚本是其中的一部分 - 引用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提示:(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中是常见的;如果你想使用他们的'魔法'正则表达式,你是否还必须在parens / pipes(|)之前放回斜杠,这取决于你find的预期。上面给出的例子在Ubuntu框中为我工作。如果有疑问,请查看有关正则表达式的其他信息。)(注意:此段已在上一次编辑中进行了修订,以修复正则表达式语法中的一些混淆。) < / p>

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

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

    如果事情看起来不起作用,请检查并仔细检查你的拼写 - 我做了(setl ffip-regex ...)之类的事情(注意变量名中没有最后的'p')并且最初很困惑发现没有找到任何文件。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

eprojecteproject-grep,它完全符合您的要求。

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

对于纯粹,无瑕疵的速度,我强烈建议将命令行工具The Silver Searcher(a.k.a。'ag')与ag.el结合使用。如果您使用git,hg或svn并搜索整个项目,ag-project交互式函数将对您的项目根进行有根据的猜测。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

冰柱完成匹配可以是子串,正则表达式,模糊(各种)或这些的组合。您还可以组合简单模式,交叉匹配或补充(减去)它们的子集