Как мы делали плагин для kate

в 10:04, , рубрики: c++, kde, linux, open source, opensource, plugin, Программирование, метки: , , , ,

В данной статье описан процесс написания плагина для kate под названием Neznaju. Плагин предназначен для совместного редактирования текста через сеть. Используя этот плагин вы можете создать сервер, или подключиться к созданному кем-то серверу и совместно редактировать какой-то текст. Плагин максимально простой. На данный момент он поддерживает подключение нескольких клиентов, а также редактирование объёмных файлов (т. к. передаётся только информация об изменениях в документе).

Идея

Однажды мне в скайп написал знакомый, и предложил потестировать Gobby — программу для совместного редактирования текста. Мы созвонились и скачали стабильные версии Gobby. Запустив Gobby я долго пытался понять, как с ней работать. А точнее как создать сервер. В итоге, облазив все пункты меню, пункта создать сервер я так и не нашёл. Возможно скачал не ту версию Gobby, возможно что-то ещё. В итоге я запустил консольную версию сервера, а затем подключился к ней из клиентской. Но проблемы на этом не закончились. Мой знакомый не мог подключиться. Оказалось что в той Gobby, которая у него, включено шифрование, и при подключении его нельзя отключить.

Не буду утомлять читателей подробностями, скажу лишь что в итоге нам удалось всё настроить, подключиться и посмотреть как это работает. И сразу возник вопрос, а нужно ли 90% функциональность Gobby рядовым пользователям?

Возможно, что кому-то и нужна целая куча всяких фишек вроде шифрования, чата, списка пользователей, комнат и т. п. Мы же решили сделать максимально простой инструмент, который делает лишь то, что от него хотят. А именно — это будет плагин, а не новый текстовый редактор. Он будет уметь работать в качестве сервера (слушать заданный порт), а также в качестве клиента (подключаться по заданному адресу). Для обмена информацией между сервером и клиентом будет использоваться простой текстовый протокол, чтобы каждый мог с легкостью написать плагин для своего любимого текстового редактора (или IDE), и они могли вместе работать.

В качестве текстового редактора был выбран kate, потому что мы оба любители Qt, а более распространенного редактора на Qt мы не знаем. Беглый поиск по интернету выдал GSoС’овский проект одного парня из Запорожья, который за лето планировал создать подобный плагин для Kate с ипользованием telepathy tubes. А как насчёт написать плагин за несколько дней? Challenge was accepted.

Разработка

Я установил виртульную машину с debian, скачал пакет kate-dev с заголовочными файлами, необходимыми для сборки, а так же поставил QtCreator. После этого можно было приступать непосредственно к разработке.

Отметим, что плагин не напрямую зависит от kate, это плагин к KTextEditor, компоненте текстового редактора в kate и kwrite.

В качестве примера был взят плагин TimeDate из туториала по созданию плагинов к kate. Собирается оно традиционно с помощью cmake. Кроме файлов с исходниками для работы плагина необходимы ещё два файла — plugin.desktop и plugin.rc (для регистрации возможностей нашего плагина в редакторе).

После того, как мы собрали и установили тестовый плагин, пришло время задуматься о протоколе обмена и об архитектуре плагина. Вначале мы решили сделать самый простой вариант из всех возможных: при любом изменении документа клиент должен послать полное содержимое серверу, а сервер, в свою очередь, клиенту. Формат сообщений взяли XML-подобным: полный документ окаймляется тегом full.

Для сетевых взаимодействий мы воспользовались модулем QtNetwork, а точнее классами QTcpServer для организации серверной части и QTcpSocket для клиентской.

Когда примитивный плагин заработал, мы решили не перепосылать документ целиком, а только появляющиеся в нём изменения. Для того, чтоб определять изменения мы воспользовались библиотекой diff-match-patch. Это было неплохое решение, однако на больших документах разница между текстами после каждого изменения рассчитывалась очень долго. К счастью, оказалось, что сам ktexteditor умеет посылать сигналы об изменениях (сигналы textInserted и textRemoved). Поэтому мы решили отказаться от использования diff-match-patch, а просто пересылать информацию об изменениях, передаваемую через эти сигналы. Общая схема плагина получилась такой:

Как мы делали плагин для kate

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

Вывод

Ну и самое главное, что мы вынесли из всего этого процесса:
— opensource это просто. Выбирайте понравившийся проект, пишите код и получайте удовольствие!
— парное программирование cool. Намного веселей чем кодить в одиночку. Если вам нравится программировать, вдвоём вам понравится ещё больше. Созваниваетесь, запускаете любимое ide и вперёд!
— KDEшники редиски. Написали им в мейллист, а они молчат.

Ссылки

Исходники на гитхабе
Руководство по написанию плагинов к ktexteditor
KTextEditor API Reference
Diff match patch — библиотека, определяющая разницу между двумя текстами

Автор: bak


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js