コンテキストアシスタント
概要
MPS はコンテクストの中でアクションを実行するためのいくつかのメカニズムを提供します:完了、インテンション、リファクタリング、他の様々なポップアップメニュー。これらのメカニズムには、経験の浅い新規ユーザーにはすぐには見えないという共通点があります。彼らはまた、多くの可能な選択肢を提供し、利用可能な機能全体を明らかにします。これは上級ユーザーを手助けしますが初心者を圧倒するかもしれません。
DSL でスクリプトを作成するプロセスを通して新しいユーザーをよりよく導くために、コンテキストアシスタントが利用可能になりました。コンテキストアシスタントは、特定のコンテキストに最も適したアクションを含む動的に構成されたメニューを表示します。言語の作成者は、エディター定義にプレースホルダを入れることによってメニューを表示する場所を指定します。プレースホルダは、メニューが表示および非表示になっているときに編集内容が移動しないように、メニュー用の画面スペースを事前に予約しています。
例として、MPS にバンドルされている RobotKaja サンプル言語を考えてみましょう。新しいスクリプトの初期エディターは次のようになります(コンテキストアシスタントなし)。
コンテキストアシスタントを使うと、この最初の UI は次のようになります。
そしてメニューはいくつかの可能な次のステップをユーザーに提案します。
説明
コンテキストアシスタントは、特定のビッグセル(親の概念が異なるセル)に対して特定のアクションを実行するためのメニューです。大きなセルの中ではどこでも同じです。
大きなセルの固定位置に表示されます(ただし、そのような位置は複数ある場合がありますが、その場合は最も近い位置だけが表示されます)。
内容がない場合、メニューは利用できません。単純なアクションの他に、メニューには階層サブメニューを含めることができます。
コンテキストアシスタント UI を使用する
現在のカーソル位置で使用できるコンテキストアシスタントがある場合は、Ctrl+Alt+Enter で表示するか、2 秒間待ちます。
Ctrl+Alt+Enter を押して、コンテキストアシスタントにジャンプします。
矢印キー、タブ、またはマウスを使用してメニュー内を移動します。
スペースまたは Enter を使用して選択したメニュー項目を呼び出します。またはマウスクリック
インテンションメニューとは異なり、タイピングベースの項目選択はありません。
エスケープを押してエディターに戻ります。
他のメニューとは異なり、コンテキストアシスタントは開いているときにドキュメントに入力することを妨げません(メニュー内の項目が選択されている場合を除く)。
コンテキストアシスタントフレームワークを使用する
言語にコンテキストアシスタントを追加するには、言語の作成者としての 2 つのことをする必要があります。
コンテキストアシスタントプレースホルダ(特別な種類のセル)をエディターの適切な場所に配置します。コンテキストアシスタントメニューはこれらのプレースホルダに表示されます。
変換メニュー言語(ロケーションコンテキストアシスタントを指定)を使用してメニュー階層を定義します。
MPS エディターランタイムは適切な時点で適切なメニューを構築し、それを適切なコンテキストアシスタントプレースホルダーに表示します。
プレースホルダセル
新しいセルを追加するときに置換メニューから「コンテキストアシスタントメニュープレースホルダ」を選択すると、プレースホルダセルが追加されます。
プレースホルダセルは、空白の 1 行分の大きさの垂直方向の画面スペースを予約しているため、周囲のセルを移動することなくその場所にメニューを表示できます。ただし、水平方向のスペースは確保されていません。プレースホルダーは別の行に置くか、短い(または空の)テキスト行の末尾に置くことをお勧めします。ex:RobotKaja サンプルでは、EmptyLine の概念のためにエディターの空白行の後にプレースホルダが追加されています。
メニュー検索
表示するメニューは、現在選択されているセルから最上部までセル階層をたどって検索されます。特定のセルに対してメニューを明示的に表示するように指定することができます(インスペクタの変換メニュープロパティを設定することによって)。この場合はそのメニューが使用されます。それ以外の場合、セルが大きなセル(親を持たないセル、または親が別のノードに関連付けられているセル)である場合、セルのノードに基づいてメニューを検索しようとします。ノードの概念の継承階層は、幅優先順に検索されます。ノードの概念、またはその上位概念と上位インターフェースの 1 つに対して空でないメニューが定義されている場合は、このメニューが使用されます。
例: BinaryOperation
を拡張する BaseLanguage PlusExpression
を検討します。BinaryOperation
は Expression
を拡張し、IBinaryLike
を実装します。トラバース中に PlusExpression
のビッグセルに到達すると、PlusExpression
, BinaryOperation
, Expression
, IBinaryLike
のメニュー、最後に BaseConcept
がこの順序でチェックされ、最初の空でないメニュー定義が使用されます。すべてのメニュー定義が空の場合、検索はビッグセルの親セル(存在する場合)から続行されます。
空でないメニュー定義を選択しても、それでも空のメニューが生成されることがあります。これは、そのメニュー部分のいずれもアイテムを生成しない場合(たとえば、定義されたアクションが現在適用可能でない場合など)に発生する可能性があります。
プレースホルダ検索
コンテキストアシスタントプレースホルダセルを含むコレクションセルに直接または間接的に(ただし同じノードにのみ属している)到達するまで、現在選択されているセルからルートまでセル階層をたどって、メニューを表示する場所を検索します。コレクションとして)。この検索中に見つかった最初のセルが選択され、メニューがこのプレースホルダセルに表示されます。
関連ページ:

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

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