Встречайте новый плагин для Geany IDE — PairTagHighlighter

    Всем привет!

    Неожиданно для себя я узнал, что Geany IDE не умеет подсвечивать парные HTML/XML теги. Т.е. ставим курсор в середину тега, должен подсветиться этот тег и его пара (открывающая или закрывающая). Гугление показало, что фичи действительно нет, и она присутствует в виш-листе.

    Не долго думая, я решил добавить такую возможность. Если Вам интересно узнать подробности, обсудить/покритиковать результат, принять участие в опросе, а также посоветовать, что добавить, пока не вышла Geany 1.24, добро пожаловать под кат!

    image


    Сразу оговорюсь, что данная статья не является мануалом по написанию плагинов для Geany. Все это доходчиво и подробно описано в официальной документации.

    Первые шаги к реализации


    Удостоверившись, что плагин “Hello World”, который описан в официальном мануале, работает как ожидалось и выполняет все свои полезные функции, я начал думать над алгоримом. Решил подсмотреть реализацию данной фичи в Notepad++. В процессе сделал для себя интересное открытие: В Geany и Notepad++ используется один движок – Scintilla. От этого показалось, что Notepad++ подходит еще больше: мало того, что в нем есть нужная фича, так еще и реализована на нужном движке.

    В результате Notepad++ мне не подошел по нескольким причинам:
    1. Код Notepad++ распространяется под GPL, я же хотел свой плагин открыть под BSD.
    2. В Notepad++ за подстветку тегов отвечает компонент xmlMatchedTagsHighlighter, написан на C++ с использованием STL. Я хотел сделать реализацию на C, да и в проекте Geany этот язык является предпочтительным. Об этом в списках рассылки ведутся активные дискуссии, но пока так.
    3. Реализация фичи в Notepad++ мне показалась громоздкой и некрасивой. А желание девелопить преобладало над желанием портировать.


    Пару слов про алгоритм


    … Именно слов, блок-схему рисовать желания не было. Алгоритм для поиска закрывающего тега описан ниже. Поиск открывающего работает аналогично, только вверх по документу.
    1. Проверяем, находится ли курсор в середине тега.
    2. Если да, определяем имя тега.
    3. Проверяем тип тега: открывающий или закрывающий.
    4. К примеру, открывающий. Значит двигаемся вперед относительно закрывающей скобки и проверяем, в середине тега позиция или нет.
    5. Если позиция в попала в тег и он открывающий, и имя совпадает с именем, опеределенным в шаге два, увеличиваем счетчик открывающих тегов.
    6. Если тег закрывающий, и имя совпадает с именем, опеределенным в шаге два, увеличиваем счетчик закрывающих тегов.
    7. Если счетчики открывающих и закрывающих тегов совпали, пара найдена.
    8. Подсвечиваем нужные позиции.


    Как выглядит реализация


    Исходный код уже замержен в master ветку Geany. Посмотреть можно на гитхабе.

    Для желающих попробовать в деле, которые писали мне на почту, я выложил собранный плагин в блоге (64-битная сборка для Linux).

    Ранее на официальном сайте публиковались только плагины, которые есть в релизе. Посовещавшись с сообществом в IRC, это дело я поправил, после чего PairTagHihlighter появился на сайте еще до релиза Geany 1.24.

    Чего нужно сделать


    • Добавить список непарных тегов и не подсвечивать их вообще или подсвечивать другим стилем.
    • Включить плагин для XML-документов. В данный момент он включен только для HTML, так сложилось исторически.

    Также интересно узнать, что приоритетно пользователям. Не обещаю, что все сделаю, но время от времени хочется покодить for fun. Код плагина я писал еще в апреле, и вот вернулся к нему снова.

    Update
    Если в опросе Вы выбираете «Изменить стиль подсветки» или «Другое», желательно все-таки в комментарии сообщить, что имелось в виду. Мне сложно протелепатировать :)

    Only registered users can participate in poll. Log in, please.

    Чего желают пользователи?

    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 12

      +1
      Полезный плагин, спасибо!
      Около года пользовался этой средой, очень нравилась своей легковесностью и скоростью.
        0
        Что насчёт обратной совместимости? Возможно подключить к Geany 0.21 x32, которая в LTS-дистрибутиве?
          0
          По коду обратная совместимость есть. В идеале бинарная совместимость тоже должна быть, но у Geany есть проблемы с ABI. Поэтому нужно пересобирать плагин против нужной версии.
          0
          Оффтопик.

          В своё время довольно много использовал Geany, но в конце концов меня достало поведение кнопок Home/End. Когда включен перенос строк, они, в отличие от всех остальных известных мне редакторов, ставят курсор не в начало/конец экранной строки, а в соответствующее место физической. Что прямо-таки бесит, и никак не лечится.

          В итоге сбежал на Sublime Text и пока счастлив.
            0
            Совершенно логичное поведение. Сейчас проверил, vi, vim, emacs — такое же поведение. А вот gedit, mousepad и leafpad переходят на мнимый конец «экранной» строки. Но Geany всё-таки IDE, поэтому ей логичнее быть ближе к программистским редакторам.

            А вот Eclipse, к примеру, (тоже ведь IDE) вообще не содержит функции word wrap, только если отдельный плагин поставить.
            0
            Вопросы по коду (не смотрел, может это уже учтено).
            Как насчет скорости работы на очень больших файлах? Бегать до парного тега может быть весьма затратно. Та же проблема, что и с highlighting'ом.
            Может, ограничиваться N строками выше/ниже. Но тут нужно ловить событие скролла или таки искать парный, но в фоне.

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

            P.S. Мне geany очень нравится :)
              0
              Как насчет скорости работы на очень больших файлах? Бегать до парного тега может быть весьма затратно. Та же проблема, что и с highlighting'ом.
              Может, ограничиваться N строками выше/ниже. Но тут нужно ловить событие скролла или таки искать парный, но в фоне.
              Была такая мысль, но это не реализовано.
              Вопрос еще в том, насколько это нужно на практике. Редактирует ли кто-то гигабайтные файлы руками.

              И второе. Судя по алгоритму не учитывается кривость исходного текста.
              Что Вы имеете в виду? Принцип примерно тот же, что и для подсветки скобочек в редакторах кода.

              Можно ли ожидать развития в сторону более интеллектуального поиска?
              В принципе можно ожидать чего угодно. В зависимости от того, как попрет и сколько будет свободного времени :)
                0
                Редакторы с подсветкой кода, не обрабатывающие ограниченную область, начинают тупить уже на сотнях килобайт кода. Гигабайты и не нужны. Парные теги проще считать, имхо, но все же.

                Я про ситуацию вида:
                <ul>
                  <li>hello<p>world
                  <li>foo</p>bar
                  <li>spam
                </ul>


                Или:
                <ul>
                  <li>helloworld</li>
                  <li>foobar
                  <li>spam</li>
                </ul>


                И корректно ли работает с не парными тегами (br, hr, ...)?
                  0
                  Я про ситуацию вида ...
                  Для данного случая подсветка работает так:

                  image

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

                  И корректно ли работает с не парными тегами (br, hr, ...)?
                  Корректно. Сейчас просто подсвечивается тег, в котором стоит курсор, и для него не находится пара. Как будет в ближайшее время, описано в первом пункте подзаголовка «Чего нужно сделать».
                    +1
                    Скорее такая подсветка укажет на пропущенный закрывающий тег.

                    К примеру, PhpStorm ругается на эту ситуацию, как на не закрытый тег и закрыващий без парного открывающего.
                      +1
                      Согласен, так правильней всего — можно будет подумать на досуге. Спасибо за идею )
              –1
              — Вишь в виш-листе?
              — Вижу…
              — А фичи-то нету

              Only users with full accounts can post comments. Log in, please.