Emacs递归项目搜索

hek*_*ran 20 emacs textmate project 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-project指向我的项目根目录?

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

".*\\.\\(rb\\|js\\|css\\|yml\\|yaml\\|rhtml\\|erb\\|html\\|el\\)"
Run Code Online (Sandbox Code Playgroud)

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

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

(defvar ffip-find-options"""使用项目中的find-file时传递给`find'的额外选项.

使用它来排除项目​​的部分:\" - not -regex \\".供应商.\\ "\"")

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

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

Mat*_*ert 15

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

  • 差不多......但你仍然需要手动指定搜索应该从哪里开始. (2认同)
  • `rgrep`很棒,但就像jrockaway所说的那样,能够完全绕过一些交互式提示会很棒 (2认同)

Mic*_*zyk 11

(更新主要是为了包括与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'.
Run Code Online (Sandbox Code Playgroud)

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

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文件中.还要添加以下内容以使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首选的正则表达式语法.你仍然必须像正常情况下那样在正则表达式中加倍每个反斜杠 ;是否还必须在parens/pipes之前放入反斜杠(|)如果你想使用他们的'魔法'正则表达式意思取决于你find的期望.上面给出的例子对我来说在Ubuntu盒子上工作.如果有疑问,查看关于正则表达式的其他信息.)(注意:这一段已被在上一次编辑中进行了修订,修复了正则表达式语法中的一些混淆.)

  4. C-x C-M-f 远.

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

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