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:

  1. получать find-file-in-project.el а также project-local-variables.el из дистрибутива RINARI и поместите туда, где Emacs сможет их найти (что означает в одном из каталогов в load-path переменная; ты можешь использовать (add-to-list 'load-path "/path/to/some/directory") добавить новые каталоги к нему).

  2. добавлять (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),

  3. Создайте файл с именем .emacs-project в корневом каталоге ваших проектов. Как минимум, он должен содержать что-то вроде этого: (setl ffip-regexp ".*\\.\\(clj\\|py\\)$"), Это сделает так, что только файлы, чьи имена и в clj или же py будет произведен поиск; пожалуйста, настройте регулярное выражение в соответствии с вашими потребностями. (Обратите внимание, что это регулярное выражение будет передано в Unix find утилита и должна использовать find предпочтительный синтаксис регулярных выражений. Вы все еще должны удваивать каждый обратный слеш в регулярных выражениях, как обычно в Emacs; нужно ли также ставить обратную косую черту перед паренсом / трубами (|) если вы хотите использовать их "магическое" регулярное выражение, значение зависит от вашего find ожидания. Приведенный выше пример работает для меня на коробке Ubuntu. Поищите дополнительную информацию о регулярных выражениях в случае сомнений.) (Примечание: этот абзац был пересмотрен в последнем редакторе, чтобы исправить некоторую путаницу с синтаксисом регулярных выражений.)

  4. 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,

Посмотрите эти ссылки для получения информации о том, как Сосульки могут помочь здесь:

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

Другие вопросы по тегам