emacs在一个大项目的项目中查找文件

时间:2011-11-01 17:45:48

标签: emacs

在vim中,有一个名为command-t的神奇插件,可让您模糊搜索项目中的所有文件。我们有一个相当大的rails应用程序,有大量的文件,它能够处理它几乎没有任何减速。

尝试了一些事情(比如ffip,textmate.el的命令-t和rinari的rinari-find-in-project)。用户界面非常棒(我< 3 flex),但他们所有的问题都出在一个大型项目中,性能很差,无法使用。

目前我正在更多地使用rinaris导航命令和ido-find-file。在它们两者之间它是一个可用的设置,但在项目中有一个疯狂的快速模糊查找会很好。

有没有人知道一个更高效的脚本然后我尝试了什么?

5 个答案:

答案 0 :(得分:2)

取决于模糊匹配的含义。大多数模糊匹配本身就很慢,但是一些轻量级的伪模糊算法非常快。一般来说,使用 regexp 搜索可能会更好,而不是模糊匹配搜索。

无论如何,问题分为两部分:

  • 将项目定义为一组给定的文件和目录。
  • 搜索项目文件&目录 - 全部或部分

Icicles可以帮助我们:

答案 1 :(得分:2)

我的混合物的github代表在这里:https://github.com/lewang/anything-project-files

我添加了一些更多的资源,以便任何东西 - 项目 - 查找都可以替代“C-x b”。所以这个想法是当你点击“Cx b”你正在完成现有的缓冲区,最近的文件通过recentf(我个人认为它使用“session.el”而不是它,但它是一个小差异),当前目录中的文件,文件中当前的项目。我发现它非常方便。

我已经使用了一段时间,但它没有经过充分测试,所以请报告您发现的任何错误。

答案 2 :(得分:2)

您可以尝试gpicker。如果您通过-t guess,它会尝试通过scm后端(如git)找出相关文件。

我使用以下代码段在项目中查找文件,项目根目录由eproject确定。

(require 'iy-dep)

(defcustom iy-gpicker-cmd (executable-find "gpicker")
  "Default font"
  :type 'file
  :group 'iy-config)

(defun iy-gpicker-find-file (dir)
  (interactive
   (list
    (or (and current-prefix-arg (ido-read-directory-name "gpicker: " nil nil t))
        (and (boundp 'eproject-root) eproject-root)
        (and (not current-prefix-arg) (ido-read-directory-name "gpicker: " nil nil t))
        (if dired-directory (expand-file-name dired-directory) default-directory))))
  (when dir
    (with-temp-buffer
      (call-process iy-gpicker-cmd nil (list (current-buffer) nil) nil
                    "-t" "guess" "-m" dir)
      (cd dir)
      (dolist (file (split-string (buffer-string) "\0"))
        (unless (string-equal file "")
          (find-file file))))))

(provide 'iy-gpicker)

答案 3 :(得分:2)

尝试https://github.com/technomancy/find-file-in-project使用GNU FindBSD Find查找文件。什么都不能超过C的速度!

M-x find-file-in-project-by-selected是您需要使用的唯一命令。

我在一些石头老化的上网本上测试了50000多个文件而没有任何问题。

默认情况下,它会使用有效的ivy-mode来过滤候选者,并使用ido-mode作为后备。我用 300万候选人测试了常春藤模式。现在你明白了Emacs Lisp本身就足够快了。

在* nix,内核为find提供缓存,因此如果您使用相同的输入搜索文件,则响应是即时的。

此外,ivy-mode会自动将最后搜索结果缓存在Emacs lisp变量ivy-last中,因此您可以M-x ivy-resume获取以前的候选人,而不必费心Find

您可以(setq my-cached-result ivy-last)ivy-last存储到另一个变量中。然后你可以M-x my-ivy-resume

(defun my-ivy-resume ()
  (interactive)
  (let* ((ivy-last (if my-cached-result my-cached-result ivy-last))
         (default-directory (ffip-get-project-root-directory)))
    (ivy-resume)))

通过这种方式,您可以存储最后1000个结果并重复使用它们;)

答案 4 :(得分:0)

您可能需要IdUtils,但不熟悉您提及的所有其他技术我无法确定。