我正在从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文件吗?
答案 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
:
从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
文件中。同时添加以下内容以使C-x C-M-f
序列显示项目中的find-file提示:(global-set-key (kbd "C-x C-M-f") 'find-file-in-project)
。
在项目根目录中创建名为.emacs-project
的文件。它至少应该包含这样的内容:(setl ffip-regexp ".*\\.\\(clj\\|py\\)$")
。这样就可以只搜索名称在clj
或py
中的文件;请调整正则表达式以满足您的需求。 (请注意,此正则表达式将传递给Unix find
实用程序,并应使用find
首选的正则表达式语法。您仍然需要将正则表达式中的每个反斜杠加倍在Emacs中是常见的;如果你想使用他们的'魔法'正则表达式,你是否还必须在parens / pipes(|
)之前放回斜杠,这取决于你find
的预期。上面给出的例子在Ubuntu框中为我工作。如果有疑问,请查看有关正则表达式的其他信息。)(注意:此段已在上一次编辑中进行了修订,以修复正则表达式语法中的一些混淆。) < / p>
C-x C-M-f
离开。
有许多可能的定制;特别是,您可以使用(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)
eproject有eproject-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如何在此处提供帮助的信息,请参阅以下链接:
冰柱完成匹配可以是子串,正则表达式,模糊(各种)或这些的组合。您还可以组合简单模式,交叉匹配或补充(减去)它们的子集