Projétil com armazenamento em cache não gosta de novos arquivos

9

Eu uso projétil para a minha navegação no projeto. Vi que é muito lento, então ativei o cache. Agora é rápido (não muito rápido, infelizmente).

Se eu criar um novo arquivo fora do emacs, o projétil não o encontrará. Posso executar a invalidação do cache, mas isso leva alguns minutos. Como consertar isto?

lukas.pukenis
fonte
Você pode abrir o arquivo e adicioná-lo manualmente ao cache com M-x projectile-cache-current-file. Se você não quiser, o Emacs deve percorrer a árvore inteira procurando arquivos, para que nenhuma otimização possa ser feita.
precisa saber é o seguinte
11
Sugiro abrir uma solicitação de recurso para dar suporte à filenotify.elbiblioteca incorporada , que acredito que permitiria ao projétil rastrear alterações de diretório e, consequentemente, ser informado quando um novo arquivo (ou diretório para rastreamento) foi criado (ou excluído) para que ele pudesse adicionar automaticamente (ou remova) os arquivos para / do cache. As notificações do diretório não são recursivas; portanto, esse recurso implicaria o rastreamento independente de todos os diretórios do projeto. Não sei se isso resultaria em penalidades perceptíveis para uma grande árvore de projeto.
Phillip #

Respostas:

4

Use o argumento prefix, ou seja, C-u C-c p fpara invalidar rapidamente e encontrar arquivos no projeto. A sugestão no comentário sobre o uso projectile-cache-current-fileé tecnicamente correta, mas existe um gancho find-fileque chama automaticamente isso a cada novo arquivo que é aberto. Essa será a solução mais rápida sem invalidar o cache existente.

No entanto, parece que o problema real é que leva muito tempo para reconstruir o cache percorrendo a árvore. Por isso, ajudaria se houvesse um pouco mais de informação sobre seu ambiente. Por padrão, projectile-indexing-methodé definido como 'nativeno windows, que prefere uma implementação elisp find, pois é mais portátil. Caso contrário, ele usa um 'alienmétodo, ou seja git ls, findetc. Se você estiver no Linux, o método alienígena é ativado por padrão.

Caso contrário, você pode perseguir a toca do coelho de projectile-get-repo-filese projectile-get-ext-command. Eles especificam onde o projétil procura a lista de arquivos. É possível que você substitua isso por dir-locals ou similares para forçar um método de pesquisa mais rápido.

dgtized
fonte
2

Isso não acelera o armazenamento em cache do arquivo, mas salva a etapa manual de invalidar o cache antigo (que não contém o novo arquivo).

O projétil invalida automaticamente o cache se o /your/projectile/project/root/.projectilearquivo for mais novo que o arquivo de cache do projeto.

Essa verificação é feita sempre que você tenta encontrar qualquer arquivo no projeto usando projétil; projectile-find-fileou C-c p fse um dos comandos que fizer isso for verificado primeiro.

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

- Da projectile.elfonte - linhas 575-579

Portanto, a solução é toucho .projectilearquivo quando você atualiza o projeto. Por exemplo, você pode aliaso git commit, git pull, etc fazer

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

depois de fazer o que você estava fazendo com os gitcomandos.

Portanto, se alguém da sua equipe adicionar um novo arquivo ao projeto e (supondo que você esteja usando o git para o controle de versão) use seu pull especial do git com alias, o cache será invalidado automaticamente projectile-find-filena próxima vez.

Kaushal Modi
fonte