Emacs рекурсивный поиск проекта
Я перехожу на Emacs из TextMate. Одна особенность TextMate, которую мне действительно хотелось бы иметь в Emacs, - это окно поиска "Найти в проекте", в котором используется нечеткое сопоставление. Emacs вроде имеет это с ido, но ido не осуществляет рекурсивный поиск по дочерним каталогам. Он ищет только в одном каталоге.
Есть ли способ дать ido корневой каталог и искать все под ним?
Обновить:
Приведенные ниже вопросы относятся к find-file-in-project.el из ответа Михаила Марчика.
Если что-то в этом сообщении кажется очевидным, это потому, что я использовал Emacs меньше недели.:-)
Насколько я понимаю, project-local-variable позволяет мне определять вещи в файле.emacs-project, который я храню в корне своего проекта.
Как мне указать find-file-in-project на корневой каталог моего проекта?
Я не знаком с синтаксисом регулярных выражений в Emacs Lisp. Значение по умолчанию для ffip-regexp:
".*\\.\\(rb\\|js\\|css\\|yml\\|yaml\\|rhtml\\|erb\\|html\\|el\\)"
Я предполагаю, что я могу просто переключить расширения на те, которые подходят для моего проекта.
Не могли бы вы объяснить ffip-find-options? Из файла:
(defvar ffip-find-options "" "Дополнительные параметры для передачи в`find'при использовании find-file-in-project.
Используйте это, чтобы исключить части вашего проекта: \"-not -regex \\".поставщик.\\ "\" ")
Что это значит точно и как я могу использовать его для исключения файлов / каталогов?
Не могли бы вы поделиться примером файла.emacs-project?
8 ответов
(Обновлен в основном для включения актуальных инструкций по настройке для использования с нижеупомянутым find-file-in-project.el из дистрибутива RINARI. Оригинальный ответ остался без изменений; новые биты идут после второго горизонтального правила.)
Взгляните на страницу TextMate в EmacsWiki. Наиболее многообещающей вещью, которую они упоминают, является, вероятно, этот сценарий Emacs Lisp, который обеспечивает рекурсивный поиск по "каталогу проекта", управляемому некоторыми переменными. Этот файл начинается с обширного раздела комментариев, описывающего, как его использовать.
Что делает его особенно многообещающим, так это следующее:
;; If `ido-mode' is enabled, the menu will use `ido-completing-read'
;; instead of `completing-read'.
Заметьте, я не использовал это сам... Хотя я вполне могу попробовать сейчас, когда я нашел это!:-)
НТН.
(Кстати, этот скрипт является частью - цитируя описание из GitHub - "Rinari - это не A Rails IDE (это второстепенный режим Emacs для Rails)". Если вы занимаетесь разработкой на Rails, вы можете захотеть проверить все это.)
Прежде чем продолжить, настройте ido.el. Серьезно, это просто необходимая вещь, и она улучшит ваш опыт поиска файлов в проекте. Посмотрите эту заставку Стюарта Хэллоуэя (о которой я уже упоминал в комментарии к этому ответу), чтобы узнать, почему вам нужно ее использовать. Кроме того, Stu демонстрирует гибкость ido, эмулируя средство поиска файлов в рамках проекта TextMate по-своему; если его функция соответствует вашим потребностям, читайте дальше.
Итак, вот как настроить RINARI find-file-in-project.el
:
получать
find-file-in-project.el
а такжеproject-local-variables.el
из дистрибутива RINARI и поместите туда, где Emacs сможет их найти (что означает в одном из каталогов вload-path
переменная; ты можешь использовать(add-to-list 'load-path "/path/to/some/directory")
добавить новые каталоги к нему).добавлять
(require 'find-file-in-project)
на ваш.emacs
файл. Также добавьте следующее, чтобы иметьC-x C-M-f
Последовательность вызова приглашения find-file-in-project:(global-set-key (kbd "C-x C-M-f") 'find-file-in-project)
,Создайте файл с именем
.emacs-project
в корневом каталоге ваших проектов. Как минимум, он должен содержать что-то вроде этого:(setl ffip-regexp ".*\\.\\(clj\\|py\\)$")
, Это сделает так, что только файлы, чьи имена и вclj
или жеpy
будет произведен поиск; пожалуйста, настройте регулярное выражение в соответствии с вашими потребностями. (Обратите внимание, что это регулярное выражение будет передано в Unixfind
утилита и должна использоватьfind
предпочтительный синтаксис регулярных выражений. Вы все еще должны удваивать каждый обратный слеш в регулярных выражениях, как обычно в Emacs; нужно ли также ставить обратную косую черту перед паренсом / трубами (|
) если вы хотите использовать их "магическое" регулярное выражение, значение зависит от вашегоfind
ожидания. Приведенный выше пример работает для меня на коробке Ubuntu. Поищите дополнительную информацию о регулярных выражениях в случае сомнений.) (Примечание: этот абзац был пересмотрен в последнем редакторе, чтобы исправить некоторую путаницу с синтаксисом регулярных выражений.)C-x C-M-f
далеко.
Есть много возможных настроек; в частности, вы можете использовать (setl ffip-find-options "...")
передать дополнительные опции в Unix find
команда, которая есть что find-file-in-project.el
взывает к под капотом.
Если кажется, что вещи не работают, пожалуйста, проверьте и перепроверьте свою орфографию - я сделал что-то вроде (setl ffip-regex ...)
однажды (обратите внимание на отсутствие конечного 'p' в имени переменной) и изначально были озадачены, обнаружив, что никаких файлов не найдено.
Я использую Mx rgrep для этого. Он автоматически пропускает много вещей, которые вам не нужны, например, каталоги.svn.
Удивлен, никто не упомянул https://github.com/defunkt/textmate.el (теперь нужно заставить его работать на Windows...)
Эпроект имеет eproject-grep
, который делает именно то, что вы хотите.
При правильном определении проекта он будет искать только файлы проекта; он будет игнорировать управление версиями, создавать артефакты, генерируемые файлы, что угодно. Единственным недостатком является то, что она требует команды grep в вашей системе; эта зависимость будет устранена в ближайшее время.
Для чистой скорости я настоятельно рекомендую комбинацию инструмента командной строки The Silver Searcher (aka 'ag') с ag.el. ag-project
Интерактивная функция сделает обоснованное предположение о корне вашего проекта, если вы используете git, hg или svn и выполняете поиск по всему проекту.
Вы можете получить желаемый эффект, используя GNU Global или IDUtils. Они не являются специфичными для Emacs, но у них есть сценарии Emacs, которые интегрируют этот эффект. (Я не знаю слишком много о них сам.)
Вы также можете использовать CEDET и систему проектов EDE. EDE, вероятно, немного тяжелый вес, но у него есть способ просто отметить вершину проекта. Если вы также храните индексные файлы GNU Global или IDUtils в своем проекте, EDE может использовать его для поиска файла по имени в любом месте, или вы можете использовать `semantic-symref'для поиска ссылок на символы в ваших исходных файлах. CEDET находится на http://cedet.sf.net/
FileCache также может быть вариантом. Однако вам нужно будет добавить каталог проекта вручную с помощью file-cache-add-directory-recursively
,
Посмотрите эти ссылки для получения информации о том, как Сосульки могут помочь здесь:
- найти файлы в любом месте, соответствующие любым частям их имени (включая части каталога)
- проекты: создавать, организовывать, управлять, искать их
Соответствие завершению сосулек может быть подстрокой, регулярным выражением, нечетким (различного вида) или их комбинацией. Вы также можете комбинировать простые шаблоны, пересекая совпадения или дополняя (вычитая) их подмножество.