[英]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
:
从RINARI发行版中获取find-file-in-project.el
和project-local-variables.el
并将其放置在Emacs可以找到它们的位置(这意味着在load-path
变量的一个目录中;您可以使用(add-to-list 'load-path "/path/to/some/directory")
向其添加新目录)。
(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)
。
在项目根目录中创建名为.emacs-project
的文件。 它至少应包含以下内容: (setl ffip-regexp ".*\\\\.\\\\(clj\\\\|py\\\\)$")
。 这样就可以只搜索其名称和clj
或py
文件; 请调整正则表达式以满足您的需求。 (请注意,这个正则表达式将被传递给Unix find
实用程序,并且应该使用find
的首选正则表达式语法。你仍然必须像正常情况一样在正则表达式中加倍每个反斜杠 ;你是否还需要在parens之前放入反斜杠/管道( |
)如果你想使用他们的'魔术'正则表达式意思取决于你的find
的期望。上面给出的例子对我来说在Ubuntu盒子上工作。如果有疑问, 请查看有关正则表达式的其他信息。) (注意:在最后一次编辑中修改了这一段,修复了正则表达式语法的一些混淆。)
Cx CMf
走了。
有许多可能的定制; 特别是,您可以使用(setl ffip-find-options "...")
将其他选项传递给Unix find
命令,这就是find-file-in-project.el
的内容。
如果事情看起来不起作用,请检查并仔细检查你的拼写 - 我做了一次( (setl ffip-regex ...)
一次(注意变量名中缺少最后的'p')并且最初很困惑发现没有找到任何文件。
惊讶没人提到https://github.com/defunkt/textmate.el (现在要让它在Windows上工作......)
eproject有eproject-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
手动添加项目目录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.