ケイトのプラグインはどうやって作ったのですか

この記事では、NeznajuというKateのプラグインを作成するプロセスについて説明します。 プラグインは、ネットワークを介してテキストを共同編集するために設計されています。 このプラグインを使用すると、サーバーを作成したり、誰かが作成したサーバーに接続して共同でテキストを編集したりできます。 プラグインは可能な限りシンプルです。 現時点では、複数のクライアントの接続、および大量のファイルの編集をサポートしています(ドキュメントの変更に関する情報のみが送信されるため)。



アイデア



かつて、友人がSkypeで私に書いて、テキストを共同編集するプログラムであるGobbyのテストを申し出ました。 Gobbyの安定バージョンを電話でダウンロードしました。 Gobbyを始めて、私は長い間、それを使って作業する方法を理解しようとしました。 むしろサーバーの作成方法。 その結果、すべてのメニュー項目を登ったのに、サーバーを作成するオプションが見つかりませんでした。 たぶん、間違ったバージョンのGobbyをダウンロードしたのかもしれません。 その結果、サーバーのコンソールバージョンを起動し、クライアントからサーバーに接続しました。 しかし、問題はそこで終わりませんでした。 友達が接続できませんでした。 彼が持っているゴビーでは、暗号化がオンになっており、接続するとオフにできないことが判明しました。



読者に詳細を説明することはせず、最終的にすべてを構成し、接続し、どのように機能するかを確認したとのみ言います。 そして、すぐに疑問が生じました。普通のユーザーにはGobby機能の90%が必要ですか?



暗号化、チャット、ユーザーのリスト、部屋など、あらゆる種類のチップが必要になる可能性があります。私たちは、自分が望むものだけを実行する最もシンプルなツールを作成することにしました。 つまり-それは新しいテキストエディタではなく、プラグインになります。 彼はサーバー(特定のポートをリッスン)として、またクライアント(特定のアドレスに接続)として働くことができます。 シンプルなテキストプロトコルを使用してサーバーとクライアント間で情報を交換します。これにより、誰でも簡単にお気に入りのテキストエディター(またはIDE)用のプラグインを作成し、連携することができます。



ケイトがテキストエディターとして選ばれたのは、私たちはどちらもQtが好きで、より一般的なQtエディターがわからないからです。 インターネットで簡単に検索した結果、GazのプロジェクトはZaporozhyeの1人で、夏にはテレパシーチューブを使用して同様のプラグインを作成することを計画していました。 数日でプラグインを書くのはどうですか? チャレンジが受け入れられました。



開発



debian仮想マシンをインストールし、ビルドに必要なヘッダーファイルを含むkate-devパッケージをダウンロードし、QtCreatorもインストールしました。 その後、開発に直接進むことができました。



プラグインはkateに直接依存しないことに注意してください。これは、kateおよびkwriteのテキストエディターのコンポーネントであるKTextEditorのプラグインです。



kateプラグインの作成に関するチュートリアルのTimeDateプラグインが例として取り上げられました。 従来はcmakeを使用して収集されます。 ソースファイルに加えて、プラグインにはさらに2つのファイルが必要です-plugin.desktopとplugin.rc(エディターでプラグインの機能を登録するため)。



テストプラグインを組み立ててインストールしたら、交換プロトコルとプラグインアーキテクチャについて考えます。 最初に、最も単純なオプションを使用可能にすることを決定しました。ドキュメントが変更された場合、クライアントは完全なコンテンツをサーバーに送信し、サーバーはクライアントに送信する必要があります。 メッセージの形式はXMLのようになりました。完全なドキュメントは完全なタグで囲まれています。



ネットワークインタラクションでは、QtNetworkモジュールを使用しました。または、サーバーサイドとクライアントのQTcpSocketを整理するためにQTcpServerクラスを使用しました。



プリミティブプラグインが機能したとき、ドキュメント全体を再送信するのではなく、ドキュメントに表示される変更のみを再送信することにしました。 変更を決定するために、diff-match-patchライブラリを使用しました。 これは良い解決策でしたが、大きなドキュメントでは、各変更後のテキスト間の差が非常に長い間計算されていました。 幸いなことに、ktexteditor自体が変更に関するシグナル(textInsertedおよびtextRemovedシグナル)を送信できることがわかりました。 そのため、diff-match-patchの使用を放棄し、これらの信号を介して送信された変更に関する情報を単に転送することにしました。 プラグインの一般的なスキームは次のとおりです。







ほとんどのバグをキャッチした後、誰かに役立つかもしれない非常に実行可能なツールを得ました。 ソースはgithubにあります。



おわりに



最も重要なことは、このプロセス全体から学んだことです。

-オープンソースは簡単です。 お気に入りのプロジェクトを選択し、コードを書いて楽しんでください!

-ペアプログラミングがクール。 コーディングだけよりもはるかに楽しい。 プログラミングが好きなら、二人はそれをさらに楽しむでしょう。 呼び出して、お気に入りのideを開始してください!

-KDE大根。 彼らは彼らにメーリングリストを書きました、そして彼らは沈黙しています。



参照資料



Githubソース

Ktexteditorプラグイン作成ガイド

KTextEditor APIリファレンス

差分一致パッチ-2つのテキストの違いを決定するライブラリ



All Articles