繁体   English   中英

Emacs递归项目搜索

[英]Emacs recursive project search

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

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

更新:

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

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

据我所知,项目本地变量允许我在.emacs-project文件中定义我保留在项目根目录中的东西。

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

我不熟悉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 \\\\”。 供应商。 \\\\ “\\”“)

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

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

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

(更新主要是为了包括与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文件中添加(require 'find-file-in-project) 还添加以下内容以使Cx CMf序列显示项目中的find-file提示: (global-set-key (kbd "Cx CMf") 'find-file-in-project)

  3. 在项目根目录中创建名为.emacs-project的文件。 它至少应包含以下内容: (setl ffip-regexp ".*\\\\.\\\\(clj\\\\|py\\\\)$") 这样就可以只搜索其名称和cljpy文件; 请调整正则表达式以满足您的需求。 (请注意,这个正则表达式将被传递给Unix find实用程序,并且应该使用find的首选正则表达式语法。你仍然必须像正常情况一样在正则表达式中加倍每个反斜杠 ;你是否还需要在parens之前放入反斜杠/管道( | )如果你想使用他们的'魔术'正则表达式意思取决于你的find的期望。上面给出的例子对我来说在Ubuntu盒子上工作。如果有疑问, 查看有关正则表达式的其他信息。) (注意:在最后一次编辑中修改了这一段,修复了正则表达式语法的一些混淆。)

  4. Cx CMf走了。

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM