MPS 2019.1ヘルプ

コンテキストアシスタント

概要

MPSはコンテクストの中でアクションを実行するためのいくつかのメカニズムを提供します:完了、インテンション、リファクタリング、他の様々なポップアップメニュー。これらのメカニズムには、経験の浅い新規ユーザーにはすぐには見えないという共通点があります。彼らはまた、多くの可能な選択肢を提供し、利用可能な機能全体を明らかにします。これは上級ユーザーを手助けしますが初心者を圧倒するかもしれません。

DSLでスクリプトを作成するプロセスを通して新しいユーザーをよりよく導くために、コンテキストアシスタントが利用可能になりました。コンテキストアシスタントは、特定のコンテキストに最も適したアクションを含む動的に構成されたメニューを表示します。言語の作成者は、エディター定義にプレースホルダを入れることによってメニューを表示する場所を指定します。プレースホルダは、メニューが表示および非表示になっているときに編集内容が移動しないように、メニュー用の画面スペースを事前に予約しています。

例として、MPSにバンドルされているRobotKajaサンプル言語を考えてみましょう。新しいスクリプトの初期エディターは次のようになります(コンテキストアシスタントなし)。

image2016 2 2 12 30 59

コンテキストアシスタントを使うと、この最初のUIは次のようになります。

image2016 2 3 14 40 34

そしてメニューはいくつかの可能な次のステップをユーザーに提案します。

説明

コンテキストアシスタントは、特定のビッグセル(親の概念が異なるセル)に対して特定のアクションを実行するためのメニューです。大きなセルの中ではどこでも同じです。
大きなセルの固定位置に表示されます(ただし、そのような位置は複数ある場合がありますが、その場合は最も近い位置だけが表示されます)。

内容がない場合、メニューは利用できません。単純なアクションの他に、メニューには階層サブメニューを含めることができます。

コンテキストアシスタントUIを使用する

現在のカーソル位置に対応するコンテキストアシスタントがある場合は、Ctrl/Cmd + Alt + Enterで表示するか2秒間待ちます。

  • Ctrl/Cmd + Alt + Enterを押して、コンテキストアシスタントにジャンプします。

  • 矢印キー、タブ、またはマウスを使用してメニュー内を移動します。

  • スペースまたはEnterを使用して選択したメニュー項目を呼び出します: またはマウスクリック

  • インテンションメニューとは異なり、タイピングベースの項目選択はありません。

  • エスケープを押してエディターに戻ります。

  • 他のメニューとは異なり、コンテキストアシスタントは開いているときにドキュメントに入力することを妨げません(メニュー内の項目が選択されている場合を除く)。

コンテキストアシスタントフレームワークを使用する

言語にコンテキストアシスタントを追加するには、言語の作成者としての2つのことをする必要があります。

  1. コンテキストアシスタントプレースホルダ (特別な種類のセル)をエディターの適切な場所に配置します。コンテキストアシスタントメニューはこれらのプレースホルダに表示されます。

  2. 変換メニュー言語(ロケーションコンテキストアシスタントを指定)を使用してメニュー階層を定義します。

MPSエディターランタイムは適切な時点で適切なメニューを構築し、それを適切なコンテキストアシスタントプレースホルダーに表示します。

プレースホルダセル

新しいセルを追加するときに置換メニューから「コンテキストアシスタントメニュープレースホルダ」を選択すると、プレースホルダセルが追加されます。

image2016 2 18 17 57 44

プレースホルダセルは、空白の1行分の大きさの垂直方向の画面スペースを予約しているため、周囲のセルを移動することなくその場所にメニューを表示できます。ただし、水平方向のスペースは確保されていません。プレースホルダーは別の行に置くか、短い(または空の)テキスト行の末尾に置くことをお勧めします。ex:RobotKajaサンプルでは、EmptyLineの概念のためにエディターの空白行の後にプレースホルダが追加されています。

image2016 2 18 17 54 57

表示するメニューは、現在選択されているセルから最上部までセル階層をたどって検索されます。特定のセルに対してメニューを明示的に表示するように指定することができます(インスペクタの変換メニュープロパティーを設定するとによって)。この場合はそのメニューが使用されます。それ以外の場合、セルが大きなセル (親を持たないセル、または親が別のノードに関連付けられているセル)である場合、セルのノードに基づいてメニューを検索しようとします。ノードの概念の継承階層は、幅優先順に検索されます。ノードの概念、またはその上位概念と上位インターフェースの1つに対して空でないメニューが定義されている場合は、このメニューが使用されます。

例: BinaryOperationを拡張するBaseLanguage PlusExpression を考えます。これは Expression を拡張し、IBinaryLikeを実装します。トラバース中に PlusExpressionの大きなセルに達すると、PlusExpressionBinaryOperationExpressionIBinaryLike、最後に BaseConcept の順にメニューがチェックされ、最初の空でないメニュー定義が使用されます。すべてのメニュー定義が空の場合、検索はビッグセルの親セル(ある場合)から続行されます。

空でないメニュー定義を選択しても、それでも空のメニューが生成されることがあります。これは、そのメニュー部分のいずれもアイテムを生成しない場合(たとえば、定義されたアクションが現在適用可能でない場合など)に発生する可能性があります。

プレースホルダ検索

コンテキストアシスタントプレースホルダセルを含むコレクションセルに直接または間接的に(ただし同じノードにのみ属している)到達するまで、現在選択されているセルからルートまでセル階層をたどって、メニューを表示する場所を検索します。コレクションとして)。この検索中に見つかった最初のセルが選択され、メニューがこのプレースホルダセルに表示されます。

最終更新日: 2019年6月7日