在vim中,有一个名为command-t的神奇插件,可让您模糊搜索项目中的所有文件。我们有一个相当大的rails应用程序,有大量的文件,它能够处理它几乎没有任何减速。
尝试了一些事情(比如ffip,textmate.el的命令-t和rinari的rinari-find-in-project)。用户界面非常棒(我< 3 flex),但他们所有的问题都出在一个大型项目中,性能很差,无法使用。
目前我正在更多地使用rinaris导航命令和ido-find-file。在它们两者之间它是一个可用的设置,但在项目中有一个疯狂的快速模糊查找会很好。
有没有人知道一个更高效的脚本然后我尝试了什么?
答案 0 :(得分:2)
取决于模糊匹配的含义。大多数模糊匹配本身就很慢,但是一些轻量级的伪模糊算法非常快。一般来说,使用 regexp 搜索可能会更好,而不是模糊匹配搜索。
无论如何,问题分为两部分:
Icicles可以帮助我们:
Project 定义,管理等
搜索项目或部分项目:
Searching file content(以及搜索和替换)
答案 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 Find
或BSD 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,但不熟悉您提及的所有其他技术我无法确定。