変換メニュー言語
概要
- 概要
- メニューを定義する
- デフォルトメニュー
- 名前付きメニュー
- メニューのコントリビューション
- セクションの場所
- メニューパーツ
- サイド変換
- 代替メニュー
- コード補完のデフォルトの動作
- 代替メニュー (デフォルト)
- 代替メニュー (名前)
- 代替メニュー投稿
- オプション
- セルメニューとセル固有の変換メニューの相互作用
- プロパティ / 参照用の変換メニューを含める
- 参照例
- プロパティの例
- メニュー発見アルゴリズム
- アイテムトレースを表示する
変換メニュー言語は、サブメニューの階層構造とエディター内のさまざまな場所に表示されるアクションを記述する変換メニューを定義するために使用されます。現在、変換メニューが表示される場所はいくつかあります。サイド変換メニュー、代替メニュー、コンテキストアシスタント、およびコンテキストアクションツールです。変換メニュー言語の拡張で文書化されているように、言語デザイナーやプラグインの作者は追加の場所を定義し、各場所の必須またはオプションの機能(アイコンやツールチップなど)を指定することができます。
メニューを定義する
変換メニューは、さまざまな場所に表示される UI アクションを定義します。設計時に、メニューはセクションのリストとして指定され、各セクションには特定の場所のセットのメニューパーツのリストが含まれます。実行時には、メニュー部分と場所を使用してメニューの内容(メニュー項目)が生成されます。
メニュー定義には、デフォルトと名前付きの 2 つの種類があります。メニュー定義はメニューの貢献によっても拡張できます。
デフォルトメニュー
各概念には、デフォルトの変換メニューが関連付けられています。言語設計者が明示的に指定していない場合は、最も近いスーパーコンセプト用に定義された変換メニューが想定されます。どのスーパーコンセプトにも指定されていない場合は、BaseConcept で定義されているものが使用されます。これには、その位置に適した代替アクションが含まれます(代替アクションのセクションを参照)。
デフォルトメニューは、言語設計者が表示するメニューを指定していない場合に使用されます。
名前付きメニュー
名前付きメニューは、概念の追加メニューです。デフォルトメニューのようにそれはまた適当な概念を指定しそしてセクションのリストを含んでいる。その用語が示すように、名前付きメニューは明示的に設定された名前を持ちます。名前付きメニューは、セルの変換メニューとして設定すること、またはメニューメニューを含めるを介して別のメニューに含めることを意味します。
名前付きメニューをエディターセルに添付する:
メモ: Default transformation menus can also be attached to individual cells the same way named menus can.
メニューのコントリビューション
メニューコントリビューションは、追加のメニューパーツを追加することによって、特定のメニューを拡張します。これは、拡張言語が拡張言語で定義されたメニューにエントリを追加する必要があるときに特に便利です。貢献は実際には貢献されているメニューのある言語以外の言語でしか定義できません。実行時にメニューが要求されると、元の定義とすべてのコントリビューションがマージされ、結合された定義を使用してメニューが作成されます。貢献についてのいくつかの重要なメモ:個々の定義がマージされる順序は、現在のところ不明です。
寄付は、寄付するメニューからメニュー部分を削除することはできません。
概念の暗黙のデフォルトメニューへのコントリビュートを定義することは可能です。
セクションの場所
メニュー内のセクションの場所を指定することで、UI のどの部分にアクションを挿入するかを指定します。
補完 - 補完メニュー
コンテキストアクションツール - コンテキストアクションツール (jetbrains.mps.editor.contextActionsTool.lang.menus 言語のインポートが必要)
コンテキストアシスタント - コンテキストアシスタント
サイド変換 - 左右の変換
メニューパーツ
以下の標準メニューパーツが利用可能です。
action - 実行するアクション、それに対応するメニューテキスト、および適用範囲を指定する単純なメニュー項目。
グループ - メニュー項目のコレクション。これらの項目を超えて、グループは 1 つ以上の変数を定義して、繰り返し計算を回避するためにグループ内のすべてのアクションによって共有される場合があります。さらに、グループは、グループ内のアクションをユーザーが使用できるようにする必要があるときを示す条件を保持します。
include - 特定のデフォルトメニューまたは名前付きメニューを(存在する場合はその貢献とともに)含めます。実行時に包含サイクルが検出され、エラーメッセージが表示されます。
代替メニューを含める - このメニューの一部として使用するデフォルトまたは名前付きの代替メニューを含めます。
parametrized - 複数の値でパラメーター化されているアクション。
サブメニュー - さらなる部分を含むサブメニュー。
superconcepts menu - デフォルトでは含まれないため、該当する概念のスーパーコンセプトのデフォルトメニューが含まれます。
代用メニューの折り返し - 提供されたハンドラーを使用して指定された概念を折り返します。
言語 jetbrains.mps.lang.editor.menus.extras
には、変換メニューからさまざまなアクションに似たエンティティを含めるためのアダプターが含まれています。
インテンション - インテンション(
jetbrains.mps.lang.intentions
からBaseIntentionDeclaration
のサブコンセプト)をラップします。リファクタリング -
jetbrains.mps.lang.refactoring
からリファクタリングRefactoring
をラップします。plugin Action –プラグインアクション
ActionDeclaration
をjetbrains.mps.lang.plugin
からラップします。
サイド変換
テキストエディターでコードを編集するときは、左から右のいずれかに入力できます。
または右から左へ
この振る舞いをエミュレートするために、MPS には左右の変換という側面の変換アクションがあります。セルの左または右部分を入力したときに利用できるようになるアクションを作成できます。例:MPS では次のことができます。
また
最初のケースは右変換と呼ばれます。2 番目のケースは左変換と呼ばれます。
セクションのサイド変換位置を選択して、変換メニューでサイド変換を定義します。
The language also enables language designers to include items of the side-transform menu to the completion menu on a specific cell. To do this you attach to the desired cell a transformation menu that contains a completion section: That completion section will hold an include menu part and specify the location of side transform: The items of side-transform menu will be included to the completion.
含まれるメニューの場所は、インテンションの「場所の指定」を使用して指定できます。
代替メニュー
代用アクションは、モデルの一部に対してユーザーが呼び出した変換を定義し、その間に 1 つのノードが別のノードに置き換えられます。これらの代替アクションのビジュアル UI 要素(補完メニューなど)への実際のマッピングは、変換メニューを介して行われます(上記のセクションを参照)。
通常、代替アクションはエディターで Ctrl + Space を押すことによってトリガーされます。表示される完了メニューには、ユーザーが選択したときにキャレットにあるノードを置き換えるオプションが含まれています。side-transformations、コンテキストアシスタント、またはコンテキストアクションツールとは異なり、置換にはデフォルトの動作があります。これは、言語の作成者が特に定義していない限り、有効になります。
コード補完のデフォルトの動作
言語作成者によって明示的に実装されたメニューがなくても、MPS は現在のノードの代わりとなる補完メニューを提供します。
このような場合、Control + Space を押すと、与えられたコンテキストで適用可能なインポートされた言語からのすべての概念を含むメニューが表示されます。これはモデル内の現在のノードを置き換えることができます。
MPS は次の手順でデフォルトの補完メニューを作成します。
選択が概念 A を許す位置の内側にあるなら、A のすべての可能にされた副概念は完了メニューで利用可能になるでしょう。
すべての抽象的な概念は除外されます
「子になることができる」という制約が false を返すすべての概念は除外されます
親ノードの「親になることができる」制約が false を返すすべての概念が除外されます
概念に 1:1 の参照が含まれている場合は、完了メニュー自体には追加されません。代わりに、その参照のスコープ内の各要素にアイテムが追加されます。そのようなアイテムには名前スマート参照を使用します。
ノード置換をカスタマイズするには、代替メニューが使用されます。
代替メニュー (デフォルト)
概念のデフォルトの代替メニューを定義することで、ユーザーが Control + Space を押したときに表示される完了メニューの内容をカスタマイズできます。これらのサブ概念が独自のデフォルトの代替メニューを定義していない限り、概念のサブ概念にも影響します。
ただし、代替メニューをエディターの特定のセルに割り当てる場合は、変換メニューにしか追加できないため、代替メニューを変換メニューに含める必要があります。
代替メニュー (名前)
名前付き代替メニューを使用すると、複数の代替メニューを作成してさまざまなコンテキストで使用することができます。名前を付けた代替メニューを有効にするには、最初に別の代替メニューまたは変換メニューに含める必要があります。
代替メニュー投稿
トランスフォームメニューと同様に、代替メニューの貢献は、新しい言語で定義された代替メニューへの新しいエントリを提供します。
オプション
概念の追加 - メニューに単一の概念を追加します
概念リスト - 概念のコレクションを追加します
グループ - 条件が満たされた場合、エントリのグループを追加します
包含 - 指定されたメニューを含みます
パラメーター化 - パラメーター化された代替アクションを追加します
参照アクション - 参照の可能なターゲットの外観を含めてカスタマイズします
サブコンセプトメニュー - コンセプトのすべてのサブコンセプトを含む
代替アクション - 単一の代替アクションを追加します
代用メニューの折り返し - 提供されたハンドラーを使用して指定された概念を折り返します
セルメニューとセル固有の変換メニューの相互作用
セルに "menu" と "transformation menu" の両方が指定されている場合は、両方のメニューから該当するエントリが結合されます。一部のセルメニューパーツ( CellMenuPart_PropertyPostfixHints
などの CellMenuPart_Abstract
の子孫)には、同等の変換 / 置換メニューパーツがまだありません。
プロパティ / 参照用の変換メニューを含める
プロパティ / 参照セルのメニューのカスタマイズはプロパティ / 参照変換メニューパーツで行うことができます。参照 / プロパティセルの補完メニューをカスタマイズしたいとします。以前は、インスペクタで「インラインメニュー」を定義することによって行われていました。今それは変換メニューによってもすることができます。プロパティと参照変換メニュー部分を導入しました。参照変換メニュー部分には、ターゲットノードを特定の参照に設定するアクションが含まれています。ターゲットノードはその参照のスコープから来ます。プロパティメニュー部分にも同じことが言えます。プロパティタイプの値を取り、値を特定のプロパティに設定するアクションを含みます。
参照例
参照セルの補完メニューを作成したいとします。メニューには、スコープ内にある参照の通常のターゲットとその他のカスタムアクションが含まれているはずです。これは、次の名前付き変換メニューを参照セルにアタッチすることによって実行できます。
それで、すべての標準的な参照アクションと私たちのカスタムアクションを完成時に受け取るでしょう:
見ることができるように参照メニュー部分は「インラインメニュー」の「一次選択参照メニュー」部分の類似物です、しかしさらにカスタマイズ可能です。また、セルにメニューが添付されていない場合は、その参照メニューがデフォルトで使用されます。
プロパティの例
もう一つの例 - カーソルがそのプロパティのセルに次のラベルのセル上にあるとき、コンテキストアシスタントで特定のプロパティのためにすべての可能な値を参照するとします。Kaja 言語のコードを見てみましょう。

キャレットを見るセルに置くときに、見る方向のすべてのバリエーションを確認したい: このラベルセルに次のメニューを添付する

そして結果を得る:

「インラインメニュー」に対するこれらのメニュー部分の利点は次のとおりです。
これらは、参照 / プロパティセルだけでなく、任意のセルにアタッチできます。
補完だけでなく、あらゆるメニューの場所(コンテキストアシスタント、コンテキストメニュー)で使用できます。
参照メニューはよりカスタマイズ可能です(プロパティメニューも間もなくカスタマイズ可能になるでしょう)。
メニュー発見アルゴリズム
MPS がどのように変換メニューを選択するかのプロセスを理解すると、メニューをより自信を持ってデザインできます。
変換メニューを発見するための組み込みの振る舞いは、現在の概念のスーパーコンセプトのメニューを含むことです。そのため、デフォルトでは MPS は現在の概念の変換 <現在のコンセプト> _TransformationMenu を探し、次にそのスーパーコンセプトのメニューと BaseConcept_TransformationMenu まで続きます。
代替メニューは変換メニューに似ていますが、その発見は反対方向に働きます。ここで、概念 A の変換メニューはそのスーパーコンセプトのメニュー(BaseConcept まで)を含みます。なぜなら、サブ概念だけがモデル内の A を安全に置き換えることができるからです。代替メニューは、既存のノードの概念に基づいて検索されるのではなく、リンクのターゲットの概念に基づいて検索されるため、変換メニューとは少し異なります。
アイテムトレースを表示する
どの変換または代替メニューが補完メニューまたはコンテキストアシスタントに特定のアクションを提供したかを追跡するには、補完メニューエントリで N/A を押すだけで、対話的なトレースレポートが表示されます。
お互いを含む多くの代替メニューと変換メニューが存在するため、完了またはコンテキストアシスタントでのアクションの表示を追跡することが難しい場合があります。これで、完了(矢印)またはコンテキストアシスタント(cmd / ctrl + alt + Enter)でアクションを選択し、cmd / ctrl + alt + B を押すことができます。プロジェクトツールにトレースが表示されます。これは、トップレベルのメニューから始まり、アクション宣言で終わる、互いに含まれるメニューとメニューパーツ宣言のトレースです。メニューまたはメニューパーツの宣言が明示的であり、プロジェクト内にある場合は、ツールのスタイルが太字になっているため、クリックして宣言に移動できます。キャレットをステートメントに置き、変数参照の補完を表示してから「アイテムトレースの表示」を呼び出すと、次のようになります。

関連ページ:

エディターのアクション
MPS エディターには、完了アクション、ノード作成ポリシーにかなり実用的なデフォルトがあります。しかし、カスタマイズしたい場合は、アクション言語を使用しなければなりません。サイド変換アクションとノード代替アクションは MPS 3.4 で非推奨になり、新しい変換メニュー言語に置き換えられました。ノード...

コンテキストアシスタント
概要 :概要、説明、コンテキストアシスタント UI を使用する、コンテキストアシスタントフレームワークを使用する、プレースホルダセル、メニュー検索、プレースホルダ検索、MPS はコンテクストの中でアクションを実行するためのいくつかのメカニズムを提供します:完了、インテンション、リファクタリング、他の...

コンテキストアクションツール
コンテキストアクションツールは一部の DSL ユーザーのマウスナビゲーションへの好みに対応しています。指定されたコンテキストで適用可能なアクションが、階層的に整理されたサイドバーに一覧表示されます。サンプルロボット Kaja 言語のコンテキストアクションツールの使用と定義に関する短いビデオが利用可能...