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