MPS 2019.2ヘルプ

エディタークックブック

このドキュメントは、上級言語設計者を対象としており、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を参照できます。本質的に、上記のアクションはLogicalOperatornon-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

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

Inherit1

概念的な質問

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

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

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

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

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

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

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

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

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

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

最初のサンプル

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

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()メソッドを介して実行できます。

最終更新日: 2019年8月30日

関連ページ:

エディター

言語のための構造が定義されたら、おそらく行って、開発者がそれを使って便利にASTを構築できるようにするための手段を作成するでしょう。ASTを直接操作しても、直感的にも生産的にもなりません。ASTを隠してユーザーに快適で直感的な対話を提供することは、言語エディターにとってのロールです。ASTを直接操作...

変換メニュー言語

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

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

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

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

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