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

Я перехожу на Emacs с TextMate. Одна особенность TextMate, которую я действительно хотел бы иметь в Emacs, - это поле поиска «Найти в проекте», в котором используется нечеткое сопоставление. Emacs вроде как имеет это с ido, но ido не выполняет рекурсивный поиск по дочерним каталогам. Он ищет только в одном каталоге.

Есть ли способ дать ido корневой каталог и искать все, что в нем?

Обновление:

Приведенные ниже вопросы относятся к find-file-in-project.el из ответа Михала Марчика.

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

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

Как мне указать find-file-in-project на корень моего проекта?

Я не знаком с синтаксисом регулярных выражений в Emacs Lisp. Значение по умолчанию для ffip-regexp:

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

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

Не могли бы вы объяснить параметры ffip-find? Из файла:

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

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

Что именно это означает и как с его помощью исключить файлы / каталоги?

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


person hekevintran    schedule 03.03.2010    source источник
comment
А как насчет textmate.el: github.com/defunkt/textmate.el   -  person pesho hristov    schedule 01.05.2015


Ответы (8)


(Обновлен в первую очередь, чтобы включить фактические инструкции по установке для использования с указанным ниже файлом find-file-in-project.el из дистрибутива RINARI. Исходный ответ оставлен без изменений; новые биты идут после второго горизонтального правила.) < / em>


Взгляните на страницу TextMate в EmacsWiki. Наиболее многообещающим из них, вероятно, является этот сценарий Emacs Lisp, который обеспечивает рекурсивный поиск в «каталоге проекта», руководствуясь некоторыми переменными. Этот файл начинается с обширного раздела комментариев, описывающего, как его использовать.

Что делает его особенно многообещающим, так это следующее:

;; If `ido-mode' is enabled, the menu will use `ido-completing-read'
;; instead of `completing-read'.

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

HTH.

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


Прежде чем продолжить, настройте ido.el. Серьезно, он необходим сам по себе, и он улучшит ваш опыт работы с find-file-in-project. См. этот скринкаст Стюарта Хэллоуэя (о котором я уже упоминал в комментарии к этому ответу), чтобы узнать, зачем вам использовать это. Кроме того, Стю демонстрирует гибкость ido, по-своему эмулируя средство поиска файлов TextMate в рамках проекта; если его функция соответствует вашим потребностям, не читайте дальше.

Итак, вот как настроить find-file-in-project.el от RINARI:

  1. Получите find-file-in-project.el и _ 4_ из дистрибутива 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 вызвала подсказку поиска файла в проекте: (global-set-key (kbd "C-x C-M-f") 'find-file-in-project).

  3. Создайте файл с именем .emacs-project в корневом каталоге вашего проекта. Как минимум он должен содержать что-то вроде этого: (setl ffip-regexp ".*\\.\\(clj\\|py\\)$"). Это сделает так, что поиск будут выполняться только по файлам, имена которых и в clj или py; пожалуйста, настройте регулярное выражение в соответствии с вашими потребностями. (Обратите внимание, что это регулярное выражение будет передано в find утилиту Unix и должно использовать предпочтительный синтаксис регулярных выражений 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 в имени переменной) и сначала был очень озадачен, обнаружив, что файлы не были найдены .

person Michał Marczyk    schedule 03.03.2010
comment
Похоже, этот режим просто находит файлы, так как генерирует список всех файлов и позволяет вам открыть один для редактирования. - person jrockway; 05.03.2010
comment
На самом деле ты ошибаешься. Это не список всех файлов - он использует регулярное выражение, которое пользователь может настроить, чтобы определить, что искать. Кроме того, он разрабатывает концепцию корня проекта для поиска и имеет нечеткое завершение при использовании вместе с ido. Что, кстати, похоже, именно то, о чем просит OP, и то, что утверждает ваш личный проект. - person Michał Marczyk; 05.03.2010
comment
Спасибо за ответ Михал. У меня есть еще несколько вопросов о том, как использовать find-file-in-project. Я поставил их в исходный вопрос. - person hekevintran; 07.03.2010
comment
В порядке. Я займусь этим, когда у меня будет свободное время. А пока вы можете пояснить в Q, к какому сценарию относятся эти добавленные вопросы, хотя бы для того, чтобы дать новичкам в Q больше шансов определить, могут ли они помочь! (Я имею в виду, не читая все существующие ответы и комментарии.) Также посмотрите это видео: vimeo.com/1013263. Он содержит пример функции для выполнения чего-то очень похожего на то, что вы хотите (хотя, я думаю, он использует файл тегов) и отличное обсуждение поиска TextMate в проекте по сравнению с ido Emacs. - person Michał Marczyk; 08.03.2010
comment
Я отредактировал некоторые основные инструкции по настройке - дайте мне знать, если это поможет. Внесу еще одну правку, если этого не произойдет, однажды я наконец-то приготовлю более интересный .emacs-проект - наверное, завтра. (По-видимому, я еще не нашел особой потребности в более изысканных вариантах.) Кроме того, рассмотрите возможность описания фактического сценария, который вас интересует (имеется в виду макет каталога проекта, расширения файлов и т. Д.), И, возможно, я или кто-то другой смогу предоставить соответствующую конфигурацию. - person Michał Marczyk; 10.03.2010
comment
Спасибо Михал. Обновленный ответ был именно тем, что мне было нужно. - person hekevintran; 10.03.2010
comment
Еще один вопрос: я пробовал использовать это: (setl ffip-regexp. * \\. \ (Py \\ | html \) $), но это не работает (я просто не нашел совпадения). Этот работает: (setl ffip-regexp. * \\. Html $), но позволяет мне сопоставить только одно расширение. Любые идеи? - person hekevintran; 10.03.2010
comment
Ой, я только что понял, что регулярное выражение в ffip-regexp должно фактически использовать тот синтаксис RE, который ожидает find, поскольку он передается в find; это не имеет ничего общего с RE Emacs. Итак, вам все равно нужно удвоить обратную косую черту, но, возможно, ваша находка рассматривает (|) как магию без экранирования и поэтому предпочла бы (py|html). Сообщите мне, работает ли это, и я отредактирую его в ответ. - person Michał Marczyk; 10.03.2010
comment
Итак, я пояснил соответствующую часть ответа. Надеюсь, это все; Я не понимаю, что еще может быть не так, я сам использую такое же выражение. Если вам нужно отладить его, попробуйте использовать find в терминале с теми же параметрами, что и те find-file-in-project (-type f -regex + ваше регулярное выражение + любые дополнительные параметры, которые нужно вставить в ffip-find-options). - person Michał Marczyk; 10.03.2010
comment
Причина в том, что find-file-in-project.el предполагает, что вы используете поиск GNU. Я использую OS X и поэтому использую поиск BSD. Таким образом, я должен либо установить GNU find, либо исправить программу. - person hekevintran; 10.03.2010
comment
Я установил GNU find. Есть ли способ сообщить Emacs, что когда он использует команду оболочки, он должен запускать / opt / local / bin / gfind вместо / usr / bin / find? - person hekevintran; 10.03.2010
comment
Я в основном эквивалент псевдонима find = / opt / local / bin / gfind в Emacs. - person hekevintran; 10.03.2010
comment
Что ж, если BSD find вообще не поддерживает параметры -type f -regex ... или вы просто предпочитаете GNU find, вам, вероятно, следует пойти дальше и исправить find-file-in-project.el - замените (concat "find " ... на (concat "gfind " ... в строке 99. Или, если BSD find поддерживает -type f -regex ..., и вы не возражайте против его использования, вы можете просто писать регулярные выражения в любом синтаксисе, который он ожидает. - person Michał Marczyk; 10.03.2010
comment
Нет ли возможности использовать псевдоним исполняемого файла с точки зрения Emacs? Причина, по которой я спрашиваю, заключается в том, что я хочу поделиться своей конфигурацией с коллегой, использующим Linux. - person hekevintran; 10.03.2010
comment
О, я бы посмотрел. В этом случае я бы предложил заменить жестко запрограммированный "find " пользовательской переменной, определяемой, скажем, (defvar ffip-find-command "find"): (concat ffip-find-command " " ...). (Обратите внимание на " " - вам нужен пробел между find / gfind и его аргументами, и кажется уродливым включать его в ffip-find-command.) Затем вы можете сбросить его на что-то более подходящее с помощью setq в вашем ~/.emacs (или даже с setl в .emacs-project , если это будет полезно использовать по какой-либо причине). Могут быть и другие решения, но мне это кажется самым чистым. - person Michał Marczyk; 10.03.2010

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

person Matthew Talbert    schedule 04.03.2010
comment
Почти ... но вам все равно придется вручную указать, где должен начинаться поиск. - person jrockway; 05.03.2010
comment
rgrep - это здорово, но, как говорит jrockaway, было бы здорово иметь возможность вообще обойти некоторые интерактивные подсказки - person David J.; 08.01.2013

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

person dolzenko    schedule 14.03.2012
comment
Это ssooooo очень близко к функциональности CtrlP ... Я искал что-то подобное, например, ... навсегда: D ... (теперь вместо Ctrl + P я использую Alt + T :). ..) - person pesho hristov; 01.05.2015

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

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

person jrockway    schedule 04.03.2010
comment
Вы только что проголосовали против нескольких других ответов, ни один из которых на самом деле не является неправильным и в том числе тот, который должен обеспечивать почти такую ​​же функциональность, что и этот ваш проект, на который вы ссылаетесь ...? Интересно, зачем ты это сделал? - person Michał Marczyk; 05.03.2010
comment
Установлено 23.1 (обязательно для eproject). епроект работает! с оговоркой, что вы должны настроить каждый файл языка / проекта, который вы хотите, чтобы eproject для поиска. В конце eproject запускает комментарий grep после поиска всех файлов, которые, по его мнению, находятся в вашем проекте. - person Justin Tanner; 05.03.2010
comment
Добавляйте языки, которые вы используете, и тогда никому больше не придется их настраивать. Я давно хотел собрать их кучу. (В вики есть Scala, Haskell и Perl.) - person jrockway; 05.03.2010

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

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

person Eric    schedule 04.03.2010

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

person bnzmnzhnz    schedule 16.07.2013

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

person danielpoe    schedule 04.03.2010

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

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

person Drew    schedule 21.08.2011