带缓存的弹丸不喜欢新文件


9

我将弹丸用于项目浏览。我已经看到它真的很慢,所以我打开了缓存。现在快了(可悲的是,速度并不快)。

如果我在emacs本身之外创建一个新文件,则Projectile找不到它。我可以运行缓存失效,但这需要几分钟。如何解决这个问题?


您可以打开文件,然后使用手动将其添加到缓存中M-x projectile-cache-current-file。如果您不想这样做,那么Emacs 必须遍历整个树以查找文件,因此无法进行优化。
PythonNut 2015年

1
我建议打开一个功能请求以支持内置filenotify.el库,我相信这将使射弹能够跟踪目录更改,并因此在创建(或删除)新文件(或用于跟踪的目录)时得到通知,以便可以自动添加(或从缓存中删除)文件。目录通知不是递归的,因此此功能将需要独立跟踪项目中的每个目录。我不知道这是否会对大型项目树造成任何明显的惩罚。
phils 2015年

Answers:


4

使用prefix参数,即C-u C-c p f快速使项目中的文件无效并使之查找。注释中有关使用的建议在projectile-cache-current-file技术上是正确的,但是有一个钩子可以在find-file打开的每个新文件上自动调用该钩子。这将是最快的解决方案,而不会使现有缓存无效。

但是,听起来像是真正的问题,因为遍历树来重建缓存需要太长时间。为此,如果有关于您的环境的更多信息,这将有所帮助。默认情况下projectile-indexing-method'native在Windows上将其设置为,find由于它更易于移植,因此首选elisp实现。否则,它将使用'alien方法,即git lsfind等。如果您使用的是Linux,则默认情况下会启用Alien方法。

否则,您可能想追逐projectile-get-repo-files和的兔子洞projectile-get-ext-command。它们指定了射弹在何处查找文件列表。您可能会用dir-locals或类似内容覆盖此值,以强制使用更快的查找方法。


2

这不会加快文件缓存的速度,但是节省了使无效缓存(不包含新文件)无效的手动步骤。

如果/your/projectile/project/root/.projectile文件比项目缓存文件新,则Projectile自动使缓存无效。

每当您尝试使用Projectile在项目中查找任何文件时,都会执行此检查。projectile-find-fileC-c p f执行此操作的命令之一是否先检查。

(defun projectile-maybe-invalidate-cache (force)
  "Invalidate if FORCE or project's dirconfig newer than cache."
  (when (or force (file-newer-than-file-p (projectile-dirconfig-file)
                                           projectile-cache-file))
    (projectile-invalidate-cache nil)))

-从projectile.el源头开始 -575-579行

因此解决方案是在更新项目时touch使用.projectile文件。例如,你可以aliasgit commitgit pull等做

touch /your/projectile/project/root/.projectile` 

使用git命令执行完所有操作后。

因此,如果您团队中的某人向项目中添加了一个新文件,并且(假设您正在使用git进行版本控制)您使用了特殊的别名git pull,projectile-find-file则下次执行该操作时,缓存将自动失效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.