Pocisk z buforowaniem nie lubi nowych plików

9

Używam pocisku do przeglądania projektu. Widziałem, że jest bardzo powolny, więc włączyłem buforowanie. Teraz jest szybki (nie niesamowicie szybki, niestety).

Jeśli utworzę nowy plik poza samym emacsem, pocisk go nie znajdzie. Mogę uruchomić unieważnienie pamięci podręcznej, ale zajmuje to kilka minut. Jak to naprawić?

lukas.pukenis
źródło
Możesz otworzyć plik i ręcznie dodać go do pamięci podręcznej za pomocą M-x projectile-cache-current-file. Jeśli nie chcesz, to Emacs musi przeglądać całe drzewo w poszukiwaniu plików, więc nie można dokonywać żadnych optymalizacji.
PythonNut,
1
Sugeruję otwarcie żądania funkcji do obsługi wbudowanej filenotify.elbiblioteki, która moim zdaniem umożliwi pociskowi śledzenie zmian w katalogu i w związku z tym zostanie poinformowana, kiedy nowy plik (lub katalog do śledzenia) zostanie utworzony (lub usunięty), aby mógł automatycznie dodać (lub usuń) pliki do / z pamięci podręcznej. Powiadomienia o katalogu nie są rekurencyjne, więc ta funkcja wymagałaby niezależnego śledzenia każdego katalogu w projekcie. Nie wiem, czy pociągnęłoby to za sobą jakiekolwiek zauważalne kary za duże drzewo projektów.
phils

Odpowiedzi:

4

Użyj argumentu przedrostka, tzn. C-u C-c p fAby szybko unieważnić i znaleźć pliki w projekcie. Sugestia w komentarzu dotycząca używania projectile-cache-current-filejest technicznie poprawna, ale istnieje haczyk, find-filektóry automatycznie wywołuje to przy każdym nowym otwieranym pliku. To będzie najszybsze rozwiązanie bez unieważniania istniejącej pamięci podręcznej.

Jednak wydaje się, że prawdziwym problemem jest to, że odbudowanie pamięci podręcznej zajmuje zbyt dużo czasu, przechodząc przez drzewo. Pomoże to, jeśli będzie trochę więcej informacji o twoim środowisku. Domyślnie projectile-indexing-methodjest ustawiony 'nativena Windows, co woli implementację elisp, findponieważ jest bardziej przenośna. W przeciwnym razie to wykorzystuje 'alienmetodę, tj git ls, finditd jeśli jesteś na linux metoda obcy jest domyślnie włączona chociaż.

W przeciwnym razie możesz gonić w dół króliczej nory projectile-get-repo-filesi projectile-get-ext-command. Określają, gdzie pocisk szuka listy plików. Możliwe, że możesz to zastąpić za pomocą katalogów lokalnych lub podobnych, aby wymusić szybszą metodę wyszukiwania.

zdeterminowany
źródło
2

Nie przyspiesza to buforowania plików, ale oszczędza ręcznego kroku unieważnienia przestarzałej pamięci podręcznej (która nie zawiera nowego pliku).

Pocisk automatycznie unieważnia pamięć podręczną, jeśli /your/projectile/project/root/.projectileplik jest nowszy niż plik pamięci podręcznej projektu.

To sprawdzenie jest wykonywane za każdym razem, gdy próbujesz znaleźć dowolny plik w projekcie za pomocą pocisku; projectile-find-filelub C-c p fjeśli jedno z poleceń, które to sprawdza jako pierwsze.

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

- Ze projectile.elźródła - wiersze 575–579

Więc rozwiązanie jest touchw .projectilepliku podczas aktualizacji projektu. Na przykład, można , itp zrobićaliasgit commitgit pull

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

po zrobieniu tego, co robiłeś za pomocą gitpoleceń.

Więc jeśli ktoś z twojego zespołu doda nowy plik do projektu i (zakładając, że używasz git do kontroli wersji) użyjesz specjalnego aliasu ściągnięcia git, pamięć podręczna zostanie automatycznie unieważniona, gdy zrobisz projectile-find-fileto następnym razem.

Kaushal Modi
źródło