MPS 2020.1 ヘルプ

エディタークックブック

このドキュメントは、上級言語設計者を対象としており、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

  • 次のノードがコレクションの新しい行に配置されるように、コレクションの後ろに新しい行マークを付ける 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 を使用します。

オプションの可視性

特定の条件下でのみ表示されるはずの要素には、show if プロパティを設定する必要があります。

Editor16

スタイルの定義と再利用

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

Editor37
Editor38

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

Editor39

BaseLanguage スタイルを再利用する

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

Editor40

適切なキーワードを作る

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

Editor18

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

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

Editor2

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

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

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

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

Editor5

Editor6

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

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

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

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

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

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

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

Editor3

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

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

Editor25

空の行を上の行と同じようにする必要があります。空の定数セルを追加して編集可能にし、code-completion メニューに表示するすべての項目の super-type を指定します。空の行の位置を占める可能性があるすべての概念が前のアドバイスに従っていて、共通の祖先から派生している場合、これは有益なタイプです。空の行を潜在的に置き換える概念としてその先祖を指定します。

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

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

簡単なノード交換

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

Editor26

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

Editor27

垂直スペース区切り

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

Editor4

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

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

空の値は許されません。
セルは赤で表示され、エラーを示します。

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 スタイルを使用して、その境界の表示方法を指定することもできます。スタイルは 2 つの値、ガターgutter-and-editor を持ちます。コレクションのスタイルを gutter-and-editor に設定すると、いずれかのセルが選択されたときにコレクションの最初と最後のセルがエディターでハイライトされ、左側のエディターのガターに括弧が表示されます。スタイルをガターに設定すると括弧のみが表示され、特定のコレクションの開始位置と終了位置を表示したいがコレクション内に明確に定義された最後のセルがない場合に便利です。

例:

image2016 7 26 11 7 5

結果:

image2016 7 26 11 9 21

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

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

Editor14

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

Editor11

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

Editor12

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

Editor fix3

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

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

Editor17

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

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

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

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

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

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

  • キーワードの上にいるときに delete を押すと削除されます

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

キーワードはオプションであり、show if 条件が基本となる抽象モデルを照会していることに注意してください。

Flags1

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

Flags2

aproveDelete 呼び出しによって、フラグを削除する決定を取り消すことができます。また、フラグを削除した後にカーソルをどのように配置するかが処理されます。

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

Flags3

その後、名前付き変換メニューをフラグセルの前後にあるエディターセルに添付できます。

Flags4

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

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

Editor30

まず、A、B C を実装しますパーツ全体がオプションで表示されている必要があります。

Editor36

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

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

ノード置換アクション

ノード置換アクションは、特定のノードを他のノードと置き換える方法を指定します。例:子ノードで指定されたブール条件を保持しながら、論理的に 、またはその逆に変更することができます。

Editor105

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

Subst1


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

カスタム文字列値の置換

置換規則を使用して、プレーン文字列を目的の概念のノードに変換することもできます。たとえば、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

この例では、南は論理式である見出しは、しかし、自身がコンセプトの方向と論理式の子です。andor を論理式に追加する元の正しい変換アクションは、 ここでは機能しません。元の権利変換(見出しに適用可能)アクションを、方向に特に適用可能な新しい権利変換アクションに含める必要があります。

Inherit1

概念的な質問

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

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

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

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

良い戦略は、エディターコンポーネントを使ってエディターをモジュール化することです。これにより、言語拡張機能を使用してエディター自体を再定義しなくてもコンポーネントを上書きできます。

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

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

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

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

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

最初のサンプル

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

mp1

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

mp2

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

mp3

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

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

mp5
mp4

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

mp6

ヒント

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

mp7

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

mp8

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

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

mp9

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

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

HintsInComponents1

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 を隠してユーザーに快適で直感的な対話を提供することは、言語エディターにとってのロールです。AST

変換メニュー言語

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

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

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

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

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