Al proyectil con almacenamiento en caché no le gustan los archivos nuevos

9

Yo uso proyectil para mi proyecto de navegación. He visto que es muy lento, así que activé el almacenamiento en caché. Ahora es rápido (no tremendamente rápido, tristemente).

Si creo un nuevo archivo fuera de emacs, el proyectil no lo encuentra. Puedo ejecutar la invalidación de caché, pero eso lleva unos minutos. ¿Cómo arreglar esto?

lukas.pukenis
fuente
Puede abrir el archivo y agregarlo manualmente al caché con M-x projectile-cache-current-file. Si no desea, Emacs debe atravesar todo el árbol en busca de archivos, por lo que no se pueden realizar optimizaciones.
PythonNut
1
Sugiero abrir una solicitud de función para admitir la filenotify.elbiblioteca incorporada , que creo que permitiría que el proyectil rastree los cambios del directorio y, en consecuencia, se le informe cuando se creó (o eliminó) un nuevo archivo (o directorio para el seguimiento) para que pueda agregar automáticamente (o eliminar) los archivos a / del caché. Las notificaciones de directorio no son recursivas, por lo que esta característica implicaría rastrear independientemente cada directorio en el proyecto. No sé si eso incurriría en sanciones notables para un gran árbol de proyectos.
phils

Respuestas:

4

Use el argumento prefijo, es decir, C-u C-c p fpara invalidar rápidamente y buscar archivos en el proyecto. La sugerencia en el comentario sobre el uso projectile-cache-current-filees técnicamente correcta, pero hay un enlace find-fileque automáticamente llama a esto en cada archivo nuevo que se abre. Esa será la solución más rápida sin invalidar el caché existente.

Sin embargo, parece que el problema real es que lleva demasiado tiempo reconstruir el caché atravesando el árbol. Para esto, ayudaría si hubiera un poco más de información sobre su entorno. De forma predeterminada, projectile-indexing-methodestá configurado 'nativeen Windows, lo que prefiere una implementación de Elisp, findya que es más portátil. De lo contrario, utiliza un 'alienmétodo, es decir git ls, findetc. Si está en Linux, el método alienígena está habilitado de forma predeterminada.

De lo contrario, es posible que desee perseguir la madriguera del conejo de projectile-get-repo-filesy projectile-get-ext-command. Especifican dónde busca el proyectil la lista de archivos. Es posible que pueda anular esto con directorios locales o similares para forzar un método de búsqueda más rápido.

dgtized
fuente
2

Esto no acelera el almacenamiento en caché del archivo, pero ahorra el paso manual de tener que invalidar el caché obsoleto (que no contiene el nuevo archivo).

El proyectil invalida automáticamente la memoria caché si el /your/projectile/project/root/.projectilearchivo es más nuevo que el archivo de memoria caché del proyecto.

Esta comprobación se realiza cada vez que intenta encontrar cualquier archivo en el proyecto usando proyectil; projectile-find-fileo C-c p fsi uno de los comandos que hace esto verifica primero.

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

- Desde la projectile.elfuente - líneas 575-579

Entonces, la solución es touchel .projectilearchivo cuando actualiza el proyecto. Por ejemplo, puede aliasel git commit, git pull, etc para hacer

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

después de hacer lo que estaba haciendo con los gitcomandos.

Entonces, si alguien en su equipo agrega un nuevo archivo al proyecto y (suponiendo que esté usando git para el control de versiones) use su extracción de git con alias especial, la caché se invalidará automáticamente projectile-find-filela próxima vez.

Kaushal Modi
fuente