Pull to refresh

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

Reading time3 min
Views8.9K
Всем привет!

Неожиданно для себя я узнал, что 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.
Чего желают пользователи?
5.19% Изменить стиль подсветки (опишите в комментариях)4
42.86% Сделать возможность настраивать цвет подсветки33
29.87% Сделать возможность расширять список непарных тегов через настройки (полезно для XML)23
15.58% Оставить все как есть, и так хорошо12
6.49% Другое (опишите в комментариях)5
77 users voted. 56 users abstained.
Tags:
Hubs:
+19
Comments12

Articles

Change theme settings