Emacs: открытие любого файла в большом репо
Что мне нужно
быстрый/эффективный способ открыть любой файл под большим (git
) репо (файлы ~ 9.8k).
Контекст
Я пробовал различные решения, например Textmate.el
и find-file-in-repository
. Я нашел эти решения с помощью предыдущих SO-вопросов, таких как this и и через LocateFilesAnywhere EmacsWiki.
Несмотря на то, что оба решения прекрасно работают с репозиториями с небольшим размером хранилища, в этом случае они практически непригодны для использования. Когда я начну вводить имя файла, задержка несколько секунд, прежде чем я увижу какой-либо результат. И изменение любой части поиска очень отстает.
Я думаю, что основная проблема заключается в том, что при вводе любого символа emacs
/find-file-in-repository
запускается команда оболочки (git ls-files...
). Мне действительно нужно только сделать это, когда я перестаю печатать.
Вопросы
- Есть ли лучшая библиотека для этого прецедента?
- Если нет, как я могу ввести задержку в команду при наборе текста? то есть, когда я находится в
find-file-in-repository
, я хочу, чтобы команда find вызывается только тогда, когда я прекращаю печатать (допустим, пробел 300 мс).
Ответы
Ответ 1
Резюме
После того, как я получил три ответа, я попробовал их (также отвечая на мой собственный вопрос, поскольку ни один из вышеперечисленных решений не работал у меня). Наконец я остановился на helm-ls-git
. Здесь сравнение с моей точкой зрения:
- потребовалось около 30 минут для индексации репо. Поскольку снаряд не знает о
.gitignore
, фактическое количество файлов больше похоже на 52k.
- может быть настроен, но что-то, что только работает (т.е. понимает git), является предпочтительным
- может потребоваться время от времени отменять повторный индекс кэша. Это было бы дорогостоящим и частым, так как новые файлы добавляются каждый день к репо.
- выглядел хорошо из описания и источника.
- трудно установить, так как он не опубликован в melpa/marmalade и т.д. Подробнее в этот вопрос Я открыл.
GNU Global
- Не пыталась, так как у него, вероятно, были те же проблемы, что и у Projectile (git -unaware, ему нужен "индекс", который может потребоваться время от времени)
event-jr ответить, однако открыли еще несколько вариантов: я не знал о helm
до Теперь. Глядя на melpa для плагинов, связанных с шлемом, я нашел следующее:
- Это выглядело действительно многообещающим.
- Было легко установить с помощью
package.el
, так как он в melpa
- Я также использую и люблю
magit
- так это выглядело хорошо.
- Тем не менее, он не работал с ошибкой
magit-git-dir: symbol is void
. Не погружался слишком много, но похоже, что его нужно обновлять. Открыто проблема
- Как говорится в readme, это независимое от магии.
- До сих пор работала чудесно. Простота установки (melpa) и быстро.
Ответ 2
Я использую GNU для этого. У меня около 20K файлов в моем проекте. Вы можете запустить
M-x gtags-find-file
и введите первые несколько символов. TAB завершит и покажет все соответствия. Вы можете ввести любые символы, которые являются частью имени файла, и нажмите клавишу ввода. Покажет все файлы, содержащие эти символы.
Я пытался использовать для этого снаряд. Но это было слишком медленно для "индексации проекта". Он не завершил индексирование даже через 1,5 часа, и я должен его убить!. Не уверен, что здесь что-то не так. GNU global намного быстрее и завершает создание всего тэга в течение 15 минут.
Ответ 3
Я использую helm-cmd-t
счастливо. Он будет кэшировать список файлов в памяти. Элементы управления кешем достаточно гибкие для моих нужд.
Я просто ответил на ваш вопрос о новом адресе репо:
fooobar.com/questions/485254/...
Это https://github.com/lewang/helm-cmd-t
Ответ 4
Вы можете проверить Projectile. Он был создан, чтобы обеспечить что-то похожее на C-p
, но также имеет множество дополнительных функций уровня проекта. Первоначальная индексация проекта будет довольно медленной в таком крупном проекте, но после этого Projectile будет кэшировать файлы проекта (как в памяти, так и на жестком диске), а последующие вызовы снарядов должны быть почти мгновенными.
У снаряда также есть плагин Helm для отображения файлов проектов и буферов с помощью Helm.