MPS 2024.3 ヘルプ

エディタークックブック

このドキュメントは、上級言語設計者を対象としており、MPS エディターに関する最も一般的な質問に対する回答を提供します。エディターのドキュメントを読むのを好むかもしれません。それはサブジェクトに関する徹底的な情報を含みます。

エディター定義を作成する方法

MPS がエディターをデザインするために言語デザイナーに提供する DSL は、セルの概念に基づいて構築されています。言語設計者は、エディターセルを組み合わせて、表記法の望ましい最終レイアウトを反映するように画面上に配置します。

Sni-mek-obrazovky-2018-10-17-v-17-45-11.png

画面の右下隅にあるインスペクターツールボタンを押すか、Alt/Cmd + 2 キーボードショートカットを使用した後にスライドインできる画面下部のインスペクターウィンドウには、セルの追加のスタイルとレイアウトのプロパティが表示されます。上記のエディターで選択されています。

空のエディター定義は、単一セルの赤いプレースホルダを示しています

Sni-mek-obrazovky-2018-10-17-v-14-55-02.png

Control + Space を押すと、挿入可能なさまざまなタイプのエディターセルが提供されます。たとえば、定数セルには、変更できないテキストラベルが表示されます。

Sni-mek-obrazovky-2018-10-17-v-14-59-55.png

エディターの定義では、空の定数テキストは次のようになります。

s0.png

エンドユーザーが使用すると、エディターは空の定数セルの代わりに空のスペースを表示します。

実行時に定数セルにユーザーに表示させたい任意のテキストを入力できます。

Sni-mek-obrazovky-2018-10-17-v-15-00-16.png

プロパティ、ノード、参照にマップされたセル

補完メニューには、ノードのプロパティ、子、または参照先の値を表示するセルもあります。これらのセルでは通常、ユーザーが表示されている値を変更することもできます。

Sni-mek-obrazovky-2018-10-17-v-14-55-16.png
Sni-mek-obrazovky-2018-10-17-v-14-55-50.png

レイアウト

単一のセルで構成されるエディターはあまり役に立ちません。エディター定義で複数のセルを組み合わせるには、コレクションレイアウトセルを使用する必要があります。MPS は、これらの 3 つのタイプ(垂直水平、およびインデントコレクションレイアウトセル)を提供します。

Sni-mek-obrazovky-2018-10-17-v-14-56-12.png

コレクションレイアウトセルは、それがラップするセルの位置を調整します。

Sni-mek-obrazovky-2018-10-17-v-14-56-26.png
Sni-mek-obrazovky-2018-10-17-v-14-56-51.png

Enter キーを押して、セルを挿入します。

Sni-mek-obrazovky-2018-10-17-v-14-57-01.png
Sni-mek-obrazovky-2018-10-17-v-14-57-15.png

これにより、必要なだけセルを挿入できます。他のコレクションレイアウトセルコレクションレイアウトセルをネストすることは可能です。

インデントレイアウトにより、デザイナーは行を折り返す場所を制御できます。セルのインスペクターで indent-layout-new-line プロパティを設定すると、セルは行の最後になります。

s1.png

次のセルが下の行に配置されます。

s2.png

同様に、indent-layout-indent プロパティを設定すると、セルがインデントされます。

s3.png

コードブロックを正しくインデントする方法

ネストされたコードブロックは、通常、垂直方向に編成されたステートメントのインデントされたコレクションを使用して表されます。MPS では、エクスペリエンスを可能な限りテキストのようにすることを目的としている場合、そのようなコレクションにはほとんどインデントされたレイアウトを使用します。 垂直および水平のレイアウトは、位置的またはよりグラフィカルなレイアウトの場合にのみ検討する必要があります。

適切にインデントされたコードブロックを作成するには、インデントされたコレクション[-... -])を作成して次のように設定する必要があります。

  • 各コレクション要素(子)が新しい行に配置されるように、indent-layout-new-line-children

  • indent-layout- コレクション全体をインデントするためのインデント

  • indent-layout-new-line コレクションの後ろに新しい行マークを配置して、次のノードがコレクションの新しい行に配置されるようにします

  • indent-layout-on-new-line オプションで、コレクション全体を前のセルに追加するのではなく、新しい行に配置するためにこのフラグが必要になる場合があります。

Editor15.png

エディター定義の強化

エイリアス

コンセプトにはエイリアスを定義できます。これは、コード補完ポップアップメニューで表し、ユーザーがエイリアスを入力するだけでこれらのコンセプトのインスタンスを挿入できるようにします。エディターは、その後 AliasEditorComponent エディターコンポーネントを使用して、エイリアスのテキストを参照することができます。これは、複数の具体的な概念が抽象的な親からエディターを継承し、エイリアスを使用して複数の概念を視覚的に区別する場合に特に役立ちます。

Editor101.png
Editor102.png
Editor103.png

次に、conceptAlias プロパティを介してエイリアス値を参照します。

Editor104.png

一意制約

一般に、制約を使用すると、ロールで許可されているノードとプロパティの値を制限し、違反をユーザーに報告できます。

Editor41.png
Editor43.png

多くの場合、コード内の許容値を制限するために制約を適用したいと思います。例: メソッド定義の名前は一意でなければならず、各ライブラリは一度だけインポートされるべきです。など。MPS には 2 つのオプションがあります。

  1. 制約を使用します。これらは、言語の抽象構文(構造)のハード妥当性ルールを定義します。特定のノードまたはプロパティを AST の一部にすることを禁止する場合は、これらを使用します。

  2. NonTypesystemRules を使用します。これらは、モデル検証の追加レベルを提供します。エディターに誤った値を入力することは引き続き許可されていますが、エラーメッセージと、ルール違反について通知する赤い下線が表示されます。制約とは異なり、開発者に役立つヒントを提供するために、追加の詳細を含むカスタムエラーメッセージを指定することもできます。

制約

Editor42.png

NonTypesystemRules

Editor44.png

インデントされた垂直コレクション

該当する場合は、垂直 / 水平レイアウトではなく、インデントレイアウトを選択することをお勧めします。インデントされた垂直コレクションを作成するには、ラッピングインデントコレクション([--] でマーク)を作成して設定します

  1. indent-layout-indent: true

  2. 選択可能: false。(false は、コード選択を展開するときにコレクションが透過的になることを意味します)。

次に、子コレクションで indent-layout-new-line-children:true を使用します。

オプションの可視性

特定の条件下でのみ表示される要素は、プロパティが設定されている場合に表示される必要があります。

Editor16.png

スタイルの定義と再利用

各セルは、インスペクターで定義された視覚スタイルを持つことができます。スタイルプロパティを個別に定義することに加えて、スタイルを事前定義して、複数の言語で再利用することができます。

Editor37.png
Editor38.png

独自のスタイルを定義してそれをエディターモジュールの一部にすることで、エディター内およびエディターモジュールをインポートするすべてのエディター内で使用できるようにすることができます。

Editor39.png

BaseLanguage スタイルを再利用する

BaseLanguage には、定義済みスタイルの豊富なコレクションが付属しています。他の言語で定義されているスタイルを使用できるようにするために必要なのは、その言語を自分の言語のエディターにインポートすることだけです。

Editor40.png

適切なキーワードを作る

キーワードは、テキストで目立つようにキーワードスタイルを適用する必要があります。また、キーワードを編集可能にすると、ユーザーはキーワードの内部または横に自由に入力して、変換を適用できるようになります。編集可能 を false に設定すると、MPS はユーザーの入力を妨害し、該当する変換に一致しない文字を無視します。

Editor18.png

簡単な編集のために抽象構文を調整する

すべての概念を同じ(抽象的な)概念から派生させることで、これらの概念のインスタンスをコンテナー内で任意の順序で混在させて一致させることができるため、ユーザーに非常にテキスト的なエクスペリエンスを提供できます。さらに、空行と(行)コメントの概念を含めると、コメントと空行を自由に配置できるようになります。

Editor2.png

この例では、SStructureContainer は、メンバーを配置する順序を強制しません。許可された要素はすべて SStructurePart の子孫であるため、すべて許可された子です。

リストのデフォルトとなる概念を指定する

テキストエディターで Enter キーを押すと、新しい行が表示されます。同様に、ユーザーが Enter を押したときに、空行の概念または言語のその他の合理的なデフォルトの概念を現在のキャレット位置のリストに追加したい場合があります。

下の 2 番目のイメージの動作は、最初のイメージの動作よりも優先されるはずです。

Editor5.png
Editor6.png

赤いプレースホルダーは、位置に存在しないノードまたは抽象概念のインスタンスによって発生します。抽象概念はインスタンス化されるべきではないため、エディターは常に赤で表示します。

ユーザーがコレクションセルで Enter キーを押すと、新しいノードが作成され、コレクションに挿入されます。新しく作成され挿入されたノードの概念は、宣言されたコレクションの概念と同じです。概念が抽象的である場合、新しく作成され挿入されたノードはその抽象的概念のインスタンスになるため、赤で表示されます。

そのような状況を防ぐには 3 つの方法があります。

  1. 子コレクションの概念を宣言するには、非抽象概念を使用します。BaseLanguage は、ステートメントにこのアプローチを使用します。これは、すべてのステートメントに共通のスーパーコンセプトであり、空の行を表すために抽象的ではありません。

  2. 抽象概念の制約デフォルトの具象概念を指定します。これは、抽象的な概念がインスタンス化されるときはいつでも、指定された具体的な概念を使用します。そのような具体的な概念は、空行の概念として使用されます。

  3. すべてのコレクションで要素ファクトリを使用します。ここでは、抽象概念とは異なる概念を使用して、新しく挿入されたノードを作成します(後述)。

デフォルトの概念を指定するのは、コレクションエディターの要素ファクトリプロパティを設定するのと同じくらい簡単です。

Editor3.png

空の行をさらに編集しやすくする

Enter キーを押した後、空の行をデフォルトとして表示することは、テキストエディターの動作を模倣するための最初の重要なステップです。さらに近づくための次のステップは、空の行をユーザー入力に合理的に反応させ、便利なコード補完を提供することです。

Editor25.png

空の行を上記と同様にする必要があります。空の定数セルを追加して編集可能に し、コード補完メニューに入力するすべての項目の super-type を指定します。以前のアドバイスに従い、空の行の位置を占める可能性のあるすべての概念が共通の祖先から派生している場合、これはメリットのあるタイプです。空の行を置き換える可能性のある概念として、その祖先を指定します。

補完メニューから概念を隠す

完了メニューは、変換メニューの言語を使用してカスタマイズできます。デフォルトでは、現在の場所で置き換えることができるすべての非抽象概念が表示されます。空の行やコメントなどの一部の概念は、完了メニューから明示的に除外したい場合があります。これを行うには、関連する概念またはそのスーパーコンセプトのデフォルトの代替メニューを言語のエディターの側面で定義し、空のままにする必要があります。 MPS は、そのメニューを使用して、コンセプトの代替が検討されるたびに、完了メニューに項目を入力します。メニューを空のままにすると、コンセプトが完了メニューに挿入されなくなります。

簡単なノード交換

同様に、新しい要素の名前を入力するだけで、開発者があるノードを別の場所に置き換えられるようにしたいことがよくあります。

Editor26.png

空行と同じように、これを機能させるには、置き換えの概念をすべての適用可能な候補概念の共通の先祖に設定します。これらはコード補完メニューに表示されます。

Editor27.png

垂直スペース区切り

要素を分離するために垂直方向のスペースを作成するには、定数セルが非常に便利です。定数セルに空の内容を与え、フォーカスに noAttraction を設定して透明にし、indent-layout-new-line を使用して別の行に配置します。

Editor4.png

定数内で空の値を処理する

プロパティの値は、値を保持することも、空にすることもできます。MPS には、空の値に適切に反応するようにエディターを調整するための 3 つのノブがあります。allow-emptytext *、および empty text * フラグの値に応じて、プロパティが空の場合、エディターセルが赤に変わったり、カスタムメッセージが表示されたりする場合があります。

空の値は許可されていません。

セルはエラーを示すために赤で表示されます。

Editor19a.png
Editor19b.png

空の値は許可されていません。

空のセルにカスタムメッセージが提供されています。

Editor24a.png
Editor24b.png

空の値を使用できます。

空のセルは、デフォルトのメッセージを灰色で表示します。

Editor20a.png
Editor20b.png

空の値を使用できます。

空のセルにカスタムメッセージが提供されています。

Editor21a.png
Editor21b.png

空の値を使用できます。

空のセルは視覚的に透明です。

Editor22a.png
Editor22b.png

空の値は許可されていません。

空の値にはデフォルトのテキストがなく、赤でマークされています。

Editor23a.png
Editor23b.png

水平リスト区切り文字

コレクションセルの separator プロパティを使用すると、次のような文字を選択できます。

  1. リストの視覚的に別の要素

  2. ユーザーがリストに新しい要素を追加または挿入できるようにする

Editor7.png
Editor8.png

区切り文字は任意の文字列値にすることができますが、1 文字の長さに保つほうが便利です。

中括弧と括弧のマッチング

中括弧と括弧をペアにするには、matching-label プロパティを使用します。これにより、ユーザーはラップされたコードブロックとその境界をすばやく視覚化できます。

Editor9.png
Editor10.png

MPS 3.4 以降、コレクションセルで show-boundaries-in スタイルを使用して、境界の表示方法を指定することもできます。スタイルには、guttergutter-and-editor の 2 つの値があります。コレクションのスタイルを gutter-and-editor に設定すると、セルの 1 つが選択されると、コレクションの最初と最後のセルがエディターでハイライトされ、括弧が左側のエディターのガターに表示されます。スタイルをガターに設定すると、括弧のみが表示され、特定のコレクションの開始位置と終了位置を表示したいが、コレクション内に明確に定義された最後のセルがない場合に役立ちます。

例:

image2016-7-26-11-7-5.png

結果:

image2016-7-26-11-9-21.png

空のブロックは空に見えるはずです

デフォルトでは、空のブロックは常に垂直の不動産の 1 行を取ります。また、デフォルトの空のセルも含まれているため、開発者は要素を追加できるリストがあるというヒントを開発者に提供できます。

Editor14.png

空のセル値を空の定数セルに設定することで、<< ... >> 文字を非表示にできます。これにより、テキストのような外観になります。

Editor11.png

もう 1 つのトリックが空の行を完全に隠します。

Editor12.png

必要なのは、開始ブレースのインデント - レイアウト - 改行句読点 - 右のプロパティを条件付きで変更して、ブレースの後に新しい行を追加 / 削除し、ブレースの直後のキャレット位置の制御をに割り当てることです。次のセル。メンバーコレクションの空の定数セルが続き、編集可能であるため、中括弧の直後の位置ですべてのキーボード入力を受け取ります。これにより、開発者は最初に新しい空の行を開始せずに入力できるようになります。

Editor-fix3.png

空の定数を編集可能にする

編集可能な プロパティが true に設定されている空の定数値を持つコレクションの空のセルを表すことをお勧めします。このようにして、ユーザーは最初に新しいコレクション要素を作成せずに(Enter キーまたは区切りキーを使用して)入力を開始できます。

Editor17.png

一般的なエディターパターン

フラグキーワードを前に付ける

Java の finalabstractpublic など、実際の概念の前にあるマーカーキーワードは、プログラミング言語では非常に一般的です。

プライベート抽象クラス MyCalculator {...}

開発者は、これらをコードに追加、変更、削除する方法についてある程度の期待を抱いており、射影エディターは、快適な直感と利便性のレベルを達成するためにいくつかの規則に従う必要があります。

  • キーワードの一部をメインの概念名の左側に入力すると、そのキーワードが挿入されます。

  • キーワードに配置されているときに削除を押すと、キーワードが削除されます

  • キーワードは、関連付けられたフラグが true の場合にのみ表示されます。たとえば、final キーワードは、Java の final クラスに対してのみ表示されます。

キーワードは、条件が根本的な抽象モデルを照会した場合のショーで、オプションであることに注意してください。

Flags1.png

アクションマッププロパティはアクションマップを参照します。これは、DELETE アクションが呼び出されたときに(おそらく Delete キーを押すことによって)、基になる抽象モデルを更新する必要があることを指定します。これにより、flag キーワードが画面から消えます。

Flags2.png

aproveDelete 呼び出しにより、ユーザーはフラグを削除するという決定を取り消すことができ、フラグを削除した後のカーソルの配置の処理方法も取り消すことができます。

開発者がキーワードを入力するだけで追加できるようにするには、左変換アクションを定義する必要があります。この例では、これを非最終要素に適用すると、「final」またはその一意の接頭辞を入力した後に要素が最終になります。変換メニュー言語では、ここで使用できる変換メニューが提供されます。

Flags3.png

次に、名前付き変換メニューを、フラグセルの前後のエディターセルにアタッチできます。

Flags4.png

パラメーター化されたキーワードの追加

MPS では、Java の実装と同様のキーワードのサポートも非常に簡単です。

Editor30.png

まず、実装全体 A、BC 部分がオプションで表示されている必要があります。

Editor36.png

実装されたインターフェースのリストが空でない場合にのみ、implements キーワードを含むコレクションが表示されます。

次に、実装 またはその一部がクラス名の直後または拡張クラスへの参照の直後に入力された場合に、新しい子を実装コレクションに追加するための正しい変換が必要です。同様に、コードブロックの左中括弧の直前に実装が入力されたときに新しい子を追加するには、左変換が必要です。繰り返しますが、変換メニュー言語を使用すると、名前付きの変換メニューを作成してセルに添付できます。

ノード置換アクション

ノード置換アクションは、特定のノードを他のノードに置き換える方法を指定します。例: その逆論理と したりと副を変更したい、まだ子ノードに指定された boolean 条件を保存することがあります。

Editor105.png

変換メニュー言語の デフォルトの代替メニューを使用しましょう:

Subst1.png

AndOr の両方の概念は LogicalOperator を継承しているため、アクションで LogicalOperator を参照できます。本質的に、アクションは、上記 LogicalOperator の任意 non-abstract のサブコンセプトで任意 LogicalOperator を交換することができます。交換概念がインスタンス化され、その左右 子供たちが交換されているノードの子から移入します。

カスタム文字列値の置換

置換規則を使用して、プレーン文字列を目的の概念のノードに変換することもできます。たとえば、Python のように、変数の名前で始まる一種の変数宣言を想像してください。

myVariable = 10;

このような変数宣言を入力するには、補完メニューから変数の概念を(その別名で)選択してから名前を入力します。

var1.png
var2.png
var3.png

ただし、代入メニューに簡単な代入アクションを追加すると、空の行に変数の名前を入力して自動的に変数を自動的に作成することができます。

var5.png
var6.png

メニューは次のようになります。

var7.png
  1. 空でないパターンが入力されたときはいつでも置き換えることができ、その位置に適用可能な既知のサブ概念のいずれの別名とも一致しません。

  2. アクションが実行され、パターンが変数の名前にコピーされると、新しいノードが作成されます。

  3. 「選択ハンドラー」は、変数が作成された後もカーソルが「name」セル内に留まるようにして、変数がすでに作成された後でもユーザーが名前の入力を続けることができるようにします。(補完メニューに他のオプションがなくなるとすぐに作成されます(「選択ハンドラー」は null を返します。これは、null 以外のノードが返されると、MPS は返されたノードにキャレット自体を配置し、「選択」コマンドを無視するためです。)

また、「strictly」フラグをチェックして動作をさらにカスタマイズすることもできます。

var4.png

これがメニューです。

var8.png

変更点:

  1. 説明は、「可変」エイリアスと一緒に補完メニューに表示するカスタマイズされた説明メッセージを提供します。

  2. パターンは、これまでに型されたテキストが作成される変数の名前として推奨されることを保証します。(コード補完メニューが表示されているとき)

  3. 代替可能 ハンドラーは、厳密パラメーターの値に反応するため、メニューで使用可能な他のサブコンセプトがある限り、このアクションも使用できますが、厳密に一致しない場合に限ります。

両親を含めて行動を変える

ノードはオプションで異なるノード、たとえば親に適用可能な変換アクションを含むことができます。例: 論理的とし、または論理式に追加するために許可している場合、論理式は、たとえば、そのエディターの最後のセルは、子ノードに属し、より複雑であるとき、まだ問題になることがあります。

Editor110.png

この例では、南に向かうことは論理式ですが、 自体は、方向という概念を持つ論理式の子です。したがって、論理式に追加される and および or を受け入れる元の右変換アクションは、ここでは機能しません。元の右変換(見出しに適用可能)アクションを、特に方向に適用可能な新しい右変換アクションに含める必要があります。

Inherit1.png

概念的な質問

既存のエディターを拡張する

MPS エディターは、モデルからノードにビジュアルセルを割り当てるため、対応する値を並べ替えてユーザー入力を受け入れる責任をノードの概念に委譲します。このメカニズムは、概念が定義されている言語に関係なく機能します。たとえば、数式が Java プログラムの一部であっても電気回路シミュレーションモデルの一部であっても、数式は正しく表示されます。

特定のエディターが利用可能でない限り、新しいサブコンセプトはデフォルトでそれらの親コンセプトのエディターを再利用します。その一方で、拡張言語は継承された概念に独自のエディターを提供し、継承されたエディターから派生した具体的な構文をオーバーライドすることがあります。

拡張用のエディターを設計する

優れた戦略は、エディターコンポーネントを使用してエディターをモジュール化することです。これにより、エディター自体を再定義することなく、言語拡張機能がコンポーネントをオーバーライドできるようになります。

エディター内からの conceptAlias などのプロパティへの参照は、ハードコードされたリテラルよりも優先されます。これにより、エディターは、エディターをオーバーライドせずにサブコンセプトに適応できるようになります。

アクションおよびインテンションの適用規則を指定するときは、サブコンセプトによっては、親のこれらのアクションから除外する必要がある場合があることに注意してください。そのようなシナリオでは、これらのアクションに適用規則の動作方法をチェックさせることをお勧めします。

メニューにリファクタリングを追加する方法

良い例として、InlineField または IntroduceVariable を使用します。一般に、jetbrains.mps.lang.plugin 言語からアクションを定義する必要があります。これは、その適用性を指定し、コンテキスト情報とユーザー入力を収集し、実際のリファクタリング手順を初期化して呼び出します。リファクタリング機能は通常、BaseLanguage クラスに抽出され、複数のアクションによって再利用される可能性があります。

同じコンセプトに複数のエディターを定義する方法

最初のサンプル

MPS にバンドルされている MultipleProjections サンプルプロジェクトは、概念ごとに複数のエディターを定義する方法とそれらの切り替えを可能にする方法を学ぶための優れた入門ガイドラインを提供します。

mp1.png

サンプル言語を使用すると、1 つ以上のステートマシンで構成されるワークフローを定義できます。ステートマシンは、構造的に表現することも、テーブルとして表現することもできます。プログラマーは、対応するステートマシン定義の先頭に構造または表形式のいずれかを入力するだけで、各ステートマシンに使用される表記を切り替えることができます。

mp2.png

このサンプルは、3 つの言語と 1 つのサンドボックスプロジェクトで構成されています。

mp3.png

requestTracking 言語は、ステートマシンをラップし、使用して単純なワークフローを定義するための概念とルート概念を提供します。これは、ステートマシン言語を埋め込み、その埋め込み言語の代替表記を可能にする必要がある言語の例として役立つ可能性があります。

stateMachine 言語は、ステートマシン言語とデフォルトのエディターの基本概念を定義します。複数の射影に固有のアーティファクトはまったくありません。MPS の言語拡張の力を説明するために、いくつかの概念の代替エディター射影が stateMachine.tabular で定義されています。これは stateMachine を拡張します。

mp5.png
mp4.png

stateMachine で指定されたデフォルトのエディターは、左上隅のデフォルト値でデフォルトであるという事実を示していますが、stateMachine.tabularエディターは表形式の ヒントを指定しています。1 つのエディターに複数のヒントを指定することもできます。

mp6.png

ヒント

適切な射影法を選択する際の重要な要素はヒントです。エディターは、どのヒントが画面に表示するようにトリガーするかを指定します。ヒントは、新しい ConceptEditorContextHints コンセプトを使用して定義されます。

mp7.png

この概念により、特定の言語またはこの言語を明示的に拡張する言語で認識される各ヒントの ID と簡単な説明を定義できます。サンプルプロジェクトでは、stateMachinestateMachine.tabular の両方が独自のヒントセットを定義します。

mp8.png

インスペクタで設定できるデフォルトのヒントとして使用できますフラグにも注目してください。true に設定すると、ヒントは IDE からエディターにプッシュされるようになります。詳細については、「IDE からのヒントのプッシュ」を参照してください。

ヒントを定義すると、言語はユーザーにヒントの追加 / 削除コンテキストによる表記を切り替えるように提供できます。サンプルの requestTracking 言語は、列挙型のプレゼンテーションプロパティをユーザーに公開することでそれを行います。このプロパティは、インスペクターウィンドウで指定されているように、ステートマシンエディターに渡されるヒントのコレクションに影響を与えます。

mp9.png

エディターコンポーネントに関するエディターのヒント

ヒントを指定できるのはエディターだけではありません。他のエディターコンポーネントをオーバーライドするエディターコンポーネントにも同じ機能があります。

HintsInComponents1.png

IDE からヒントをプッシュする

「デフォルトのヒントとして使用可能」フラグが有効になっているヒントは、新しいデフォルトとして IDE によってエディターにプッシュできます。これにより、開発者は IDE のさまざまな言語に使用されるデフォルトの射影法をカスタマイズできます。

射影法をカスタマイズする 1 つの方法は、エディターのコンテキストメニューでプッシュエディターのヒント アクションを使用し、デフォルトとしてアクティブエディターフレームにプッシュするヒントを選択することです。

mp10.png
mp11.png

アクティブエディターは選択されたヒントに一致する射影を使用します。

2 番目のオプションは、対応する設定パネルを介して IDE によってプッシュされるいくつかのヒントを作成することです。これらの選択は、デフォルト設定としてすべてのエディターウィンドウに適用されます。

mp12.png

表記法を切り替える機能とエディターフレームを分割する機能を組み合わせることを検討してください。これにより、同じコードのいくつかの異なる射影を並べて表示できます。一方での変更はもう一方にすぐに反映されます。

mp13.png

右側のパネルにはデフォルトとして表形式の表記がプッシュされていますが、左側のパネルにはありません。両方の射影は同じコードを視覚化します。

プログラムでエディターヒントを操作および適用する方法

エディターヒントを調整する独自の UI 要素を作成する場合は、エディターセルに適用されるエディターヒントを操作するコードを作成する必要があります。EditorContext は、ヒントを操作するためのエントリポイントです。ほとんどの場合、EditorComponent.getUpdater() メソッドを使用して、jetbrains.mps.openapi.editor.update.Updater インターフェースの実装を取得する必要があります。アップデータインターフェースは、ヒントを操作するためのいくつかのメソッドを提供します。

  • setInitialEditorHints()- エディターがエディターコンポーネント階層の最上位からすべてのコンポーネントに適用を開始するヒントを設定します。ただし、これらのヒントをコンテキストから明示的に削除しない限り、この操作の結果としてヒントが実際に変更された場合は true を返します。

  • getInitialEditorHints()- エディターがすべてのセルに適用するヒントを取得し、null を返す場合があります

  • addExplicitEditorHintsForNode()- 特定のノードのエディターとそれが埋め込むエディターに適用するヒントを追加します

  • removeExplicitEditorHintsForNode- ノードのエディターとノードが埋め込むエディターに明示的に適用されたヒントのリストから、指定されたヒントを削除します

  • getExplicitEditorHintsForNode- ノードのエディターとノードが埋め込むエディターに明示的に適用されたヒントのリストヒントを取得します。null を返す場合があります

  • clearExplicitHints- すべてのエディターに対して明示的に指定されたすべてのヒントをクリアします

親セルのいずれかによって追加されたヒントを含め、特定のセルに適用されたすべてのヒントを取得するには、CellContext を取得する必要があります。

editorContext.getEditorComponent()。getUpdater()。getCurrentUpdateSession()。getCellFactory()。getCellContext()。getHints()

また、ヒントを変更した後、変更を反映するためにエディターを再構築する必要があります。これは、Updater.update() メソッドを介して実行できます。

関連ページ:

エディター

言語の構造が定義されたら、開発者がそれを使用して AST を簡単に構築できるようにする手段を作成することになるでしょう。AST を直接操作することは、あまり直感的でも生産的でもないでしょう。AST を非表示にして、ユーザーに快適で直感的な操作を提供するのが、言語エディターのロールです。エディターの概要:ノードのエディターは、そのビューおよびそのコントローラーとして機能します。エディターにノードが表示され、ユーザーはそれを変更、置換、削除などできます。異なる概念のノードは異なるエディターを持ちま...

変換メニュー言語

概要:変換メニュー言語は、エディターのさまざまな場所に表示されるサブメニューとアクションの階層構造を説明する変換メニューを定義するために使用されます。現在、変換メニューが表示される可能性のある場所はいくつかあります: サイド変換メニュー、代替メニュー、コンテキストアシスタント、およびコンテキストアクションツール。変換メニュー言語の拡張に記載されているように、言語設計者とプラグイン作成者は追加の場所を定義し、場所ごとに必須またはオプションの機能 (アイコンやツールチップなど) を指定できます。メニ...

ジェネレータークックブック

この文書は、MPS ジェネレーターに関する最も一般的な質問に対する回答を提供することを目的としています。代わりにジェネレーターのドキュメントを調べてジェネレーターデモをチェックすることもできます。ジェネレーターはどのようにルールを処理しますか? :生成は、入力モデルを徐々に出力モデルに変換します。出力モデルは、TextGen を使用してテキストに変換する場合としない場合があります。生成プロセス自体はステップで構成されています。各ステップには 3 つのフェーズがあります。マッピング前スクリプトの実...

プラグインに飛び込む: PlantMPS プラグイン

導入:mbeddr.com プロジェクトによって開発された PlantUML プラグインは私には非常に興味深く思えました、すでに PlantUML を知っていたため、外部ツールを MPS にプラグインする方法を学ぶためにプラグインを研究することにしました。ボーナスとして、PlantMPS と呼ばれる自己完結型のプラグインを作成しました。これにより、mbeddr プラットフォーム全体を MPS にインポートせずに PlantUML を使用できるようになります。LanguageVisualization プ...