Подтвердить что ты не робот

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

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

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

Update:

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

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

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

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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


Посмотрите страницу TextMate в EmacsWiki. Самое многообещающее, о чем они упоминают, вероятно, этот Emacs Lisp script, который обеспечивает рекурсивный поиск в "каталоге проекта", управляемом некоторыми переменными, Этот файл начинается с обширной секции комментариев, описывающей, как ее использовать.

Что особенно важно, это следующий бит:

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

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

НТН.

(BTW, что script является частью - для описания описания из GitHub - "Rinari Is Not A 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") для добавления к нему новых каталогов).

  • Добавьте (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).

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

  • C-x C-M-f.

Существует несколько возможных настроек; в частности, вы можете использовать (setl ffip-find-options "...") для передачи дополнительных параметров в команду Unix find, которая вызывает find-file-in-project.el под капотом.

Если что-то не работает, проверьте и дважды проверьте свое правописание - я сделал что-то вроде (setl ffip-regex ...) один раз (обратите внимание на отсутствие окончательного "p" в имени переменной) и изначально был озадачен, обнаружив, что файлы не найдены.

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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