emacs - как сделать поиск по файлу в подкаталогах
Я хотел бы реализовать что-то вроде функции Resharper "Go To File" для Emacs. Когда кто-то нажимает упомянутый ярлык, Resharper открывает текстовое поле, которое принимает подстановочную строку и отображает меню автозаполнения, в котором перечислены все файлы в проекте, которые соответствуют этому подстановочному знаку:
http://www.jetbrains.com/resharper/features/screenshots/50/navigation_gotofile.png
На данный момент я знаю грубый способ достичь чего-то более или менее эквивалентного. Это включает в себя бег dired
с -lR
а затем вызывать dired-isearch-filenames
- это начнет инкрементный поиск по всей иерархии файлов внутри определенного корневого каталога.
UPD. Я также знаю о возможности открытия загрузок буферов, хранения их всех в памяти и использования switch-to-buffer
, Это решение прекрасно работает с ido
хотя это не на 100% пуленепробиваемый (что, если некоторые файлы будут добавлены или удалены?). Это также не очень хорошо с tabbar
, поскольку на вкладках будут отображаться все файлы, которые включены в проект, но не подмножество проекта, которое представляет мой текущий контекст.
Тем не менее, это показывает много ненужной информации и не хватает автозаполнения. Я посмотрел на ido
а также icicles
, но они, кажется, работают поверхностно, только в пределах текущего каталога. Есть ли плагин Emacs, который поможет мне достичь моей цели?
4 ответа
Хотя вы можете не захотеть держать много буферов открытыми, вы можете подключить IDO к recentf
, который отслеживает недавно открытые файлы:
(recentf-mode 1)
(setq recentf-max-saved-items 300)
(defun ido-choose-from-recentf ()
"Use ido to select a recently opened file from the `recentf-list'"
(interactive)
(find-file (ido-completing-read "Open file: " recentf-list nil t)))
(global-set-key [(meta f11)] 'ido-choose-from-recentf)
Я использую этот трюк в течение многих лет, и это 99% всех необходимых мне переключений файлов.
Помимо этого, я использую M-x rgrep
и вы также можете посмотреть на M-x find-dired
а также M-x find-grep-dired
,
Для получения дополнительных опций, проверьте ответы на этот похожий вопрос.
В Projectile есть функция с именем projectile-jump-to-project-file, которая делает более или менее то, что вы хотите. Есть также https://github.com/bbatsov/find-file-in-project - более простая утилита, но зависящая от наличия GNU find.
Вы уже попробовали шлем? Вы можете легко выбрать поиск файлов, буферов, команд и многое другое.
Вы упомянули сосульки, но по ошибке вы подумали, что они "работают неглубоко". Это работает так, как вы хотите. Вы можете найти любой файл в вашей системе, если хотите, соответствующий любой части имени файла и пути. И вы можете определить проект конкретных файлов и / или каталогов, сохранить его определение, а затем искать только среди этих файлов / каталогов. (Наборы файлов Emacs являются строгим подмножеством этой функции, но вы можете напрямую использовать наборы файлов точно так же.)
Это должно помочь (см. Также ссылки в конце этой страницы):