Ai proiettili con memorizzazione nella cache non piacciono i nuovi file


9

Uso il proiettile per la navigazione del mio progetto. Ho visto che è molto lento, quindi ho attivato la memorizzazione nella cache. Ora è veloce (non incredibilmente veloce, purtroppo).

Se creo un nuovo file all'esterno di emacs stesso, il proiettile non lo trova. Posso eseguire l'annullamento della cache ma ciò richiede alcuni minuti. Come risolvere questo?


È possibile aprire il file e aggiungerlo manualmente alla cache con M-x projectile-cache-current-file. Se non si desidera, Emacs deve attraversare l'intero albero alla ricerca di file, quindi non è possibile effettuare ottimizzazioni.
PythonNut

1
Suggerisco di aprire una richiesta di funzionalità per supportare la filenotify.ellibreria integrata , che credo consentirebbe al proiettile di tenere traccia delle modifiche alla directory e di conseguenza essere informato quando viene creato (o eliminato) un nuovo file (o directory per il monitoraggio) in modo che possa aggiungere automaticamente (o rimuovi) i file nella / dalla cache. Le notifiche delle directory non sono ricorsive, quindi questa funzionalità comporterebbe il monitoraggio indipendente di tutte le directory del progetto. Non so se ciò comporterebbe sanzioni evidenti per un grande albero del progetto.
phils,

Risposte:


4

Utilizzare l'argomento prefisso, ovvero C-u C-c p fper invalidare rapidamente e trovare i file nel progetto. Il suggerimento nel commento sull'uso projectile-cache-current-fileè tecnicamente corretto, ma c'è un gancio find-fileche lo chiama automaticamente su ogni nuovo file che viene aperto. Questa sarà la soluzione più veloce senza invalidare la cache esistente.

Tuttavia, sembra che il vero problema sia che ci vuole troppo tempo per ricostruire la cache attraversando l'albero. Per questo sarebbe utile se ci fossero un po 'più di informazioni sul tuo ambiente. Per impostazione predefinita, projectile-indexing-methodè impostato 'nativesu Windows, che preferisce un'implementazione elisp di findin quanto è più portatile. Altrimenti usa un 'alienmetodo, cioè git ls, findecc. Se sei su Linux, il metodo alien è abilitato di default.

Altrimenti potresti voler inseguire la tana del coniglio di projectile-get-repo-filese projectile-get-ext-command. Specificano dove il proiettile cerca l'elenco dei file. È possibile che tu possa sovrascriverlo con dir-local o simili per forzare un metodo di ricerca più veloce.


2

Questo non accelera la memorizzazione nella cache dei file ma salva il passaggio manuale di dover invalidare la cache non aggiornata (che non contiene il nuovo file).

Il proiettile invalida automaticamente la cache se il /your/projectile/project/root/.projectilefile è più recente del file di cache del progetto.

Questo controllo viene eseguito ogni volta che si tenta di trovare qualsiasi file nel progetto usando il proiettile; projectile-find-fileo C-c p fse uno dei comandi che fa questo controlla prima.

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

- Dalla projectile.elfonte - righe 575-579

Quindi la soluzione è quella touchdel .projectilefile quando si aggiorna il progetto. Ad esempio, è possibile aliasla git commit, git pullecc fare

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

dopo aver fatto quello che stavi facendo con i gitcomandi.

Quindi, se qualcuno nel tuo team aggiunge un nuovo file al progetto e (supponendo che tu stia usando git per il controllo della versione) usi il tuo speciale git pull con alias, la cache verrà automaticamente invalidata projectile-find-filela volta successiva.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.