Emacs:打开大型仓库中的任何文件

时间:2013-01-14 05:52:17

标签: emacs

我需要什么

在大型(git)回购(〜9.8k文件)下打开任何文件的快速/高效方式。

上下文

我尝试了各种解决方案,例如Textmate.elfind-file-in-repository。我通过以前的SO问题找到了这些解决方案,例如thisthis以及LocateFilesAnywhere EmacsWiki

虽然两种解决方案都适用于小型到mdeium回购,但在这种情况下,它们几乎无法使用。当我开始输入文件名时,在看到任何结果之前有几秒钟的延迟。而改变搜索的任何部分也非常滞后。

我认为主要的问题是在输入任何字符时,emacs / find-file-in-repository会启动一个shell命令(git ls-files...)。当我停止输入时,我真的只需要这样做。

问题

  • 这个用例是否有更好的库?
  • 如果没有,当我打字时如何在命令中引入延迟?即当我在find-file-in-repository时,我希望只在我停止输入时调用find-command(让我们说300ms的间隙)。

4 个答案:

答案 0 :(得分:18)

摘要

在我收到三个答案后,我尝试了它们(也回答了我自己的问题,因为上述解决方案都不适合我)。我终于安顿下来了helm-ls-git。以下是我的观点比较:

Projectile

  • 花了大约30分钟来索引回购。由于抛射物不知道.gitignore,实际文件数量更像是52k。
  • 可以定制,但最适合的东西(即理解git)是优选的
  • 可能需要invalidate cache re-index时间。由于新文件每天都会添加到回购邮件中,因此这将是昂贵且频繁的。

helm-cmd-t

  • 从描述和来源看起来很好。
  • 难以安装,因为它没有在melpa / marmalade等中发布。this issue中的更多细节我打开了。

GNU Global

  • 没试过,因为它可能会遇到与Projectile相同的问题(git-unaware,需要它自己的“索引”,可能需要不时维护)
然而

event-jranswer提供了更多选择:直到现在我还没有意识到helm。查看melpa与helm相关的插件,我发现了以下内容:

helm-git

  • 这看起来很有希望
  • 使用package.el很容易安装,因为它位于melpa
  • 我也使用和爱magit - 所以这看起来很合适。
  • 然而,它仍然因magit-git-dir: symbol is void类错误而失败。没有太多潜水,但看起来需要更新。已打开an issue

helm-ls-git

  • 正如自述文件所述,这是独立的。
  • 到目前为止一直表现得非常好。易于安装(melpa)并且速度快。

答案 1 :(得分:2)

我为此使用GNU global。我的项目中有大约20K个文件。你可以跑 M-x gtags-find-file并输入前几个字符。 TAB将完成并显示所有匹配项。您可以键入任何属于文件名的字符,然后按Enter键。将显示包含这些字符的所有文件。

我试图使用抛射物。但对于“项目索引”来说,这太慢了。即使1.5小时后它也没有完成索引,我必须杀掉它!不确定这里有些不对劲。 GNU global速度更快,可在15分钟内完成整个标记的创建。

答案 2 :(得分:1)

我愉快地使用helm-cmd-t。它会将文件列表缓存在内存中。缓存控件足够灵活,可满足我的需求。

我刚才在这里回答了关于新回购地址的问题:

https://stackoverflow.com/a/8025310/903943

这是https://github.com/lewang/helm-cmd-t

答案 3 :(得分:1)

您可以查看Projectile。它基本上是为了提供与C-p类似的东西而创建的,但也有很多额外的项目级功能。在这样一个大项目中,第一次项目索引会相当慢,但之后Projectile将缓存项目文件(内存和硬盘驱动器上),随后的弹丸调用应该几乎是即时的。

Projectile还有一个Helm插件,用Helm显示项目文件和缓冲区。