Projectile avec mise en cache n'aime pas les nouveaux fichiers

9

J'utilise projectile pour la navigation de mon projet. J'ai vu que c'est vraiment lent, j'ai donc activé la mise en cache. Maintenant, c'est rapide (pas extrêmement rapide, malheureusement).

Si je crée un nouveau fichier en dehors d'emacs lui-même, le projectile ne le trouve pas. Je peux exécuter l'invalidation du cache, mais cela prend quelques minutes. Comment régler ceci?

lukas.pukenis
la source
Vous pouvez ouvrir le fichier et l'ajouter manuellement au cache avec M-x projectile-cache-current-file. Si vous ne le souhaitez pas, Emacs doit parcourir toute l'arborescence à la recherche de fichiers, donc aucune optimisation ne peut être effectuée.
PythonNut
1
Je suggère d'ouvrir une demande de fonctionnalité pour prendre en charge la filenotify.elbibliothèque intégrée , ce qui, je crois, permettrait au projectile de suivre les modifications du répertoire et, par conséquent, d'être informé lorsqu'un nouveau fichier (ou répertoire pour le suivi) a été créé (ou supprimé) afin qu'il puisse automatiquement s'ajouter (ou supprimez) les fichiers vers / depuis le cache. Les notifications d'annuaire ne sont pas récursives, donc cette fonctionnalité impliquerait un suivi indépendant de chaque annuaire du projet. Je ne sais pas si cela entraînerait des pénalités notables pour un grand arbre de projet.
phils

Réponses:

4

Utilisez l'argument préfixe, c'est- C-u C-c p fà- dire pour invalider rapidement et rechercher des fichiers dans le projet. La suggestion dans le commentaire sur l'utilisation projectile-cache-current-fileest techniquement correcte, mais il existe un crochet find-filequi l'appelle automatiquement à chaque nouveau fichier ouvert. Ce sera la solution la plus rapide sans invalider le cache existant.

Cependant, il semble que le vrai problème est qu'il faut trop de temps pour reconstruire le cache en traversant l'arborescence. Pour cela, il serait utile d'avoir un peu plus d'informations sur votre environnement. Par défaut, il projectile-indexing-methodest défini 'nativesur Windows, ce qui préfère une implémentation Elisp findcar il est plus portable. Sinon, il utilise une 'alienméthode, c'est-à-dire git ls, findetc. Si vous êtes sous Linux, la méthode extraterrestre est cependant activée par défaut.

Sinon, vous voudrez peut-être poursuivre le terrier de lapin de projectile-get-repo-fileset projectile-get-ext-command. Ils spécifient où le projectile recherche la liste des fichiers. Il est possible que vous puissiez remplacer cela par dir-locals ou similaire pour forcer une méthode de recherche plus rapide.

dgtized
la source
2

Cela n'accélère pas la mise en cache des fichiers mais cela évite l'étape manuelle d'avoir à invalider le cache périmé (qui ne contient pas le nouveau fichier).

Projectile invalide automatiquement le cache si le /your/projectile/project/root/.projectilefichier est plus récent que le fichier de cache de projet.

Cette vérification est effectuée chaque fois que vous essayez de trouver un fichier dans le projet en utilisant projectile; projectile-find-fileou C-c p fsi l'une des commandes qui effectue cette vérification en premier.

(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)))

- De la projectile.elsource - lignes 575-579

La solution est donc touchau .projectilefichier lorsque vous mettez à jour le projet. Par exemple, vous pouvez aliasle git commit, git pull, etc à faire

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

après avoir fait tout ce que vous faisiez avec les gitcommandes.

Donc, si quelqu'un de votre équipe ajoute un nouveau fichier au projet et (en supposant que vous utilisez git pour contrôler la version) vous utilisez votre pull git spécial, le cache sera automatiquement invalidé projectile-find-filela prochaine fois.

Kaushal Modi
la source