#emacs
#emacs
Вопрос:
В vim есть этот удивительный плагин под названием command-t, который позволяет вам выполнять нечеткий поиск по всем файлам в вашем проекте. У нас есть довольно большое приложение rails с кучей файлов, и оно способно обрабатывать его практически без каких-либо замедлений.
попробовал несколько вещей (например, ffip, command-t от textmate.el и rinari-find-in-project от rinari). Пользовательский интерфейс отличный (I <3 flex), но проблема, с которой они все сталкиваются, заключается в том, что в большом проекте производительность настолько плоха, что становится непригодной для использования.
В настоящее время я больше использую команды навигации rinaris и ido-find-file. Между ними двумя это удобная настройка, но было бы неплохо иметь сумасшедшую быструю нечеткую находку в проекте.
Кто-нибудь знает более эффективный сценарий, чем тот, который я пробовал?
Комментарии:
1. Вот еще несколько пакетов, которые делают что-то вроде этого: emacswiki.org/emacs/LocateFilesAnywhere
2. Попробуйте M-x что-нибудь, если вы еще этого не делали, для сравнения
3. Я опубликовал свое решение, основанное на чем угодно, ниже. Дайте мне знать, если у вас возникнут какие-либо проблемы с этим.
Ответ №1:
Представитель github для моей разработки здесь: https://github.com/lewang/anything-project-files
Я добавил еще несколько источников anything, чтобы anything-project-find мог быть заменой «C-x b». Итак, идея в том, что когда вы нажимаете «C-x b», вы заполняете существующие буферы, последние файлы через recentf (лично я взломал его, чтобы использовать вместо этого «session.el», но это небольшая разница), файлы в текущем каталоге, файлы в текущем проекте. Я нахожу это довольно удобным.
Я использовал это какое-то время, но оно плохо протестировано, поэтому, пожалуйста, сообщайте о любых обнаруженных ошибках.
Комментарии:
1. Это довольно здорово 🙂 моя проблема в том, что наш проект насчитывает около 6,5 тыс. файлов, и все (по крайней мере, на моем ноутбуке) задыхается от такого количества материала. Собираюсь попробовать это на моем i7 на работе, и если это не сработает, создайте несколько разных источников, ограниченных определенными каталогами (например, тесты составляют 1,5 тыс. от общего количества файлов), хотя спасибо за это, уверен, что это тот путь, по которому я собираюсь идти
2. В моем проекте 2,5 тыс. «интересных» файлов. Я просто увеличил его до 7.5k для теста, и все работает нормально. Загружается примерно за то же время — около 0,5 секунды на моем 2.5 ГГц core-2-duo MBP.
3. время загрузки в порядке, это когда вы пытаетесь сузить результаты. итак, в моем файловом проекте 6.5k в нем есть папка skus с файлом show.html.erb и файлом index.html.erb. когда я ищу «skus show», возникает заметная пауза, пока он находит файл. когда я пытаюсь удалить «показать» и заменить его на «индекс», возникает гораздо более длительная пауза. Я имею в виду, что меня не так сильно волнуют миграции (это> 1 тыс. файлов), и если я смогу использовать тесты (более 1,5 тыс. файлов) в своих собственных целях, надеюсь, этого будет достаточно, чтобы избавиться от (или уменьшить) пауз
4. Я все еще не могу воспроизвести замедление. Может быть, вы можете отправить мне вывод «find_interesting <rails_root>» на github?
5. Сейчас эта ссылка 404s . Где я могу найти обновленный репозиторий?
Ответ №2:
Попробуйте https://github.com/redguardtoo/find-file-in-project которые используют GNU Find
или BSD Find
для поиска файлов. Ничто не может превзойти скорость C!
M-x find-file-in-project-by-selected
это единственная команда, которую вам нужно использовать.
Я протестировал более 50000 файлов на каком-то нетбуке каменного возраста без каких-либо проблем.
По умолчанию он использует efficient ivy-mode
для фильтрации кандидата и ido-mode
в качестве запасного варианта. Я тестировал ivy-mode с тремя миллионами кандидатов. Теперь вы понимаете, что Emacs Lisp сам по себе достаточно быстр.
В * nix ядро предоставляет кэш для find
, поэтому, если вы ищете файлы с одинаковыми входными данными, ответ будет мгновенным.
Кроме того, ivy-mode
последние результаты поиска автоматически кэшируются в переменной Emacs lisp ivy-last
, поэтому вы можете M-x ivy-resume
получить предыдущих кандидатов, не беспокоясь Find
.
Вы можете (setq my-cached-result ivy-last)
сохранить ivy-last
его в другую переменную. Затем вы можете M-x my-ivy-resume
:
(defun my-ivy-resume ()
(interactive)
(let* ((ivy-last (if my-cached-result my-cached-result ivy-last))
(default-directory (ffip-get-project-root-directory)))
(ivy-resume)))
Таким образом, вы можете сохранить последние 1000 результатов и повторно использовать их 😉
ОБНОВЛЕНИЕ 1: начиная с версии 6, ffip использует встроенный API Emacs completing-read
вместо ivy-read
. Таким образом, специфичная для ivy функция, подобная ivy-resume
, пока недоступна. Вы можете понизить версию до версии 5. ffip — это всего лишь один файл Emacs Lisp, использующий только встроенный API Emacs, поэтому его легко понизить.
Или подождите, пока ivy исправит проблему (см. https://github.com/abo-abo/swiper/pull/2785 )
ОБНОВЛЕНИЕ 2: начиная с версии 6.1.1, я добавил команду ffip-find-files-resume
. Он более мощный, чем ivy-resume
. Например, он может воспроизвести любое предыдущее действие. ivy-resume
может воспроизводить только последнее действие.
Комментарии:
1.
my-viy-resume gives:
Последний сеанс несовместим с ошибкой ivy-resume, как мы можем это исправить?2. Понижение до версии 5.
Ответ №3:
Зависит от того, что вы подразумеваете под нечетким сопоставлением. Большинство нечетких сопоставлений по своей сути медленные, но некоторые легкие псевдочеткие алгоритмы работают довольно быстро. Вообще говоря, вам, вероятно, лучше использовать поиск по регулярным выражениям, а не поиск по нечеткому совпадению.
В любом случае, вопрос состоит из двух частей:
- Определение проекта как заданного набора файлов и каталогов.
- Поиск по файлам и каталогам проекта — все или некоторые
Icicles могут помочь с обоими:
- определение проекта, управление и т. Д.
- Поиск в проекте или его частях:
- Поиск содержимого файла (и поиск и замена)
- Поиск файлов
Комментарии:
1. изучение icicles и anything eproject прямо сейчас обновит ситуацию, как только я вложу в нее немного больше работы
2. У меня есть решение, основанное на anything rinari моем пользовательском ruby-скрипте, который использует .gitignore для поиска только полезных файлов. У него есть кэширование, и он быстро разделяется, как версии slickedit textmate. 😉 К сожалению, у меня не будет времени упаковать его до этих выходных. Я опубликую его в качестве ответа, когда сделаю.
3. @event_jr это звучит просто восхитительно: D
Ответ №4:
Вы можете попробовать gpicker. Если вы пройдете -t guess
, он попытается найти соответствующие файлы через серверную часть scm, такую как git.
Я использую следующий фрагмент для поиска файла в проекте, где корень проекта определяется eproject.
(require 'iy-dep)
(defcustom iy-gpicker-cmd (executable-find "gpicker")
"Default font"
:type 'file
:group 'iy-config)
(defun iy-gpicker-find-file (dir)
(interactive
(list
(or (and current-prefix-arg (ido-read-directory-name "gpicker: " nil nil t))
(and (boundp 'eproject-root) eproject-root)
(and (not current-prefix-arg) (ido-read-directory-name "gpicker: " nil nil t))
(if dired-directory (expand-file-name dired-directory) default-directory))))
(when dir
(with-temp-buffer
(call-process iy-gpicker-cmd nil (list (current-buffer) nil) nil
"-t" "guess" "-m" dir)
(cd dir)
(dolist (file (split-string (buffer-string) ""))
(unless (string-equal file "")
(find-file file))))))
(provide 'iy-gpicker)
Комментарии:
1. это выглядит очень интересно. ATM im использует fuzzy-file-finder, который зависит от ruby gem (который я на самом деле не фанат), я попробую gpicker
Ответ №5:
Возможно, вам нужны IdUtils, но, не будучи знакомым со всеми другими технологиями, которые вы упоминаете, я не могу быть уверен.