Geanyのブラケットを自動閉じる

Geanyソースコードエディターを使用した場合、ブラケットと引用符の標準的な自動終了の予測が不十分な動作に出くわした可能性があります。 使用しない場合-試すことをお勧めします。



Geanyは素晴らしいエディターですが、その歴史を通して、自動クローズは次のように機能しました。



func())
      
      





または:



 func() { }}
      
      





ブラケットの手動配置に終止符を打つときです。 Geanyの新しい自動クローズモードをご覧ください。



画像



前文



Geanyには、オートコンプリートとオートクローズの「ネイティブ」モードがあります(混同しないでください:オートコンプリートは関数とメソッド用であり、オートクローズはペア括弧と引用符用です)。 アルゴリズムの本質は簡単に思えます。1つの文字のクリックを追跡し、対応するペアを挿入します。 しかし、落とし穴が山ほどあり、そこに飛び込んで多くの円錐を埋めることができます。



問題1 :人々はメモ帳に慣れています。 多くの場合、開始ブラケットと終了ブラケットの両方をすぐに機械的に配置するため、結果はすぐに現れます。



 f()) f();) f() {}} f("abc"");
      
      





バックスペースを使用してブラケットを取り外すことにしましたか? 受信:



 f()) -> f))
      
      





この自動クローズモードでは障害が発生するだけなので、すぐにオフにする方が簡単です。



問題2 :異なる言語では、括弧と引用符が意味をなします。 たとえば、C ++では、通常、中括弧はブロックの境界を定義しますが、Bashでは、これは単純に変数の一部になります。 Geanyは多言語エディタであり、各言語の機能を個別に考慮することは問題ありません。



問題3 :多くのエディターでは、テキストの一部を選択して角かっこ/引用符を押すと、選択したテキストがこの文字で「ラップ」されます。 Geanyでは、このテキストは単に削除されます。



問題4 :これを疑ったことはないかもしれませんが、Geanyでは、Shiftキーを押しながら選択を複数行選択モードに切り替えます。 言うまでもなく、このモードでの自動クローズはサポートされていません。 ブロックの割り当ては「仮想」スペースをキャプチャするため、実装は非常に困難です。





そしてエディターにはクリップボード、アンドゥ/リドゥバッファー、ホットキーがあり、これらすべてが何らかの形で一緒に機能するはずです...



解決策



このような問題は21世紀のノートブックにはまったく直面していないため、Geanyへの追加として自動閉鎖を実装することが決定されました。 幸いなことに、APIを使用すると簡単にこれを実行できます。 それは言われている-意図的な決定により、プラグインはgeany-pluginsプロジェクトに含まれており、Geanyの次のバージョンで代替の自動クローズモードとして使用できるようになります(このため、プラグインメニューにチェックを入れるだけで十分です)。



彼は今何を知っていますか? そして彼は非常に多くのことができます:





とりわけ、さまざまな言語の機能が考慮されます。たとえば、Cのような言語の場合、テキストを選択して{を押すと、新しいブロックが表示されます。 Bashでは、逆引用符の自動クローズが有効になっています。 HTML文字の<>が完了するなど。Cライクな言語の場合も、自動インデントが大幅に改善されました。



どのように機能しますか?



GeanyはScintillaに基づいており、Scintillaはテキストバッファーの操作に関してかなり多様なAPIを提供します。 アイデアは、いつものようにシンプルです。キーストロークを監視し、状況に応じて環境に対応します。 しかし、Scintillaには致命的な欠陥があったため、APIを使用すると、バックスペースを除くすべてのキーストロークを追跡できます。 些細なこと? そして、キャラクターの除去のイベントをどのように追跡しますか?



その結果、Scintilla APIをバイパスし、純粋なGLibを使用して、megakostylイベント処理を作成しなければなりませんでした。 この松葉杖の複雑さは、ドキュメントの開閉を正しく処理する必要があることです(そして、多くのタブが存在する可能性があります)。1つのイベントに複数のハンドラーを誤ってフックしたり、間違った場所にフックしたりしないようにします。 たとえば、アドオンプラグインの典型的なバグ-ハンドラーはメインウィンドウに添付されます。 現在、プラグインイベントはどこでもトリガーされます-ターミナルでも。 一般に、いつかGeanyのプラグインを作成する必要があり、標準のScintilla APIでは不十分な場合、 Autocloseプラグインで常に安定した松葉杖の実装を見つけることができます。



残りは退屈な一連のスイッチと条件です。 興味深いから-ドキュメントへのポインタの有効性を確認してください-ドキュメント。 このニュアンスで、多くのプラグインが死にました:開発者は、すべての普通の人と同じように関数引数を知らずにチェックします:



 if(NULL == doc) return; //error!
      
      





Geanyの問題は、ドキュメントが厳密に言えばNULLではないかもしれないということですが、アクセスしようとするとデフォルトになります。 どうして? Geany内部では、ポインターの再利用を積極的に実践していることがわかりました。 星が故障し、検証時にドキュメントが閉じられると、そのポインタが不正確になったり、完全に異なるドキュメントを指すことさえあります。 衝突を避けるために、DOC_VALIDマクロでドキュメントを確認する必要があります。



Geany自身がレーキを踏んでいることに注意してください:神秘的なセグメンテーション違反、アセンブラーダンプでの占いそしてその結果、最も重要なドキュメントロード関数でNULLのドキュメントをチェックしています



インストール方法



現時点では、アドオンはgitヘッドにあります。つまり、Geanyのリリースとともにまだリリースされていません。 プラグインはバージョン1.24でのみ表示されますが、現在は次のいずれかの方法で使用できます。

-いわゆる「ナイトビルド」からまだリリースされていない実験的なGeany 1.24をダウンロードします。すべてがすでにあります: nightly.geany.org

-プラグインを個別にダウンロードし、古いバージョンでアセンブルしてみてください

-オートビルドライブラリをナイトビルドから取得して1.23に入れようとしますが、保証はありません



注意! 2番目の方法は、極端なスポーツ専用です。
-gitaからgeany-pluginsのソースをダウンロードする必要があります: github.com/scriptum/geany-plugins

-バージョン1.23のgeany-pluginsソースをダウンロード: www.geany.org/Download/Releases

-autocloseプラグインをバージョン1.23にコピーし、1.23ソース内にプラグインをビルドしようとします



あまりはっきりしない方法で散らばっているすべてのautotoolsスクリプトにプラグインを登録する必要があるため、すぐには収集されません。



毎晩のアセンブリを使用することを恐れないでください:Geanyのすべての編集は徹底的にテストおよび検証されています。さらに、多数のバグとリークが1.24で修正され、多くの有用な機能が追加されました。「安定した」1.23よりもはるかに安定していると言えます。 インストール後、プラグインメニューとバトルでAutocloseプラグインを有効にする必要があります。



次は?



プラグインは今のところプラグインを残すことになっています。 リリースによる火災の洗礼後、それはGeanyに移行します(Autocloseはプラグインのままですが、geany-pluginsプロジェクトではなくGeany自体の一部になります)。その後、おそらく古い機能はエディターから直接削除されます。 彼はオートコンプリートの問題を解決しません。これは別の(そしてかなり大きな)作業のトピックです。IRCにはGeanyにclangをねじ込みしようとしているといううわさがありますが...



それまでの間、リリース前の憧れの期間中に、バグを報告するか、希望を表明することを読者に提案します。 特に、私は非常に曖昧なアイデアを持っている言語のサポートはありません。



All Articles