Emacs递归项目搜索

问题描述:

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

有没有办法给ido一个根目录并搜索它下面的所有东西?

更新:下面

的问题,涉及到找到文件功能于project.el从米哈尔Marczyk的答案。

如果此消息中的任何内容听起来很明显,这是因为我已经使用了Emacs不到一个星期。 :-)

据我所知,项目本地变量让我定义一个.emacs项目文件中的东西,我保留在我的项目根目录。

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

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

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

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

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

(defvar ffip找到的选项使用发现,文件中项目时 “” “额外选项传递到'发现”

使用此排除项目的部分。 :\“ - not -regex \\”。vendor。 \\“\”“)

这意味着什么,以及如何使用它来排除文件/目录?

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

+0

约textmate.el什么: https://github.com/defunkt/textmate.el – 2015-05-01 19:56:56

(更新主要是为了包括实际的设置说明,用于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。如果你正在做任何Rails开发,那么这个脚本就是Rails的一部分,你可能想看看整个事情。)


在进行下一步之前,配置ido.el。认真的说,这是一个必须拥有的自己的它将改善您的find-file-in-project体验。请参阅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序列显示项目查找文件提示符:(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中通常那样;您是否也必须在之前放置反斜杠如果你想使用他们的'魔术'正则表达式的含义取决于你的find的期望值。上面给出的例子适用于我在Ubuntu的盒子上,如果有疑问,请查看正则表达式的其他信息。)(注意:本段已在最后一次修改中修正,以修正某些与正则表达式语法有关的混淆。)

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

有一些可能的自定义;特别是,您可以使用(setl ffip-find-options "...")将其他选项传递给Unix find命令,这是find-file-in-project.el呼叫的底线。

如果事情看起来不起作用,请检查并仔细检查您的拼写 - 我做了一次像(setl ffip-regex ...)一次(注意变量名称中缺少最后的'p'),最初很难发现没有文件正在被发现。

+0

貌似该模式只找到文件,如生成的所有文件的列表,并允许您打开一个编辑。 – jrockway 2010-03-04 22:56:52

+0

你实际上错了。它不是“所有文件”的列表 - 它使用用户可配置的正则表达式来确定要搜索的内容。此外,它还提供了一个“项目根”的概念,以便在与ido结合使用时进行搜索,并得到模糊完成。顺便说一句,顺便说一句,看起来正是OP所要求的,以及你的个人项目声称做了什么。 – 2010-03-04 23:33:49

+0

谢谢你的答案Michał。我还有几个关于如何使用find-file-in-project的问题。我把它们写入原来的问题。 – hekevintran 2010-03-07 03:26:28

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

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

我使用M-x rgrep来做到这一点。它会自动跳过许多你不想要的东西,比如.svn目录。

+2

差不多...但您仍然必须手动指定搜索的开始位置。 – jrockway 2010-03-04 22:58:44

+2

'rgrep'很棒,但是像jrockaway说的那样,能够完全绕过一些交互提示将会很棒 – 2013-01-07 22:51:38

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

eprojecteproject-grep,这正是你想要的。

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

+0

你刚刚下了几个其他的答案,其中没有一个是真的错,包括一个应该提供*与您链接到的您的这个项目功能相同* ...?我想知道你为什么这样做? – 2010-03-04 23:41:25

+0

安装最近的Emacs。 – jrockway 2010-03-05 01:05:12

+0

已安装23.1(需要进行项目)。 eproject工程!注意你必须配置你想要eproject搜索的每个语言/项目文件。最后,在搜索它认为在你的项目中的所有文件后,eproject运行grep注释。 – 2010-03-05 02:01:52

查看关于如何Icicles能在这里帮助这些链接信息:

  • find files anywhere,匹配他们的名字的任何部分(包括目录部分)
  • projects:创建,组织,管理,搜索他们

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

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

+0

这就是ssooooo与CtrlP的功能非常接近......我一直在寻找类似这样的东西...永远:D ... (现在,只是isntead “Ctrl + P”我正在使用“Alt + T”:) ...) – 2015-05-01 19:28:26

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