Я переключаюсь на 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-проекта в качестве примера?
(обновлено в первую очередь, чтобы включить фактические инструкции по установке для использования с указанным ниже 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
:
Получить find-file-in-project.el
и ] project-local-variables.el
из дистрибутива RINARI и поместите где-нибудь, где Emacs сможет их найти (то есть в одном из каталогов в переменной load-path
; вы можете использовать (add-to-list 'load-path "/ path / to / some / directory")
, чтобы добавить в него новые каталоги).
Добавьте (требуется 'find-file-in-project)
в ваш файл .emacs
. Также добавьте следующее, чтобы последовательность Cx CMf
вызвала подсказку find-file-in-project: (global-set-key (kbd "Cx CMf") 'find-file-in -проект)
.
Создайте файл с именем .emacs-project
в корневом каталоге ваших проектов. Как минимум, он должен содержать что-то вроде этого: (setl ffip-regexp ". * \\. \\ (clj \\ | py \\) $")
. Это сделает так, что поиск будут выполняться только в файлах, имена которых и в clj
или py
; пожалуйста, настройте регулярное выражение в соответствии с вашими потребностями. (Обратите внимание, что это регулярное выражение будет передано в утилиту Unix find
и должно использовать предпочтительный синтаксис регулярного выражения find
. Вам все равно придется удваивать каждую обратную косую черту в регулярных выражениях , как это обычно бывает в Emacs; нужно ли ставить обратную косую черту перед скобками / вертикальными чертами ( |
), если вы хотите использовать их «волшебное» значение регулярного выражения, зависит от вашего find
' ожиданий.Пример, приведенный выше, у меня работает на компьютере с Ubuntu.В случае сомнений посмотрите дополнительную информацию о регулярных выражениях.) (Примечание: этот абзац был изменен в последней редакции, чтобы исправить некоторую путаницу с синтаксисом регулярных выражений.)
C-x C-M-f
прочь.
Существует ряд возможных настроек; в частности, вы можете использовать (setl ffip-find-options "...")
для передачи дополнительных параметров в команду Unix find
, которая и является find-file -in-project.el
зовет под капотом.
Если что-то не работает, проверьте и дважды проверьте правильность написания - я сделал что-то вроде (setl ffip-regex ...)
один раз (обратите внимание на отсутствие последней буквы p в имя переменной) и изначально были весьма озадачены, обнаружив, что файлы не были найдены.
Я использую для этого M-x rgrep. Он автоматически пропускает многие вещи, которые вам не нужны, например каталоги .svn.
eproject имеет eproject-grep
, который делает именно то, что вы хотите.
При правильном определении проекта поиск будет выполняться только в файлах проекта; он будет игнорировать контроль версий, артефакты сборки, сгенерированные файлы и т. д. Единственным недостатком является то, что для этого требуется команда grep в вашей системе; эта зависимость скоро будет устранена.
FileCache также может быть вариантом. Однако вам нужно будет добавить каталог проекта вручную с помощью file-cache-add-directory-recursively
.
Вы можете получить желаемый эффект, используя GNU Global или IDUtils. Они не специфичны для Emacs, но в них есть Emacs-скрипты, которые интегрируют этот эффект. (Я сам не слишком много о них знаю.)
Вы также можете использовать CEDET и систему проектов EDE. EDE, вероятно, немного тяжеловесна, но в ней есть способ просто пометить вершину проекта. Если вы также храните индексные файлы GNU Global или IDUtils вместе с проектом, EDE может использовать их для поиска файла по имени в любом месте, или вы можете использовать `semantic-symref' для поиска ссылок на символы в ваших исходных файлах. CEDET находится по адресу http://cedet.sf.net