テキストエディタは、ファイルを文字の行として扱います。一般的な機能には、新しい文字の入力、行(上/下)または文字(右/左)によるナビゲーション、テキストの選択/コピー/貼り付け、テキストの削除または置換などがあります。これらの操作はすべて、文字レベルまたは行レベルで動作します。
Clojureコードを調べると、ネストされたフォームのセットとして表示できることに気付きます。ネストの各レベルは、開始デリミタと終了デリミタを持つコレクションです: ( ... )
、[ ... ]
、{ ... }
など。この規則的な構造はツリーを形成し、構造編集は、文字/行レベルではなく、ノード/ツリーレベルでコードを操作するための新しい一連の操作です。
構造編集は、Lisp言語を編集する長い歴史があり、Emacs、特にEmacsのpareditモードと最も関連付けられています。しかし、その考え方はLispやEmacsよりも一般的であり、実際、Clojureをサポートするように設計されたほぼすべてのエディタで構造編集を見つけることができます。
文字ベースの編集と同様に、構造編集には新しいフォームを作成したり、ナビゲートしたり、選択したり、コピー/貼り付けしたり、削除したりする方法がありますが、すべて文字や行ではなく、ネストされた式に関して行われます。このページでは、特定の編集者やキーを対象とするのではなく、構造編集におけるいくつかの高レベルの用語と概念を紹介することを目的としています。詳細はエディタによって大きく異なり、通常はカスタマイズも可能です。
使い始めるときは、一連の小さなコマンド(以下にすべて説明)を覚えることに集中してください。kill、slurp forward、barf forward、splice、raiseです。他のシナリオが発生したら、適切な構造編集コマンドを見つけてツールキットに追加してください。
構造編集の一般的な原則は、すべてのフォームが常にバランスが取れていることを保証することです。これは、コード内で新しいフォームを作成するときにすぐにわかります。コレクションの開始デリミタを入力すると、エディタも終了デリミタを挿入します。(
と入力すると、エディタは()
を挿入し、カーソルが中央に置かれるため、フォーム内で入力を続けることができます。ほとんどのエディタでは、開始デリミタと終了デリミタを移動するときに一致する視覚的なフィードバックも提供したり、この構造に基づいてコードの折りたたみと展開をサポートしたりすることもできます。
発生する可能性のある一般的な問題の1つ(特に学習中)は、コード構造のバランスを崩す行編集コマンドの誤った使用です。たとえば、複数行のネストされた式がある場合、中間から1行を削除すると、左かっこが削除される可能性が高く、後続の行の一致する右かっこは削除されません。慌てないでください!
この状況を修正する一般的な方法をいくつか紹介します。
元に戻す - 多くの場合、その行コマンドを元に戻し、代わりに構造編集コマンドを使用するだけで済みます。
構造編集をオフにして問題を修正し、構造編集を再度有効にする - 一部のエディタでは、フッターまたはその他の場所に構造編集を切り替えるボタンがあり、比較的簡単ですが、他のエディタではより困難になります。
文字編集コマンドを使用して修正する - たとえば、削除するぶら下がっている開きかっこなどの場合、開きかっこを選択し、文字削除を使用して削除できます(構造編集の外)。
コメントと文字編集を使用する - 閉じるぶら下がっている開きかっこがある場合、Clojureコメント;
を挿入すると、)
を入力してから、;
を選択して文字編集で削除できます。
ナビゲーション(および選択。通常は修飾子として機能します)は、文字と行ですでに行っているナビゲーションと選択の拡張です。次の単語を選択する代わりに、次の式を選択したり、包含式を選択して(ツリーを上方向に)広げたりするオプションもあります。また、マウスを使用するのが最も快適な場合は、マウスを使用して選択することもできます。
Emacsでのテキストの切り取りは「kill」と呼ばれ、貼り付けは「yank」と呼ばれます。Emacsでは、killによって切り取られたテキストブロックが「killリング」に入れられます。これは事実上スタックです。デフォルトでは、「yank」はスタックの先頭にあるテキストを貼り付け、killリングから削除します。エディタがこの機能のすべてをサポートするかどうかはエディタによって異なりますが、重要なことは、キーバインドを見るときに、「kill」が「切り取り」を意味することです。
デフォルトでは、ほとんどの構造エディタは、現在の位置から現在のコレクションの末尾までを切り取ります。ほとんどのエディタには他のさまざまなオプションがありますが、デフォルトのkillと選択だけでもほとんどの作業には十分です。
「slurp forward」コマンドは、現在のコレクションの後の式を、コレクションの最後の項目としてコレクションにスラープします。「barf forward」は、コレクションの最後の項目をコレクションの外側と後ろに移動する反対の操作を行います。コレクションの最初の要素で操作する後方バリアントも存在しますが、あまり一般的ではありません。
発生する一般的なシナリオの1つは、現在のコレクションの内容を親コレクションにスプライスすることです。これを行う場合は、前(「スプライスkill backward」)または後(「スプライスkill forward」)に項目をドロップするオプションがあります。また、親をカーソルの要素の値のみに置き換えたい場合があり、これは「raise」と呼ばれます。
数年前、Pareditの新しい代替手段としてParinferが開発されました。Parinferはインデントをネストにリンクするため、コードをインデントするだけで子式を挿入できます。多くのエディタがPareditの代替としてParinferをサポートしています。構造編集を初めて使用する場合は、試してみて、それが自分にとって意味があるかどうかを確認する必要があります。一般に、これは個人の好みの問題であるようです。
以下のリソースは、pareditコマンドを学習したり、特定のエディタで構造編集を使用したりするための追加のステップとして役立つ場合があります。一般に、ほとんどのコアコマンドセットは類似しており、構成可能なキーバインドがあります。多くの場合、デフォルトのキーバインドはEmacsのPareditにさかのぼりますが、それに拘束される必要はありません。これらをカスタマイズすることは一般的です。
Animated Paredit by Dan Midwood
Spacemacs用のSmartparens by Practicalli
Cursiveの構造編集ガイド from Cursive user guide
Calvaのpareditガイド from Calva user guide
オリジナル著者: Alex Miller