Снаряд с кэшированием не любит новые файлы

9

Я использую снаряд для просмотра проекта. Я видел, что это действительно медленно, поэтому я включил кеширование. Теперь это быстро (не слишком быстро, к сожалению).

Если я создаю новый файл вне самого emacs, снаряд не находит его. Я могу запустить аннулирование кэша, но это занимает несколько минут. Как это исправить?

lukas.pukenis
источник
Вы можете открыть файл и вручную добавить его в кеш с помощью M-x projectile-cache-current-file. Если вы не хотите, то Emacs должен пройтись по всему дереву в поисках файлов, поэтому никакие оптимизации не могут быть сделаны.
PythonNut
1
Я предлагаю открыть запрос функции для поддержки встроенной filenotify.elбиблиотеки, которая, как я полагаю, позволила бы снаряду отслеживать изменения каталога и, следовательно, получать информацию о создании (или удалении) нового файла (или каталога для отслеживания), чтобы он мог автоматически добавлять (или удалить) файлы в / из кэша. Уведомления о каталогах не являются рекурсивными, поэтому эта функция предполагает независимое отслеживание каждого каталога в проекте. Я не знаю, повлечет ли это какие-либо заметные штрафы за большое дерево проекта.
Филс

Ответы:

4

Используйте префиксный аргумент, то есть, C-u C-c p fчтобы быстро сделать недействительными и найти файлы в проекте. Предложение в комментарии об использовании projectile-cache-current-fileявляется технически правильным, но есть ловушка, find-fileкоторая автоматически вызывает это при каждом открытии нового файла. Это будет самое быстрое решение без аннулирования существующего кэша.

Тем не менее, похоже, что настоящая проблема в том, что перестроение кэша путем обхода дерева занимает слишком много времени. Для этого было бы полезно, если бы было немного больше информации о вашей среде. По умолчанию projectile-indexing-methodв 'nativeWindows установлено значение, которое предпочитает реализацию elisp, findпоскольку оно более переносимо. В противном случае он использует 'alienметод, то есть git ls, findи т.д. Если вы находитесь на Linux метод чужд включен по умолчанию , хотя.

В противном случае вы можете выследить кроличью нору projectile-get-repo-filesи projectile-get-ext-command. Они указывают, где снаряд ищет список файлов. Возможно, вы могли бы переопределить это с помощью dir-locals или подобного, чтобы ускорить поиск.

dgtized
источник
2

Это не ускоряет кеширование файла, но избавляет от необходимости вручную делать недействительным устаревший кеш (который не содержит новый файл).

Снаряд автоматически делает недействительным кеш, если /your/projectile/project/root/.projectileфайл новее, чем файл кеша проекта.

Эта проверка выполняется всякий раз, когда вы пытаетесь найти какой-либо файл в проекте с использованием снаряда; projectile-find-fileили C-c p fесли одна из команд, которая делает это, сначала проверяет.

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

- Из projectile.elисточника - строки 575-579

Таким образом, решение заключается touchв .projectileфайле при обновлении проекта. Например, вы можете , и т.д. , чтобы сделатьaliasgit commitgit pull

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

после всего, что вы делали с gitкомандами.

Поэтому, если кто-то в вашей команде добавляет новый файл в проект и (при условии, что вы используете git для контроля версий), вы используете специальное псевдоним git pull, кеш будет автоматически аннулирован, когда вы сделаете это projectile-find-fileв следующий раз.

Каушал Моди
источник