понедельник, 2 января 2012 г.

my-project.el

При использовании Emacs мне очень сильно не хватает какого-нибудь простого средства управления проектами. Наиболее важные для меня функции:
1) Быстрый поиск по файлам проекта с автодополнением имени;
2) Запуск etags только по файлам проекта;
3) Поиск по содержимому файлов проекта.

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

Вот как я объявляю проект:


Эта функция создает проект "My", в котором объявлен корневой каталог проекта, несколько артефактов, расширение файлов с исходниками, по которым будет работать etags; в опции find-filе задаются маски файлов для быстрого поиска; в опции exclude указываются строки, при наличии которых файлы исключаются из поиска. Последняя опция удобна тем, что помогает исключить из результатов поиска различные автоматически генерируемые файлы или файлы из каталогa .svn.

Быстрый поиск хотелось сделать как в TextMate. Что-то похожее в Emacs реализуется средствами IDO, но работает не совсем так, как надо. Во-первых, IDO подглючивает при большой вложенности каталогов и большом количестве файлов; во-вторых, find-file ищет от текущего каталога. Если вы находитесь в самой глубине вашего проекта, то для поиска файла в другом каталоге, нужно будет выходить на несколько уровней выше. Я сделал функцию поиска, которая работает от корня проекта и выводит в подсказку весь список всех файлов проекта.


Если набрать дополнительно несколько букв имени искомого файла, IDO поможет отфильтровать список.


Еще одна не очень удобная для меня функция Emacs -- поиск по содержимому файлов. Для этого используется стандартная функция find-grep.


Как видите, при запуске этой функии Emacs выдает подсказку по параметрам команды find, которые нужно заполнить вручную. Самое отвратительное в этом -- это необходимость вручную указывать имя корневой дирректории и шаблона имени файла.

Я сделал свою версию этой функции. Вначале, она спросит, по каким файлам проекта искать.


Затем предложит ввести искомый текст.


После этого откроет новое окно с результатами поиска.


Результаты поиска -- список файлов. Он кликабельный; при нажатии на любую строку мышкой или клавишей Return, файл откроется в этом же окне.

Возможно, мой плагин кому-то покажется полезным. Если у кого-нибудь будет желание -- пишите, попробуем вместе допилить его до production-уровня.

7 комментариев:

  1. Очень интересно - я сам написал что-то подобное, только поиск у меня выводит и подсвеченные фрагменты текста, плюс, запоминает историю поисков и поддерживает фильтрацию файлов, в которых ищешь, по маске: https://github.com/xeno-by/dotemacs/tree/master/solutions.

    Из того, что раздражает: ido адски тормозит при большом количестве комплишенов и не имеет концепции mru. Если знаешь, как пофиксить, расскажи. Также, я бы не отказался от вертикального представления файлов в виде попапа аля open resource в эклипсе. Мешанину текста тупо неудобно парсить глазами.

    Насчет продакшен-уровня, по-моему, такие мелочи глубоко личны. Проще написать самом, чем обтачивать то, что сделал кто-то другой. В конце концов, насколько я понимаю, емакс как раз про персонализацию до мельчайшего штриха =)

    ОтветитьУдалить
  2. Ты юзал rgrep-append.el? Я когда искал подобные решения, просто не нашел такого, которое смог бы взяться кастомизировать. Исходник у rgrep-append.el мягко говоря -- монстрозный, поэтому и решил сделать свое.

    ОтветитьУдалить
  3. Я использую project-local-variables и fuzzy-find-in-project http://redhotchilipython.com/posts/2011-04-20-my-dotemacs.html#id3

    Последний -- то, что надо (хоть и на ruby написан и я не знаю как его допилить чтоб маски файлов типа .pyc исключить мусорных).

    ОтветитьУдалить
  4. Ну вот это меня тоже раздражало -- невозможность исключения некоторых файлов и директорий. В моем проекте немалая часть кода генерится, и там искать не нужно. Да и скомпилированные .class-файлы надо пропускать...
    Мой плагин как раз на такое заточен: просто указываешь маски файлов, в которых искать, какие пропускать и получаешь профит.

    ОтветитьУдалить
  5. https://github.com/jrockway/eproject

    1) Быстрый поиск по файлам проекта с автодополнением имени;
    eproject-find-file

    2) Запуск etags только по файлам проекта;
    eproject-tags

    3) Поиск по содержимому файлов проекта.
    eproject-grep

    ОтветитьУдалить
  6. Я сделал свою версию этой функции. Вначале, она спросит, по каким файлам проекта искать.
    ...

    C-h f rgrep ?

    ОтветитьУдалить
  7. Да, про rgrep почему-то ни слова

    ОтветитьУдалить