Emacs рекурсивный поиск проекта

Я переключаюсь на Emacs от TextMate. Одной функцией TextMate, который я действительно хотел бы иметь в Emacs, является поле поиска "Find in Project", которое использует нечеткое соответствие. Вид Emacs имеет это с идо, но идо не ищет рекурсивно через дочерние каталоги. Это ищет только в рамках одного каталога.

Существует ли способ дать идо корневой каталог и искать все под ним?

Обновление:

Вопросы ниже принадлежат find-file-in-project.el из ответа Michał Marczyk.

Если что-нибудь в этом сообщении звучит очевидным, что это - потому что я использовал Emacs меньше одной недели.:-)

Насколько я понимаю, локальные переменные проекта позволяет мне определить вещи в файле .emacs-проекта, который я сохраняю в своем корне проекта.

Как я указываю на find-file-in-project на свой корень проекта?

Я не знаком с regex синтаксисом в Lisp Emacs. Значение по умолчанию для ffip-regexp:

".*\\.\\(rb\\|js\\|css\\|yml\\|yaml\\|rhtml\\|erb\\|html\\|el\\)"

Я предполагаю, что могу просто переключить расширения тех подходящих для моего проекта.

Вы могли объяснить ffip-find-options? Из файла:

(defvar ffip-find-options "" "Дополнительные опции передать для 'нахождения' при использовании find-file-in-project.

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

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

Вы могли совместно использовать файл .emacs-проекта в качестве примера?

20
задан hekevintran 8 March 2010 в 21:47
поделиться

5 ответов

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

Заметьте, я не использовал его сам ... Хотя я вполне могу попробовать его сейчас, когда я его нашел! : -)

HTH.

(Кстати, этот скрипт является частью - если цитировать описание с GitHub - «Rinari - это не Rails IDE (это второстепенный режим Emacs для Rails)». Если вы занимаетесь разработкой на Rails, вы может захотеть проверить все это.)


Прежде чем продолжить, настройте ido.el . Серьезно, он необходим сам по себе и , он улучшит ваш опыт работы с find-file-in-project. См. этот скринкаст Стюарта Хэллоуэя (о котором я уже упоминал в комментарии к этому ответу), чтобы узнать, почему вам нужно его использовать. Кроме того, Стю демонстрирует, насколько гибким является 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. Добавьте (требуется 'find-file-in-project) в ваш файл .emacs . Также добавьте следующее, чтобы последовательность Cx CMf вызвала подсказку find-file-in-project: (global-set-key (kbd "Cx CMf") 'find-file-in -проект) .

  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 в имя переменной) и изначально были весьма озадачены, обнаружив, что файлы не были найдены.

11
ответ дан 30 November 2019 в 00:05
поделиться

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

15
ответ дан 30 November 2019 в 00:05
поделиться

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

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

3
ответ дан 30 November 2019 в 00:05
поделиться

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

0
ответ дан 30 November 2019 в 00:05
поделиться

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

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

2
ответ дан 30 November 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: