Сегодня вышла первая версия плагина для IntelliJ IDEA – Camelcade. Плагин добавляет поддержку Perl5 в эту чудесную IDE. Плагин бесплатен и опенсорсен. В настоящее время работает в IntelliJ IDEA и специализированных IDE от JetBrains.

image

Подробнее о плагине смотрите под катом.


Предыстория


Я – программист с длительным стажем и разнообразным опытом. Очень давно пишу на Perl5 и до недавнего времени писал в NP++ (трудно поверить). В какой-то момент захотелось большего, но ничего подходящего не оказалось. Пробы того что есть показали, что все плохо:
  • Sublime — просто NP++ c автокомплитом.
  • Eclipse+EPIC — постоянные баги с запуском, или установкой. Проблем лично я получил больше, чем пользы.
  • Padre – отличное начинание, но заброшен и так же крайне нестабилен. Вылеты, зависания, связанные с UI частью wxWidgets.
  • Komodo – самое лучшее из того что было. Но, ощущение что Perl5 направление не развивается и то, что есть, довольно быстро перестало удовлетворять. Аппетит пришел во время еды.
  • Vim — извините, не мое. Дитя Windows и все такое.

Помимо хорошей поддержки Perl5 хотелось иметь возможность расширять функционал, т.к. приходится работать с проектами, работающими на кастомных движках с кастомными шаблонизаторами (и да, в Vim это наверняка можно сделать).

Какое-то время доводилось работать над задачами на Python и, соответственно, в PyCharm. Это было просто прекрасно. Лучшая из виденных мной IDE. Отсюда возникло решение попробовать написать плагин для поддержки Perl5. Java я не знал практически совсем…

… здесь может быть развернутое сочинение на тему – «Как это было», которое я мог бы изложить, если это будет интересно…

Итог


Первая версия плагина предоставляет следующие возможности:
  • Создание Perl5 модуля и выбор Perl5 интерпретатора
  • Парсинг Perl5 (без source-фильтров), POD, Mojolicious шаблонов и Embedded Perl (Это как php только с Perl5 внутри)
  • Подсветка синтаксиса
  • Подсветка и дополнение скобок, кавычек, разделителей для регулярных выражений.
  • Интерполяция строк, here-doc-ов и регулярных выражений
  • Авто-комплит для функций, методов, пакетов, констант и переменных
  • Переход для функций, переменных, классов и констант (Go to symbol/class)
  • Просмотр структуры файла и иерархии классов (Structure view/Hierarchy view)
  • Поддержка наследования с DFS/C3
  • Поддержка импортов функций и переменных
  • Навигация и рефакторинг для функций, констант, глобов, пакетов, неймспейсов, лексических и глобальных переменных
  • Разрешение AUTOLOADed методов
  • Шаблоны (File templates) для скриптов, пакетов и Mojolicious шаблонов
  • Шаблоны (Live templates) для compound конструкций (съешь лишние скобки, Komodo)
  • Поддержка объявления глобальных переменных через use vars
  • Рефакторинг маркеров для here-doc
  • Поддержка IntelliLang для here-doc и автоматическое инжектирование другого языка в зависимости от текста маркера
  • Аннотации для функций: #@deprecated, #@method, #@returns (последняя необходима для корректного разрешения типа возвращаемого значения)
  • Аннотация для неймспейсов: #@deprecated
  • Поддержка типизации переменных при объявлении
  • Intentions: конвертация строки в here-doc
  • Inspections:
    • Пакеты: отсутствующий файл пакета, неизвестный namespace, множественное объявление namespace, пересечение с core namespace, отсутствующие strict/warnings.
    • Функции: deprecated, неизвестная фунция, множественные определения, модный вызов (new Foo::Bar), неиспользуемые функции/константы/глобы.
    • Переменные: неиспользуемые переменные, неопределенные переменные, затенения переменной, объявление встроенной переменной как лексической или глобальной.
  • Extension point для реализации процессоров пакетов. Позволяет описать функционал нестандартных модулей. Например Mojo::Base, являющимся одновременно и strict, и warnings, и base и feature.

Все не идеально и скорее всего будет допилено. Сделан необходимый для работы минимум. Более подробно можно посмотреть на wiki проекта: github.com/hurricup/Perl5-IDEA/wiki

Благодарности


  • JetBrains за чудесную IDE и не менее чудесную платформу для разработки. Это было очень интересное приключение.
  • Сотрудникам JetBrains и особенно Петру Громову за помощь и подсказки на форуме, которые так необходимы на старте.
  • Хабра-юзеру VISTALL за ценные советы и код-ревью.
  • Создателю Erlang плагина, который часто использовался как образец.
  • Всем кто присылал свои фидбеки и фичреквесты.

Планы


Тут можно много всего понаписать, поскольку на каждую реализованную фичу рождалось две новых идеи. Все ходы записаны, но дальнейшая судьба плагина будет зависеть от массы различных факторов. Концептуально запланированы:

  • Улучшение парсера (особенно error-recovery).
  • Улучшение уже реализованного функционала.
  • Оптимизация производительности
  • Написание тестов.
  • Интеграция с известными Perl5 фреймворками и шаблонизаторами.
  • Интеграция с PerlBrew.
  • Интеграция с библиотеками вроде PerlTidy, PerlCritic, CPAN.
  • Дебаггер.
  • Perl6. Начать я собирался именно с него в связи с наличием формализованной грамматики. Но возникли аргументы против: языка я не знаю совсем, он еще не вышел (хоть и вот-вот), производительность его на данный момент оставляет желать лучшего. Но, почему бы нет?

Ссылки


Комментарии (54)


  1. Cobolorum
    31.08.2015 14:19
    +1

    Вы почти меня убедили продать душу IntelliJ IDEA. Но что там с дебагером?


    1. hurricup
      31.08.2015 14:27

      Как и написано в статье — в планах. Сейчас нет ни запуска, ни дебаггинга.


  1. hurricup
    31.08.2015 15:36

    Поправил верстку, Inspections не отображались.


  1. kloppspb
    31.08.2015 16:17

    На Community Edition как?
    Помнится, пытался смотреть ещё когда на форуме прагматика было объявление, но отсутствие отладки сразу убило интерес. Сейчас вроде фичами обрастает, надо продолжить :)
    И да, кроме отладки — всякие там критики и tidy тоже хочется… Хотя, наверное, частично это можно решить и сейчас внешними утилитами?


    1. hurricup
      31.08.2015 17:35

      Говорят да, tidy пробовали и работает. Но хочется гуи и все по-человечески.
      По возможностям, со стороны плагина, все идентично во всех IDE.


      1. kloppspb
        31.08.2015 20:10

        Тэкс, разобрался :) Примерно так же, как делал для mooedit (http://habrahabr.ru/post/206152/).

        1) Подменяем perlcritic на свой:

        [19:59:38] ~/bin $ cat perlcritic
        #!/usr/bin/perl
        use strict;
        my $out = `/usr/bin/perlcritic $ARGV[0] $ARGV[1] 2>&1`;
        my $rc = ( $out =~ s|^(.+)at line (\d+),(.+)$|$ARGV[1]:$2 $1at line $2,$3|gm );
        print $out;
        exit $rc;

        2) Вставляем его как External Tool:

        http://ato.su/resizer/i/9/7/9980b7aa.png

        3) Добавляем туда Output Filter:

        http://ato.su/resizer/i/e/8/e1b5234a.png

        4) Вуаля! Теперь все строчки с сообщениями кликабельны:

        http://ato.su/resizer/i/9/a/6fda877e.png

        С perltidy всё делается аналогично.


  1. boblenin
    31.08.2015 18:01

    О! Спасибо вам огромное!


  1. darkwire
    31.08.2015 18:30
    +1

    Супер! Добровольцев в команду берете? :)


    1. hurricup
      31.08.2015 18:32

      Это было бы чудесно!


  1. Rommeech
    31.08.2015 18:53

    Все бы хорошо, да только дороговата эта IntelliJ IDEA.
    И какие баги с Eclipse+EPIC? Я лет 7 использую, ни одной проблемы не припоминаю. Правда я неприхотливый, мне бы синтаксис подсвечивало — и то хорошо, не пользуюсь ни дебаггингом, ни запуском. Сейчас переползаю на Саблайм, тоже ок.


    1. hurricup
      31.08.2015 19:14

      Тут каждому свое да. Но, чем больше выбор — тем лучше, на мой взгляд. Ну и есть абсолютно бесплатная Community Edition, правда не знаю, как она по сравнению с Eclipse.


      1. grossws
        01.09.2015 01:15

        В community отсутствует:
        — кусок касающийся веб-разработки,
        — всё enterprise'ное,
        — крайне полезный dependency graph (т. к. используется проприетарный yFiles),
        — поддержка ruby, php, python (но есть pycharm community edition),
        — часть связанная с поддержкой разных SQL-серверов,
        — UML.

        Сравнение здесь: www.jetbrains.com/idea/features/editions_comparison_matrix.html


        1. hurricup
          02.09.2015 09:53

          правда не знаю, как она по сравнению с Eclipse.

          То, что платная версия IDEA имеет больше возможностей, чем бесплатная — выглядит логично. Многие вещи имеют бесплатные релизации в плагинах, вроде Database Navigator.


    1. hurricup
      02.09.2015 09:59

      50 центов в день дороговато? Мне кажется это даже для студента подъемная цена, про разрабов и их зарплаты вообще молчу.


      1. Rommeech
        02.09.2015 11:56

        50 центов в день — типичный маркетинговый развод, на самом же деле — вынь да положь 199 евро именно сегодня. Но деньги-то не самая большая проблема. Главное понять, стоит ли переходить на ИДЕ, в которой нет родной поддержки языка, на котором ты пишешь 90% кода. Но вообще вы меня убедили, как появится время — скачаю триальную версию и посмотрю, как там всё.


        1. hurricup
          02.09.2015 12:03

          В смысле маркетинговый ход? Я в JB не работаю и у них такого не видел. Просто поделил 200 долларов (не евро, бтв) на год. Хотя апгрейд до актуальной версии стоит лишь половину от этого. Т.е. получается даже 27 центов.
          Вы когда билет на поезд покупаете тоже каждый километр оплачиваете или всю поездку сразу? Странные рассуждения для работающего человека.
          Подобное лично я говорил пока учился и не работал и денег просто небыло.


          1. Rommeech
            02.09.2015 14:00

            Согласитесь, 50 центов в день — довольно условная цена и не говорит ни о чем. Думаю, что мало кто ориентируется стоимостью использования в день какого-то продукта, также как никто не считает стоимость поездки за километр — большинство интересуется конечной ценой, как понятной и поддающейся анализу и сравнению. Также как и 199 долларов — для кого-то приемлемая цена (тем более, что IDEA — отличный, по отзывам, продукт), а для кого-то с ипотекой и алиментами может нанести удар по бюджету. Но я с вами согласен — цена подъемная, при условии, что ты осознаешь, что тебе эта ИДЕ действительно нужна.


            1. hurricup
              02.09.2015 14:08

              Ну почему же. Если с помощью инструмента, стоящего один рубль в день, я смогу зарабатывать на рубль+ больше, или получу свободное (которое ценю в рубль) время за счет более шустрого выполнения работы, или, даже, получу удовольствие, которое оцениваю в рубль — значит надо брать. Если затраты превышают бонус — то не надо.

              Про индивидуальные ситуации типа илиментов, ипотек, «я не программист» речи вообще не идет. Речь о том, что покупка фотошопа за 500 баксов чтобы усы пририсовывать — странно. Покупка инструмента для зарабатывания денег — вполне логична, если рентабельна.


        1. hurricup
          06.09.2015 23:01

          Прям ответ на первый тезис: www.jetbrains.com/toolbox
          Совпадение?.. :)


          1. grossws
            07.09.2015 00:05
            +1

            Это скорее для тех, кому надо лицензию на небольшой срок (под конкретный проект, например). Или можно воспринимать как то, что при оплате за год — получаете скидку 20%.

            Меня подход с toolbox крайне радует наличием bundle-лицензии на все продукты: давно мечтал. То покупать idea + rubymine + pycharm мне несколько напряжно, при том, что тот же pycharm мне нужен раз в месяц. А так за те же деньги, что у меня сейчас idea + rubymine, я получу всю пачку специализированных IDE, которые по функционалу чуток опережают плагины в idea и куда более легковесны.


  1. vsespb
    31.08.2015 19:19

    Спасибо!


  1. ivanych
    31.08.2015 20:08
    -1

    А можно список — что оно умеет лучше или иначе, чем Eclipse/Epic?

    Хочу попробовать Ваш плагин, но мотивации не хватает:)


    1. hurricup
      31.08.2015 20:15

      Для этого нужно чтобы кто-то сравнил.


  1. knutov
    31.08.2015 21:22

    Если забыть про отладку, которой пока и тут нет — чем именно оно лучше сублайма?


    1. hurricup
      31.08.2015 21:26
      +2

      Чем IDE лучше текстового редактора? Вопрос риторический.


      1. knutov
        31.08.2015 21:32
        -1

        А можно без риторики?

        Смотрим в википедию:

        Среда разработки включает в себя:

        • текстовый редактор,
        • компилятор и/или интерпретатор,
        • средства автоматизации сборки,
        • отладчик.


        Отладчика нет (а брейкпоинты, наверное, как раз самая ценная штука в ide), интерпретатор внешний, сборки у перла как бы нет, раз оно некомпилируемое, сборка пакетов — внешняя, а текстовый редактор того же сублайма умеет примерно вообще все, что можно.

        Вот я и спрашиваю, чем конкретно оно лучше сублайма?


        1. hurricup
          31.08.2015 21:35
          +1

          Если саблайм умеет все, что переречислено в статье (плюс все что дает нашару IDEA) — то ничем. Какой-то провокационный разговор.


          1. knutov
            31.08.2015 21:42

            На глаз — да, все перечисленное умеет. Не все из коробки — на некоторые штуки нужны дополнительные плагины поставить из репозитория. Реализация может отличаться для некотрых вещей, вроде маркеров и пункты из Inspections, наверное, делаются через какой-нибудь perlcritic.

            Никаких провокаций — я много пишу на перле, сублайм в некоторых мелочах не идеален и если есть что-то лучше — это было бы интересно.


            1. hurricup
              31.08.2015 21:47
              +1

              Если все умеет, значит просто вопрос личных предпочтений. Попробовать то и то и выбрать, если не лень.


            1. ivanych
              31.08.2015 22:17

              Умеет Сублим прыгать с места вызова функции на место объявления?


              1. knutov
                31.08.2015 22:22

                Умеет:

                { "keys": ["f12"], "command": "goto_definition" },


                1. ivanych
                  31.08.2015 22:30

                  Это для любого языка работает? Или нужен какой-то специальный плагин конкретно для Перла?


                  1. hurricup
                    31.08.2015 22:34

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


                  1. knutov
                    31.08.2015 22:35

                    Для любого — строчка из системного конфига.

                    Под некоторые языки может потребоваться дополнительный плагин, чтобы это работало хорошо (для перла — ModernPerl). На форуме прагматик перла был тред, где я много про это рассказал, но тред куда-то пропал.


                    1. hurricup
                      31.08.2015 22:45

                      Зашел на GitHub ModernPerl и вспомнил что смотрел его перед тем началом разработки плагина. Сильно смутило, что последний коммит был полгода назад (сейчас уже год). Насколько он хорошо находит определения сабов/методов/переменных?


                      1. knutov
                        31.08.2015 22:56

                        Хорошо находит (пользуюсь каждый день, проблем нет). Но не умеет хелперы дансера и иногда(может всегда) смотрит по всем файлам в проекте(=каталоге), а не в реально подкюченных через use/require.

                        Я, впрочем, не уверен, что за это отвечает именно этот плагин :)

                        Не совсем актуальный список того, что стоит у меня — ссылка в гитхаб. Часть плагнов отключена (смотреть остальные конфиги) и это была установка под windows, я с тех пор перешел на мак и все стало немного иначе (и файл хоткеев пришлось понаписать огромный).


                        1. hurricup
                          31.08.2015 23:02

                          Ну всякие кодогенерации (акцессоры и т.п.) мы пока тоже не умеем. Только константы.


                          1. knutov
                            31.08.2015 23:10

                            вот — еще я не смотрел что у него сейчас с передачей параметров в функции (5.20+ вроде), не пользуюсь, и по тому тоже не знаю что с аксессорами с moose синтаксисом.

                            Очень не хватает разбора DSL синтаксиса для get/post в дансере — это же то же функции и было бы логично и удобно, если бы можно было по ним переходить из поиска, как для всего остального, но этого нет. Но есть выход если делать перед объявлением такого блока пустую функцию вида

                            sub ___get_user_id_action_status {}
                            

                            Питон не умею, иначе давно эти моменты сам бы поправил.


                            1. hurricup
                              31.08.2015 23:12

                              Ну да, это тоже кодогенерация. Нужно пилить дополнительно.


                    1. ivanych
                      31.08.2015 22:46

                      Ок. А чем оно лучше eclipse/epic?

                      Эклипс раздражает тормозами, всё порываюсь заменить, не знаю на что.


                      1. hurricup
                        31.08.2015 22:53

                        Мужики, я не могу вам сказать чем оно лучше чем что-либо кроме NP++ и Komodo. В остальном я не работал толком. Нужно пробовать и смотреть.
                        Комодо тупил адски с разрешением имен. Даже, казалось бы, очевидные вещи найти не мог. Без перл-фокусов.


                      1. knutov
                        31.08.2015 23:03

                        Я эклипс пробовал много раз с 2006го года. Он на яве и тормозит всегда и везде.
                        Установку поледней epic я два раза из трех просто не мог пройти (раньше стабильная версия была устаревшей и никуда не годной, а нестабильная — очень нестабильной. Как сейчас — не знаю).

                        После NPP я перешел на Padre, просидел на нем два года и однажды (когда сублайм 3 стал достаточно стабильным) нашел время почитать форумы про сублайм и придумать конфиги и набор плагинов под себя. Первое время очень не хватало function list в боковой панельке, но потом привык и оказалось, что это не проблема.

                        По состоянию на сейчас — сублайм быстрее, чем всякие brackets и прочие его клоны. Отдельные нюансы у него есть, но половина — дело привычки и альтернатив все равно похоже что нет.


                        1. hurricup
                          31.08.2015 23:06

                          Ява не при чем. Причина — плохой код/архитектура IDE или особенности языка.
                          Например, та же IDEA с Java работает супер-быстро. Мой плагин в сравнении с ней тормозит безбожно. Но это чисто моя вина и особенности перла.
                          С эпиком та же фигня. Дома встал, на работе — нет.


                      1. hurricup
                        31.08.2015 23:04

                        И да, тормозов своих хватает. Надеюсь — пока что.


                      1. kloppspb
                        31.08.2015 23:10

                        Да что ж вы такое с эклипсом делаете? У одного тормозит, у другого «постоянные баги с запуском, или установкой», у кого-то что-то ещё… За последние несколько лет я встречался только с одним глюком, да и то непонятно чей это (падения эклипса при переносе jvm на tmpfs).

                        И, боюсь, если эклипс где-то тормозит, то от IDEA в тех же условиях спринтерских скоростей уж точно ждать не придётся…


                        1. hurricup
                          31.08.2015 23:15

                          Видимо, я недостаточно умен для эклипса.
                          По хорошему нужен какой-то арбитр, поработавший и там и там, который мог бы сравнить сами IDE. Потом останется лишь сравнивать EPIC/Camelcade.


                          1. kloppspb
                            01.09.2015 00:11

                            Мне кажется, сложновато поставить чистый эксперимент, слишком много субъективного :)

                            IDEA я юзал лет 8-10 назад, когда был период Java. Никаких вроде бы претензий не было. Но и кучи лишнего, кроме голой Java, тоже :) Потом Java ушла, и пришлось много чего перепробовать. Основные языки сейчас C и Perl, потом C++, ну и вся остальная мелочь в хвостике плетётся, от PHP до XML. Комода держалась дольше всех :) Но Eclipse всё-таки победил, в том числе и потому, что из него удалось создать комфортное лично мне окружение. Тут и Remote System Explorer, и Toad/DBeaver (третий год не могу выбрать), и valgrind/cppcheck, и коннекторы к Mantis/Jira/Redmine, и ещё парочка мелких примочек типа встроенного редактора иконок, глядельщика картинок… К которым просто привык. И для того, чтобы сменить среду обитания, нужны какие-то очень веские причины. Причём я понимаю, что если бы в нужный момент под руку подвернулось бы что-то другое, я бы и там обустроился. Но сейчас уже лень, не хочется ломать привычки и вылезать из удобного болотца (тем более что явных нареканий к нему нет), «работает — не трогай» и пр, и пр :-)

                            Что же касается именно EPIC, то здесь правильно говорилось: львиная доля от смысла IDE — это отладка. Для всего остального можно приспособить и что попроще. И пока нет отладки, особо сравнивать-то и нечего :(

                            А тормознутость — вот тут вообще ничего не скажу. С проблемами при поиске уж точно не сталкивался, с перекидыванием вкладок тоже. Хотя фиг знает, может оно от системы/окружения зависит.


                        1. ivanych
                          31.08.2015 23:56
                          -1

                          Это чортова Ява, она тормозит где угодно.

                          Например, открыто два больших файла, нужно поменять их местами. Хватаешь мышкой вкладку одного файла, тащишь на место второго — всё, весь Эклипс зависает намертво. Не каждый раз, но достаточно часто.

                          Или поиск по файлам — если файлов много, то Эклипс начинает тормозить а потом вываливает эксепшен с обычной для Явы невменяемой белибердой. И не иногда, а абсолютно всегда, я из-за этого вынужден искать по проекту грепом в консоли, а самим Эклипсом.


                          1. hurricup
                            01.09.2015 07:24

                            Из того что написано, предположу что причина — плохая архитектура Эклипса.


                  1. knutov
                    01.09.2015 10:52

                    Нашлась тема — http://forum.pragmaticperl.com/threads/12-допилы-padre-ide. Что примечательно — её автор hurricup.


                    1. hurricup
                      01.09.2015 12:50

                      Да, это я. Там есть и тема где я призывал народ поучаствовать в написании плагина :)


  1. PerlPower
    31.08.2015 22:48

    Что-то не срастается у perl с IDE. Возможно из-за грамматики. Не знаю как пишутся для Jidea плагины, но вы описывали полную грамматику для парсинга perl5?


    1. hurricup
      31.08.2015 23:00

      Да тут как раз все понятно. Сейчас перл не является мейнстримовым языком, соответственно мало энтузиастов чтобы написать IDE/плагин, и нет коммерческого интереса (хотя удивлен что Booking, написанный целиком на Перл ничего не сделал).
      Нельзя описать грамматику для Perl. Ее нет. Дым и зеркала :)
      Было многоо разных экспериментов: портировать исходники Perl, составить упрощенный bnf, но в итоге получился: простой лексер и нисходящий рекурсивный парсер с хаками. Примерно так и сам перл работает, как я понимаю.
      Парсер плагина не является 100% достоверным. Он парсит все core модули (и все что у меня было установлено) и мою кодовую базу.
      Есть масса хитростей которые пока не хендлятся никак (и некоторые не планируются), т.к. язык сильно человечен и позволяет себе слишком много грамматических вольностей для языка программирования.


      1. PerlPower
        01.09.2015 10:44

        Спасибо вам за титанический труд.