エディタークックブック
このドキュメントは、上級言語設計者を対象としており、MPS エディターに関する最も一般的な質問に対する回答を提供します。エディターのドキュメントを読むのを好むかもしれません。それはサブジェクトに関する徹底的な情報を含みます。
- エディター定義を作成する方法
- プロパティ、ノード、または参照にマップされたセル
- レイアウト
- コードブロックを正しくインデントする方法
- エディター定義の強化
- エイリアス
- 固有制約
- インデントされた垂直コレクション
- オプションの可視性
- スタイルの定義と再利用
- BaseLanguage スタイルを再利用する
- 適切なキーワードを作る
- 簡単な編集のために抽象構文を調整する
- リストのデフォルトとなる概念を指定する
- 空の行をさらに編集しやすくする
- 補完メニューから概念を隠す
- 簡単なノード交換
- 垂直スペース区切り
- 定数内で空の値を処理する
- 水平リスト区切り文字
- 中括弧と括弧のマッチング
- 空のブロックは空に見えるはずです
- 空の定数を編集可能にする
- 一般的なエディターパターン
- フラグキーワードを前に付ける
- パラメーター化されたキーワードの追加
- ノード置換アクション
- カスタム文字列値の置換
- 両親を含めて行動を変える
- 概念的な質問
- 既存のエディターを拡張する
- 拡張用のエディターを設計する
- メニューにリファクタリングを追加する方法
- 同じコンセプトに複数のエディターを定義する方法
- 最初のサンプル
- ヒント
- エディターコンポーネントに関するエディターのヒント
- IDE からヒントをプッシュする
- プログラムでエディターヒントを操作および適用する方法
エディター定義を作成する方法
MPS がエディターをデザインするために言語デザイナーに提供する DSL は、セルの概念に基づいて構築されています。言語設計者は、エディターセルを組み合わせて、表記法の望ましい最終レイアウトを反映するように画面上に配置します。
画面右下のインスペクターツールボタンを押すか Alt/Cmd + 2 キーボードショートカットを使用した後にスライドインできる画面下部のインスペクタウィンドウには、エディターで選択したセルの追加のスタイルとレイアウトプロパティが表示されます。上記。
空のエディター定義は、単一セルの赤いプレースホルダを示しています
Control + Space を押すと、挿入可能なさまざまなタイプのエディターセルが提供されます。: たとえば、定数セルには、変更できないテキストラベルが表示されます。
エディターの定義では、空の定数テキストは次のようになります。
エンドユーザーが使用すると、エディターは空の定数セルの代わりに空のスペースを表示する
実行時に定数セルにユーザーに表示させたい任意のテキストを入力できます。
プロパティ、ノード、または参照にマップされたセル
補完メニューには、ノードのプロパティ、子、または参照先の値を表示するセルもあります。これらのセルでは通常、ユーザーが表示されている値を変更することもできます。
レイアウト
単一のセルからなるエディターはあまり役に立ちません。エディター定義で複数のセルを組み合わせるには、コレクションレイアウトセルを使用する必要があります。MPS はこれらの 3 つのタイプを提供します - 垂直、水平とインデントコレクションレイアウトセル。
コレクションレイアウトセルは、それがラップするセルの位置を調整する
Enter キーを押して、追加のセルを挿入する
このようにして、必要な数のセルを挿入できます: コレクションレイアウトセルを他のコレクションレイアウトセルにネストすることができます。
インデントレイアウトにより、デザイナーは行を折り返す場所を制御できます。セルのインスペクタで indent-layout-new-line プロパティを設定すると、セルは行の最後になります。
次のセルが下の行に配置されます。
同様に、indent-layout-indent プロパティを設定すると、セルがインデントされます。
コードブロックを正しくインデントする方法
ネストされたコードブロックは通常、インデントされた縦に編成されたステートメントのコレクションを使用して表されます。MPS では、可能な限りテキストのようなエクスペリエンスを実現することを目的としている場合、このようなコレクションにはインデントレイアウトをほぼ排他的に使用します。垂直方向と水平レイアウトは、位置的またはよりグラフィカルなレイアウトに対してのみ考慮されるべきです。
そのため、適切にインデントされたコードブロックのためには、インデントコレクション([ - ... -])を作成して設定する必要があります。
各コレクション要素(子)が新しい行に配置されるように indent-layout-new-line-children
コレクション全体をインデントする indent-layout-indent
次のノードがコレクションの新しい行に配置されるように、コレクションの後ろに新しい行マークを付ける indent-layout-new-line
indent-layout-on-new-line オプションとして、前のセルに追加するのではなく、コレクション全体を新しい行に配置するためにこのフラグが必要な場合があります。
エディター定義の強化
エイリアス
概念には別名を定義することができます。これにより、コード補完ポップアップメニューでそれらの概念を表し、ユーザーは別名を入力するだけでこれらの概念のインスタンスを挿入できます。エディターは AliasEditorComponent エディターコンポーネントを使用してエイリアスのテキストを参照することができます。これは、複数の具象概念が抽象親からエディターを継承し、エイリアスを使用して複数の概念を視覚的に区別する場合に特に便利です。
次に、conceptAlias プロパティを介してエイリアス値を参照します。
固有制約
一般に、制約を使用すると、ロールで許可されているノードとプロパティの値を制限し、違反をユーザーに報告できます。
多くの場合、コード内の許容値を制限するために制約を適用したいと思います。例: メソッド定義の名前は一意でなければならず、各ライブラリは一度だけインポートされるべきです。など。MPS には 2 つのオプションがあります。
制約を使用する - これらはあなたの言語の抽象構文(構造)に対する厳しい妥当性規則を定義します。特定のノードまたはプロパティを AST の一部にすることを禁止したい場合は、これらを使用してください。
NonTypesystemRules を使用 - これらは追加レベルのモデル検証を提供します。それでも、エディターに誤った値を入力することはできますが、エラーメッセージと、ルール違反について通知する赤い下線が表示されます。制約とは異なり、開発者に役立つヒントを与えるために追加の詳細を含むカスタムエラーメッセージを指定することもできます。
制約
NonTypesystemRules
インデントされた垂直コレクション
必要に応じて、垂直 / 水平レイアウトの代わりに、インデントレイアウトを選択します。インデントされた垂直コレクションを作成するには、折り返しインデントコレクション([--] でマーク)を作成して設定できます。
indent-layout-indent: true
選択可能:false (false は、コード選択を拡張するときにコレクションが透明になることを意味します)。
次に、子コレクションで indent-layout-new-line-children:true を使用します。
オプションの可視性
特定の条件下でのみ表示されるはずの要素には、show if プロパティを設定する必要があります。
スタイルの定義と再利用
各セルはインスペクターで定義された視覚スタイルを持つことができます。スタイルプロパティを個別に定義するだけでなく、スタイルを事前定義してから複数の言語で再利用することもできます。
独自のスタイルを定義してそれをエディターモジュールの一部にすることで、エディター内およびエディターモジュールをインポートするすべてのエディター内で使用できるようにすることができます。
BaseLanguage スタイルを再利用する
BaseLanguage には、定義済みスタイルの豊富なコレクションが付属しています。他の言語で定義されているスタイルを使用できるようにするために必要なのは、その言語を自分の言語のエディターにインポートすることだけです。
適切なキーワードを作る
キーワードは、テキストで目立つようにキーワードスタイルを適用する必要があります。また、キーワードを編集可能にすると、ユーザーはキーワードの内側または横に自由に入力して変換を適用できます。editable を false に設定すると、 MPS はユーザーの入力を妨げ、文字を無視します。これは適用可能な変換には一致しません。
簡単な編集のために抽象構文を調整する
すべての概念を同じ(抽象的な)概念から派生させることで、これらの概念のインスタンスをコンテナー内で任意の順序で混在させて一致させることができるため、ユーザーに非常にテキスト的なエクスペリエンスを提供できます。さらに、空行と(行)コメントの概念を含めると、コメントと空行を自由に配置できるようになります。
この例では、SStructureContainer はメンバーを配置する順序を強制しません。許可された要素はすべて SStructurePart から派生しているため、すべて許可された子です。
リストのデフォルトとなる概念を指定する
テキストエディターで Enter を押すと、新しい行が表示されます。同様に、ユーザーが Enter キーを押したときに、現在のカーソル位置のリストに空行の概念または他の合理的なデフォルトの概念を追加することをお勧めします。
下の 2 番目のイメージの動作は、最初のイメージの動作よりも優先されるはずです。
赤いプレースホルダーは、位置に存在しないノードまたは抽象概念のインスタンスによって発生します。抽象概念はインスタンス化されるべきではないため、エディターは常に赤で表示します。
ユーザーがコレクションセルで Enter キーを押すと、新しいノードが作成され、コレクションに挿入されます。新しく作成され挿入されたノードの概念は、宣言されたコレクションの概念と同じです。概念が抽象的である場合、新しく作成され挿入されたノードはその抽象的概念のインスタンスになるため、赤で表示されます。
そのような状況を防ぐには 3 つの方法があります。
子コレクションの概念を宣言するには、非抽象概念を使用してください。BaseLanguage はステートメントに対してこのアプローチを使用します。これはすべてのステートメントに共通のスーパーコンセプトであり、空行を表すために抽象的ではありません。
抽象概念の制約にデフォルトの具象概念を指定してください。抽象概念が具体化されることになっているときはいつでも、これは指定された具体的な概念を使います。そのような具体的な概念は、空行の概念として使用されます。
すべてのコレクションで要素ファクトリを使用します。ここでは、抽象概念とは異なる概念を使用して、新しく挿入されたノードを作成します(後述)。
デフォルトの概念を指定するのは、コレクションエディターの要素ファクトリプロパティを設定するのと同じくらい簡単です。
空の行をさらに編集しやすくする
Enter キーを押した後に空行をデフォルトとして表示させることは、テキストエディターの動作を真似るための最初の重要なステップです。さらに近づけるための次のステップは、空行をユーザー入力に適度に対応させ、便利なコード補完を提供することです。
空の行を上の行と同じようにする必要があります。空の定数セルを追加して編集可能にし、code-completion メニューに表示するすべての項目の super-type を指定します。空の行の位置を占める可能性があるすべての概念が前のアドバイスに従っていて、共通の祖先から派生している場合、これは有益なタイプです。空の行を潜在的に置き換える概念としてその先祖を指定します。
補完メニューから概念を隠す
補完メニューは変換メニューの言語を使用してカスタマイズできます。デフォルトでは、現在の場所で置き換えることができるすべての非抽象概念が表示されます。空の行やコメントなど、一部の概念では、補完メニューから明示的に除外したい場合があります。そうするためには、あなたの言語のエディターの側面で関係のある概念またはそのスーパー概念のためにデフォルトの代替メニューを定義し、それを空のままにする必要があります。MPS はあなたの概念が代用と考えられているときはいつでもアイテムを補完メニューに入れるためにそのメニューを使います。メニューを空のままにしておくと、概念が完成メニューに挿入されません。
簡単なノード交換
同様に、新しい要素の名前を入力するだけで、開発者があるノードを別の場所に置き換えられるようにしたいことがよくあります。
空行と同じように、これを機能させるには、置き換えの概念をすべての適用可能な候補概念の共通の先祖に設定します。これらはコード補完メニューに表示されます。
垂直スペース区切り
要素を分離するために縦方向のスペースを作成するには、定数セルを使用するのが非常に便利です。それらに空の内容を与え、それを透明にするためにフォーカスのために noAttraction を設定し、 indent-layout-new-line と別の行に配置します。
定数内で空の値を処理する
プロパティの値は、値を保持するか空にすることができます。MPS には、空の値に適切に反応するようにエディターを調整するための 3 つのノブがあります。allow-empty、テキスト * および空のテキスト * フラグの値に応じて、プロパティが空のときにエディターセルが赤に変わったりカスタムメッセージが表示されたりすることがあります。
空の値は許されません。 | ||
---|---|---|
空の値は許されません。 | ||
空の値は許可されています。 | ||
空の値は許可されています。 | ||
空の値は許可されています。 | ||
空の値は許されません。 |
水平リスト区切り文字
コレクションセルの separator プロパティを使うと、文字を選択することができます。
リストの視覚的に別の要素
ユーザーがリストに新しい要素を追加または挿入できるようにする
区切り文字は任意の文字列値にすることができますが、1 文字の長さに保つほうが便利です。
中括弧と括弧のマッチング
中括弧と括弧を組み合わせるには、matching-label プロパティを使用します。これにより、ユーザーはラップされたコードブロックとその境界をすばやく視覚化することができます。
MPS 3.4 以降、コレクションセルに show-boundaries-in スタイルを使用して、その境界の表示方法を指定することもできます。スタイルは 2 つの値、ガターと gutter-and-editor を持ちます。コレクションのスタイルを gutter-and-editor に設定すると、いずれかのセルが選択されたときにコレクションの最初と最後のセルがエディターでハイライトされ、左側のエディターのガターに括弧が表示されます。スタイルをガターに設定すると括弧のみが表示され、特定のコレクションの開始位置と終了位置を表示したいがコレクション内に明確に定義された最後のセルがない場合に便利です。
例:
結果:
空のブロックは空に見えるはずです
デフォルトでは、空のブロックは常に垂直の不動産の 1 行を取ります。また、デフォルトの空のセルも含まれているため、開発者は要素を追加できるリストがあるというヒントを開発者に提供できます。
空のセル値を空の定数セルに設定することで << ... >> 文字を非表示にすることができます。これにより、もう少しテキスト的な外観になります。
もう 1 つのトリックが空の行を完全に隠します。
必要なのは、開きブレースの indent-layout-new-line と punctuation-right プロパティを条件付きで変更して、ブレースの後に新しい行を追加 / 削除し、ブレースの直後のキャレット位置の制御を次のセルに割り当てることです。members コレクションの空の定数セルが続き、編集可能なので、中括弧の直後の位置ですべてのキーボード入力を受け取ります。これにより、開発者は最初に新しい空行を開始せずに入力することができます。
空の定数を編集可能にする
editable プロパティが true に設定されている空の定数値でコレクションの空のセルを表すことをお勧めします。これにより、ユーザーは最初に新しいコレクション要素を作成することなく( Enter キーまたは区切りキーを使用して)入力を開始できます。
一般的なエディターパターン
フラグキーワードを前に付ける
Java の final、abstract、public など、実際の概念の前に付けられるマーカーキーワードは、プログラミング言語では非常に一般的です。
プライベート抽象クラス MyCalculator {...}開発者は、これらをコードに追加、変更、または削除する方法についてある程度の期待を抱いており、プロジェクションエディターは、快適な直感と利便性のレベルを達成するためにいくつかの規則に従う必要があります。
キーワードの一部をメインの概念名の左側に入力すると、そのキーワードが挿入されます。
キーワードの上にいるときに delete を押すと削除されます
キーワードは、関連付けられているフラグが true の場合にのみ表示されます。たとえば、final キーワードは Java の final クラスに対してのみ表示されます。
キーワードはオプションであり、show if 条件が基本となる抽象モデルを照会していることに注意してください。
アクションマッププロパティは、DELETE アクションが(おそらく削除キーを押すことによって)呼び出されたときに、基盤となる抽象モデルを更新する必要があることを指定するアクションマップを参照します。これにより、flag キーワードが画面から消える
aproveDelete 呼び出しによって、フラグを削除する決定を取り消すことができます。また、フラグを削除した後にカーソルをどのように配置するかが処理されます。
開発者が入力するだけでキーワードを追加できるようにするには、左変換アクションを定義する必要があります。この例では、final 以外の要素に適用すると、「final」または任意の一意の接頭辞を入力した後で要素が final になります。変換メニューの言語から変換メニューが得られます。これはここで利用できます。
その後、名前付き変換メニューをフラグセルの前後にあるエディターセルに添付できます。
パラメーター化されたキーワードの追加
MPS では、Java の実装に似たキーワードのサポートも非常に簡単です。
まず、A、B C を実装しますパーツ全体がオプションで表示されている必要があります。
実装されたインターフェースのリストが空でない場合に限り、implements キーワードを含むコレクションが表示されます。
次に、implements またはその一部がクラス名の直後または拡張クラスへの参照の後に入力されたときに、新しい子を implements コレクションに追加するための正しい変換が必要です。同様に、implements がコードブロックの左中括弧の直前に入力されたときに新しい子を追加するには、左変換が必要です。繰り返しになりますが、変換メニューの言語によって名前付き変換メニューを作成し、セルにアタッチすることができます。
ノード置換アクション
ノード置換アクションは、特定のノードを他のノードと置き換える方法を指定します。例:子ノードで指定されたブール条件を保持しながら、論理的に 、またはその逆に変更することができます。
変換メニューの言語からデフォルトの代替メニューを使用しましょう。
そしてとまたはの両方の概念は LogicalOperator を継承しているため、アクションで LogicalOperator を参照できます。: 本質的に、上記のアクションにより、LogicalOperator を LogicalOperator の non-abstract サブコンセプトに置き換えることができます。交換概念がインスタンス化され、その左右の子供たちが交換されているノードの子から移入する
カスタム文字列値の置換
置換規則を使用して、プレーン文字列を目的の概念のノードに変換することもできます。たとえば、Python のように、変数の名前で始まる一種の変数宣言を想像してください。
myVariable = 10;
このような変数宣言を入力するには、補完メニューから変数の概念を(その別名で)選択してから名前を入力します。
ただし、代入メニューに簡単な代入アクションを追加すると、空の行に変数の名前を入力して自動的に変数を自動的に作成することができます。
メニューは次のようになります。
空でないパターンが入力されたときはいつでも置き換えることができ、その位置に適用可能な既知のサブ概念のいずれの別名とも一致しません。
アクションが実行され、パターンが変数の名前にコピーされると、新しいノードが作成されます。
「選択ハンドラー」は、変数が作成された後もカーソルが「name」セル内に留まるようにして、変数がすでに作成された後でもユーザーが名前の入力を続けることができるようにします。(補完メニューに他のオプションがないとすぐに作成されます(null でないノードが返されると、MPS は返されたノードにカーソル自体を設定し、"select" を無視するため、"selection handler" は null を返します。" コマンド)
また、「strictly」フラグをチェックして動作をさらにカスタマイズすることもできます。
これがメニューです。
変更点:
説明は、「可変」エイリアスと一緒に補完メニューに表示するカスタマイズされた説明メッセージを提供します。
パターンは、これまでに型されたテキストが作成される変数の名前として推奨されることを保証します。(コード補完メニューが表示されているとき)
限りメニューで利用可能な他のサブコンセプトがあるとして、このアクションでも利用できるように缶代替ハンドラーはなく、唯一の非厳密マッチングのため、厳密にパラメーターの値に反応します。
両親を含めて行動を変える
ノードはオプションで異なるノード、たとえば親に適用可能な変換アクションを含むことができます。例:論理的とし、または論理式に追加するために許可している場合、論理式は、たとえば、そのエディターの最後のセルは、子ノードに属し、より複雑であるとき、まだ問題になることがあります。
この例では、南は論理式である見出しは、しかし、南自身がコンセプトの方向と論理式の子です。and や or を論理式に追加する元の正しい変換アクションは、 ここでは機能しません。元の権利変換(見出しに適用可能)アクションを、方向に特に適用可能な新しい権利変換アクションに含める必要があります。
概念的な質問
既存のエディターを拡張する
MPS エディターは、モデルからノードにビジュアルセルを割り当てるため、対応する値を並べ替えてユーザー入力を受け入れる責任をノードの概念に委譲します。このメカニズムは、概念が定義されている言語に関係なく機能します。たとえば、数式が Java プログラムの一部であっても電気回路シミュレーションモデルの一部であっても、数式は正しく表示されます。
特定のエディターが利用可能でない限り、新しいサブコンセプトはデフォルトでそれらの親コンセプトのエディターを再利用します。その一方で、拡張言語は継承された概念に独自のエディターを提供し、継承されたエディターから派生した具体的な構文をオーバーライドすることがあります。
拡張用のエディターを設計する
良い戦略は、エディターコンポーネントを使ってエディターをモジュール化することです。これにより、言語拡張機能を使用してエディター自体を再定義しなくてもコンポーネントを上書きできます。
エディター内での conceptAlias などのプロパティへの参照は、ハードコードされたリテラルよりも優先されるべきです。参照によって、エディターはオーバーライドすることなくサブコンセプトに適応できるようになるからです。
アクションおよびインテンションの適用規則を指定するときは、サブコンセプトによっては、親のこれらのアクションから除外する必要がある場合があることに注意してください。そのようなシナリオでは、これらのアクションに適用規則の動作方法をチェックさせることをお勧めします。
メニューにリファクタリングを追加する方法
良い例として InlineField または IntroduceVariable を使用してください。一般に、jetbrains.mps.lang.plugin 言語からアクションを定義する必要があります。これは、その適用性を指定し、コンテキスト情報とユーザー入力を収集し、実際のリファクタリング手順を初期化して呼び出します。リファクタリング機能は通常 BaseLanguage クラスに抽出され、複数のアクションによって再利用される可能性があります。
同じコンセプトに複数のエディターを定義する方法
最初のサンプル
MPS にバンドルされている MultipleProjections サンプルプロジェクトは、概念ごとに複数のエディターを定義する方法とそれらの切り替えを可能にする方法を学ぶための優れた入門ガイドラインを提供します。
サンプル言語を使用すると、1 つ以上のステートマシンで構成されるワークフローを定義できます。ステートマシンは構造的にも表としても表現することができます。プログラマは、対応するステートマシン定義の先頭に構造式または表形式のいずれかを入力するだけで、各ステートマシンに使用される表記法を切り替えることができます。
このサンプルは、3 つの言語と 1 つのサンドボックスプロジェクトで構成されています。
requestTracking 言語は、ステートマシンをラップし、使用して単純なワークフローを定義するための概念とルート概念を提供します。これは、ステートマシン言語を埋め込む必要がある言語の例として役立ち、その埋め込み言語の代替表記法を可能にします。
stateMachine 言語は、ステートマシン言語の基本概念とデフォルトエディターを定義します。複数の投影に固有のアーティファクトはまったくありません。MPS 言語拡張の力を説明するための概念のいくつかのための別のエディター突起は、ステートマシンを拡張 stateMachine.tabular、で定義されています。
stateMachine で指定されたデフォルトのエディターは、左上隅のデフォルト値でデフォルトであるという事実を示しますが、stateMachine.tabular のエディターは表形式の ヒントを指定します。単一のエディターに複数のヒントを指定することもできます。
ヒント
正しい投影法を選択する際の重要な要素はヒントです。エディターは、どのヒントが画面に表示されるようにするかを指定します。ヒントは新しい ConceptEditorContextHints コンセプトを使って定義されます。
この概念では、ID と、特定の言語または言語拡張で認識される各ヒントの簡単な説明を定義できます。そのため、このサンプルプロジェクトでは、stateMachine と stateMachine.tabular の両方が独自のヒントセットを定義しています。
インスペクタで設定できるデフォルトのヒントとして使用できますフラグにも注目してください。true に設定すると、ヒントは IDE からエディターにプッシュされるようになります。詳細については、「IDE からのヒントのプッシュ」を参照してください。
ヒントが定義されていると、言語はヒントの追加 / 削除による表記をコンテキストに切り替えることをユーザーに提供できます。サンプルの requestTracking 言語は、列挙型の presentation プロパティをユーザーに公開することによってこれを行います。このプロパティは、インスペクタウィンドウで指定されているように、ステートマシンエディターに渡されるヒントのコレクションに影響します。
エディターコンポーネントに関するエディターのヒント
ヒントを指定できるのはエディターだけではありません。他のエディターコンポーネントをオーバーライドするエディターコンポーネントにも同じ機能があります。
IDE からヒントをプッシュする
「デフォルトのヒントとして使用可能」フラグが有効になっているヒントは、新しいデフォルトとして IDE によってエディターにプッシュできます。これにより、開発者は IDE のさまざまな言語に使用されるデフォルトの投影法をカスタマイズできます。
投影法をカスタマイズする 1 つの方法は、エディターのコンテキストメニューでプッシュエディターのヒント アクションを使用し、デフォルトとしてアクティブエディターフレームにプッシュするヒントを選択することです。
アクティブエディターは選択されたヒントに一致する予測を使用します。
2 番目のオプションは、対応する設定パネルを通して IDE によってプッシュされるヒントをいくつか作成することです。これらの選択は、デフォルトの設定としてすべてのエディターウィンドウに適用されます。
表記法を切り替える機能とエディターフレームを分割する機能を組み合わせることを検討してください。これにより、同じコードのいくつかの異なる投影を並べて表示できます。一方での変更はもう一方にすぐに反映されます。
右側のパネルにはデフォルトで表形式の表記がプッシュされていますが、左側のパネルにはありません。両方の投影法は同じコードを視覚化します。
プログラムでエディターヒントを操作および適用する方法
エディターヒントを調整する独自の 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 を隠してユーザーに快適で直感的な対話を提供することは、言語エディターにとってのロールです。AST

変換メニュー言語
概要 :概要、メニューを定義する、デフォルトメニュー、名前付きメニュー、メニューのコントリビューション、セクションの場所、メニューパーツ、サイド変換、代替メニュー、コード補完のデフォルトの動作、代替メニュー (デフォルト)、代替メニュー (名前)、代替メニュー投稿、オプション、セルメニューとセル固有...

ジェネレータークックブック
この文書は、MPS ジェネレータに関する最も一般的な質問に対する回答を提供することを目的としています。代わりにジェネレータのドキュメントを調べてジェネレーターデモをチェックすることもできます。ジェネレータはどのようにルールを処理しますか?、一つの言語に対してさらに多くのジェネレータを使うことができま...

プラグインに飛び込む: PlantMPS プラグイン
導入 :mbeddr.comプロジェクトによって開発された PlantUML プラグインは私にとって非常に興味深いように思えました、すでにPlantUMLを知っていたため外部ツールが MPS にどのように差し込まれることができるか学ぶためにプラグインを勉強することにしました。ボーナスとして MPS