Emacs рекурсивный поиск проекта - PullRequest
20 голосов
/ 04 марта 2010

Я переключаюсь на 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 «» Msgstr "Дополнительные опции для передачи в` find 'при использовании find-file-in-project.

Используйте это для исключения частей вашего проекта: \ "- not -regex \\". vendor. \\ "\" ")

Что это значит точно и как я могу использовать его для исключения файлов / каталогов?

Не могли бы вы поделиться примером файла .emacs-project?

Ответы [ 8 ]

15 голосов
/ 04 марта 2010

Я использую M-x rgrep для этого. Он автоматически пропускает много вещей, которые вам не нужны, например, каталоги .svn.

11 голосов
/ 04 марта 2010

(Обновлен в основном для включения актуальных инструкций по настройке для использования с нижеупомянутым 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 - не IDE-среда Rails (это второстепенный режим 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 variable; вы можете использовать (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' в имени переменной), и был поначалу весьма озадачен, обнаружив, что файлы не найдены.

4 голосов
/ 15 марта 2012

Удивлен, никто не упомянул https://github.com/defunkt/textmate.el (теперь нужно заставить его работать на Windows ...)

3 голосов
/ 05 марта 2010

eproject имеет eproject-grep, что делает именно то, что вы хотите.

При правильном определении проекта он будет искать только файлы проекта; он будет игнорировать управление версиями, создавать артефакты, генерируемые файлы, что угодно. Единственным недостатком является то, что она требует команды grep в вашей системе; эта зависимость скоро будет устранена.

2 голосов
/ 16 июля 2013

Для получения чистой скорости я настоятельно рекомендую комбинацию инструмента командной строки Silver Searcher (a.k.a. 'ag') с ag.el . Интерактивная функция ag-project сделает обоснованное предположение о корне вашего проекта, если вы используете git, hg или svn и выполните поиск по всему проекту.

2 голосов
/ 04 марта 2010

Вы можете получить желаемый эффект, используя GNU Global или IDUtils. Они не являются специфичными для Emacs, но у них есть сценарии Emacs, которые интегрируют этот эффект. (Я сам о них слишком мало знаю.)

Вы также можете использовать CEDET и систему проектов EDE. EDE, вероятно, немного тяжелый вес, но у него есть способ просто отметить вершину проекта. Если вы также храните индексные файлы GNU Global или IDUtils в своем проекте, EDE может использовать его для поиска файла по имени в любом месте или вы можете использовать `semantic-symref 'для поиска ссылок на символы в ваших исходных файлах. CEDET на http://cedet.sf.net

0 голосов
/ 22 августа 2011

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

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

0 голосов
/ 04 марта 2010

FileCache также может быть вариантом. Однако вам нужно будет добавить каталог проекта вручную с помощью file-cache-add-directory-recursively.

...