MPS 2020.3 ヘルプ

エディタークックブック

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

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

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

Sni mek obrazovky 2018 10 17 v 17 45 11

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

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

Sni mek obrazovky 2018 10 17 v 14 55 02

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

Sni mek obrazovky 2018 10 17 v 14 59 55

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

S0

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

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

Sni mek obrazovky 2018 10 17 v 15 00 16

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

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

Sni mek obrazovky 2018 10 17 v 14 55 16

Sni mek obrazovky 2018 10 17 v 14 55 50

レイアウト

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

Sni mek obrazovky 2018 10 17 v 14 56 12

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

Sni mek obrazovky 2018 10 17 v 14 56 26
Sni mek obrazovky 2018 10 17 v 14 56 51

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

Sni mek obrazovky 2018 10 17 v 14 57 01
Sni mek obrazovky 2018 10 17 v 14 57 15

このようにして、必要な数のセルを挿入できます。コレクションレイアウトセルを他のコレクションレイアウトセルにネストすることができます。

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

S1

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

S2

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

S3

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

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

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

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

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

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

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

Editor15

エディター定義の強化

エイリアス

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

Editor101

Editor102

Editor103

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

Editor104

固有制約

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

Editor41
Editor43

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

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

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

制約

Editor42

NonTypesystemRules
Editor44

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

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

  1. indent-layout-indent: true

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

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

オプションの可視性

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

Editor16

スタイルの定義と再利用

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

Editor37
Editor38

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

Editor39

BaseLanguage スタイルを再利用する

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

Editor40

適切なキーワードを作る

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

Editor18

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

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

Editor2

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

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

テキストエディターで Enter キーを押すと、新しい行が表示されます。同様に、ユーザーが Enter キーを押したときに、空の行の概念または言語の他の妥当なデフォルトの概念を現在のカーソル位置のリストに追加することもできます。

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

Editor5

Editor6

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

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

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

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

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

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

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

Editor3

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

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

Editor25

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

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

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

簡単なノード交換

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

Editor26

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

Editor27

垂直スペース区切り

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

Editor4

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

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

空の値は許可されていません。
セルはエラーを示すために赤で表示されます。

Editor19a

Editor19b

空の値は許可されていません。
空のセルにカスタムメッセージが提供されています。

Editor24a

Editor24b

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

Editor20a

Editor20b

空の値を使用できます。
空のセルにカスタムメッセージが提供されています。

Editor21a

Editor21b

空の値を使用できます。
空のセルは視覚的に透明です。

Editor22a

Editor22b

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

Editor23a

Editor23b

水平リスト区切り文字

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

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

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

Editor7
Editor8

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

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

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

Editor9
Editor10

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

例:

Image2016 7 26 11 7 5

結果:

Image2016 7 26 11 9 21

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

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

Editor14

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

Editor11

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

Editor12

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

Editor fix3

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

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

Editor17

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

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

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

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

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

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

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

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

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

Flags1

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

Flags2

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

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

Flags3

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

Flags4

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

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

Editor30

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

Editor36

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

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

ノード置換アクション

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

Editor105

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

Subst1


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

カスタム文字列値の置換

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

myVariable = 10;

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

Var1

Var2

Var3

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

Var5

Var6

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

Var7

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

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

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

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

Var4

これがメニューです。

Var8

変更点:

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

  2. このパターンにより、これまでに入力されたテキストが、作成される変数の名前として提案されます。(コード補完メニューが表示されているとき)

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

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

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

Editor110

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

Inherit1

概念的な質問

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

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

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

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

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

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

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

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

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

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

最初のサンプル

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

Mp1

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

Mp2

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

Mp3

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

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

Mp5
Mp4

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

Mp6

ヒント

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

Mp7

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

Mp8

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

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

Mp9

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

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

Hints in components1

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

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

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

Mp10
Mp11

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

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

Mp12

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

Mp13

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

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

エディターヒントを調整する独自の 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 プラグイン...