MPS 2020.3 ヘルプ

プラグイン

プラグインは、コードを MPS IDE 機能と統合する方法です。
jetbrains.mps.lang.plugin および jetbrains.mps.lang.plugin.standalone 言語は、プラグインで使用できるいくつかのルート概念を提供します。この章では、それらすべてについて説明します。

プラグインのインスタンス化

プラグインを開発している間、プラグインを保持するソリューションがあり、その効果を確認するために各変更の後に MPS を再起動する必要がないようにプラグインクラスを自動的に再ロード可能にします。開発フェーズを正しく設定するには、次の手順に従います。

  1. プラグイン用の新しいソリューションを作成する

  2. このソリューションで <solution_name> .plugin という名前のモデルを作成します

  3. jmlang.plugin および jmlang.plugin.standalone 言語をソリューションとモデルにインポートします

  4. モデルにルート StandalonePluginDescriptor を作成します ( それは jmlang.plugin.standalone 言語から来ています)

  5. ソリューションのソリューションの種類その他に設定する

    Plug2

    プラグインモデルを編集して、生成直後に現在の MPS インスタンスに適用された変更を確認できます。また、ソリューションを配布して、プラグインをユーザーに正常に機能させることもできます。

アクションとアクショングループ

アクションおよびアクショングループエンティティを使用して、MPS の任意のメニューにカスタムアクションを追加できます。

アクションは、1 つの具体的なアクションを表します。 アクショングループは、アクションの構造化を目的としたアクションの名前付きリストです。アクションを他のグループや MPS グループ(メニュー自体を表す)に追加し、ポップアップメニューに結合します。内容が動的に変化するグループを作成することもできます。

既存のグループに新しいアクションを追加する方法

既存のグループに新しいアクションを追加するには、次のことを実行する必要があります。

  1. 行動を説明する

  2. 記述されたアクションはグループにまとめられるべきです

  3. これらのグループは既存のグループに追加する必要があります(MPS メニューに新しいアクションを追加するために事前定義された MPS グループなど)。

事前定義された MPS グループは jetbrains.mps.ide.actions モデルに保存されます。これは jetbrains.mps.lang.plugin 言語のアクセサーリモデルであるため、モデルに明示的にインポートする必要はありません。

アクション構造

アクションのプロパティ

名前 - アクションの名前。任意の名前を付けることができます。唯一の明らかな制約は、名前がモデルのスコープ内で一意である必要があることです。

ニーモニック - ニーモニックが指定されている場合、このアクションを含むグループが表示されると、alt + ニーモニックショートカットを介してアクションを使用できます。ニーモニック(指定されている場合)は、アクションのキャプションの文字の 1 つである必要があることに注意してください。ニーモニックは、アクションのキャプションに下線付きの記号として表示されます。

外部コマンドを実行 - MPS モデルでのすべての操作は、コマンド内で実行されます。コマンドは元に戻すリストの項目であるため(手動で制御するのではなく、MPS が自動的に制御します)、ユーザーはアクションの実行によってモデルに加えられた変更を元に戻すことができます。また、コマンドで実行されるすべてのコードには、モデルへの読み取り / 書き込みアクセス権があります。キャッチは、コマンド内からユーザーに視覚的なダイアログを表示すると、読み取り / 書き込みロックを保持しながらブロックすることでデッドロックが発生する可能性があることです。アクションで UI を使用していない場合にのみ、e xecuteoutside コマンドオプションを false に設定することをお勧めします。それ以外の場合は true に設定し、適切な読み取り / 書き込みアクセスロックを、アクション内の読み取りアクションおよびコマンドステートメントを使用して手動で実行する必要があります。

Plug1

でも利用可能 - 現在のところ、これは "everywhere" にしか設定できません。つまり、アクションはコンテキスト内でのみ使用可能になるわけではなく、完了メニューから呼び出すことができますが、他のコンテキストでも呼び出すことができます。例: 何らかのアクションがエディターのコンテキストメニューグループに追加されたが、フォーカスが論理ビュー内にあるとき、またはすべてのエディターが閉じられたときにそれを利用可能にしたい場合は、"available in" も "everywhere" に設定する必要があります。

キャプション - メニューの動作を表す文字列

説明 - この文字列(指定されている場合)は、このアクションがアクティブなときにステータスバーに表示されます。(任意のメニューで選択)

アイコン - このアイコンは、すべてのメニューのアクションの近くに表示されます。「...」ボタンを押すと、アイコンファイルを選択できます。アイコンは言語の近くに配置する必要があることに注意してください (イメージとしてではなく、言語のルートからの相対パスとして保存されているからです。)

ビルドパラメーター

各アクションは、構築パラメーターを使用して、構築時にパラメーター化できます。これは、アクションの動作を決定する任意のデータにすることができます。構築パラメーターを使用する単一のアクションは、複数の異なる動作を表すことができます。アクションを管理し、キーマップを処理するには、MPS は、アクションによって表される具体的な動作ごとに一意の識別子を必要とします。そのため、toString 関数が各構築パラメーターに導入されました(インスペクターで確認できます)。プリミティブ型の場合、この関数を明示的に指定する必要はありません。MPS は自動的に指定できます。より複雑なパラメーターの場合は、この関数を明示的に記述して、アクションの具体的な動作ごとに、toString() 関数から返される値のセットが異なるようにする必要があります。

動作制御を有効 / 無効にする

無効な状態でもアクションを表示したい場合(現在のコンテキストでアクションが適用されない場合)は常に見えるフラグ - 、これを true に設定します。それ以外の場合は false に設定します。

コンテキストパラメーター - は、アクションを実行できるようにするために、現在のコンテキストに存在する必要があるアイテムを指定します。これらは、アクションのメソッドが実行される前にコンテキストから抽出されます。コンテキストパラメーターには条件が関連付けられています。requiredcustom は、最も頻繁に使用される 2 つのパラメーターです。一部の必須パラメーターが抽出されなかった場合、アクション状態は無効に設定され、isApplicable/update/execute メソッドは実行されません。必要なすべてのアクションパラメーターが抽出された場合、それらの値をすべてのアクションメソッドで使用できます。カスタムコンテキストパラメーターは、提供された関数を使用して、コンテキストパラメーターが必須であるかどうかをケースバイケースで決定するオプションを提供します。

アクションパラメーターには、単純なアクションパラメーターと複雑なアクションパラメーターの 2 種類があります。

  • 単純なアクションパラメーター( ActionDataParameterDeclaration で表される)を使用すると、現在のデータコンテキストから使用可能なすべてのデータを簡単に抽出できます。データは「キーごと」に提供されるため、宣言で名前キーを指定する必要があります。パラメーターの種類は自動的に設定されます。

  • 複雑なアクションパラメーター( ActionParameterDeclaration で表される)が導入され、頻繁に使用されるチェックと型キャストが実行されました。現在、この型のコンテキストパラメーターに使用できる型は 3 つあります。
    • 指定された概念のインスタンスで現在選択されているノード、- ノード <概念>。選択したノードがこの概念のインスタンスでない場合、アクションは有効になりません。

    • nlist <概念> - 現在選択されたノード。すべてのノードがコンセプトのインスタンスであることがチェックされます(指定されている場合)。ノード <概念> と同様に、チェックが失敗した場合、アクションは有効になりません。

    • モデル - 現在のモデルが選択されたノードを保持しています

該当 / 更新あり - このメソッドは、コンテキストパラメーターと連携して、アクションの有効 / 無効状態を制御します。次の 2 つのオプションのいずれかを選択できます。

  • isApplicable メソッドは、アクションの新しい状態を返します

  • update メソッドは、状態を手動で更新するように設計されています。event.getPresentation() を介してアクションのプレゼンテーションにアクセスすることにより、アクションのプロパティ(キャプション、アイコンなど)を更新することもできます。アクションで setEnabledState() メソッドを呼び出して、手動で有効または無効にします。

これらのメソッドは、必要なすべてのコンテキストパラメーターがコンテキストから正常に抽出された場合にのみ実行されます。

注: このキーワードは現在のアクションを参照します。action<...> を使用して、コードから表示されているアクションを取得します。

実行 - このメソッドは、アクションが実行されるときに実行されます。同じイベントに対するアクションの更新メソッドがアクションをアクティブ状態のままにし(または isApplicable が true を返した)、必要なすべてのコンテキストパラメーターが現在のコンテキストに存在し、入力された場合にのみ実行されることが保証されます。

メソッド - このセクションでは、ユーティリティメソッドを宣言できます。

グループ構成

グループは一連のアクションを記述し、他のグループを現在のグループで変更する方法に関する情報を提供します。

プレゼンテーション

お名前 - グループの名前。好きな名前を付けることができます。唯一の明らかな制約は、名前がモデルの範囲内で一意でなければならないことです。

これが当てはまる場合、ポップアップです - はポップアップメニューを表し、そうでない場合はアクションのリストを表します。

「is popup」が正しい場合

  • ポップアップメニューの名前として表示されるキャプション - 文字列

  • ニーモニック - ニーモニックが指定されている場合、ポップアップメニューは、それを含むグループが表示されたときに、alt + ニーモニックショートカットを介して使用できます。 ニーモニック(指定されている場合)は、caption の文字の 1 つでなければならないことに注意してください。ニーモニックは、ポップアップメニューのキャプションに下線付きの記号として表示されます。

  • 無効にすると見えなくなります - が true に設定されている場合、有効なアクションがないか、update() メソッドで手動で無効にされている場合、グループは表示されません。アクショングループで enable()/disable() メソッドを呼び出して、手動で有効または無効にします。

内容

グループの内容を説明する 3 つの可能性があります。

要素リスト - これは、アクション、グループ、ラベルの単なる静的リストです(変更を参照)。利用可能な要素は以下のとおりです。

  • -> 名前 - アンカー。アンカーは、あるグループを別のグループに変更するために使用されます。詳細はステートメントを追加の項を参照してください。

  • <---> - セパレーター

  • ActionName[parameters] - アクション

ビルド - この代替手段はグループで使用する必要があり、その内容は静的ですが、いくつかの初期条件に依存します。グループは一度構築され、その後は更新されません。add ステートメントを使用して、ビルドブロック内に要素を追加します。

更新 - これは動的に変化するグループに適用されます。グループはレンダリングされる直前に毎回更新されます。

修正とラベル

位置 <位置> で <グループ> に追加 - このステートメントは、現在のグループを指定された位置の <group> に追加します。すべてのグループには <default> 位置があり、現在のグループをターゲットグループの最後に追加するように指示します。一部のグループは、いわゆるアンカーを自分たちに追加することで、追加の位置を提供できます。アンカーの追加については、コンテンツセクションで説明しています。アンカー自体は非表示であり、グループを挿入できる位置を表します。

actionGroup <...> 式

登録されたグループにアクセスするために jetbrains.mps.lang.plugin 言語で使用できる特定の式(actionGroup < グループ > 式)があります。

Bootstrap グループ

Bootstrap グループは、MPS の外部で定義されたアクショングループ(たとえば、IDEA または一部の IDEA プラグインによって提供されたグループ)を操作する方法です。
この場合、ブートストラップグループは MPS で定義され、その内部 ID は外部グループの ID に設定されます。これを行った後、通常のブートストラップグループと同じようにブートストラップグループを操作できます。グループに挿入したり、その逆を行ったりできます。
通常のユーザーがブートストラップグループを使用する必要はめったにありません。

MacOS で Bar サポートをタッチ

カスタムユーザーアクションアクショングループは、事前定義された InterfaceGroups の 1 つに追加することにより、タッチバーに追加できます。

  • IDEATouchBarDefault

  • IDEATouchBarDefault_alt

  • IDEATouchBarDefault_cmd

  • IDEATouchBarDefault_cmd_alt

  • IDEATouchBarDefault_shift

  • IDEATouchBarDebug

進行状況インジケーターの表示

長期にわたる行動は彼らの活動と進歩をユーザーに示すべきです。プログレスバーの使用方法、キャンセルを許可する方法、およびバックグラウンドで実行するためのアクションを有効にする方法の詳細については、進捗インジケーターページをチェックしてください。

キーマップの変更

KeymapChangesDeclaration の概念により、プラグインは主要なショートカットを個々のアクションに割り当て、ショートカットスキームにグループ化できます。

どのアクションにも、いくつかのキーボードショートカットを含めることができます。これは、KeyMapChanges の概念を使用して指定できます。多数の「インスタンス」(パラメーター値ごとに 1 つのインスタンス)を持つパラメーター化されたアクションの場合、異なるパラメーター値に対して異なるショートカットを返す関数を指定できます。
MPS には、いくつかの「デフォルトのキーマップ」があります。これは、設定 -> キーマップに表示されます。for keymap セクションでは、KeyMapChanges 定義がコントリビュートするキーキャップを指定できます。たとえば、MacOS と Windows のキーマップで同じアクションに異なるショートカットを設定できます。

プラグインによって追加されたすべてのアクションは設定 - > キーマップ設定 - > メニューとツールバーに表示されます。つまり、どのユーザーもすべての MPS アクションに使用されるショートカットをカスタマイズできます。

Plug4

A キーマップの変更は、モデル内で一意の名前を指定する必要があり、それが変更されているキーマップを指定する(またはすべてのキーマップを変更するには、デフォルト)、次に 1 を持つべきアクションにキーストロークを割り当てる必要があります。キーストロークは、直接指定されたキーストロークを使用した SimpleShortcutChange、またはパラメーター化されたアクションを処理する機能を提供する ParametrizedShortcutChange のいずれかです。

NonDumbAwareActions

アクションでプラットフォームインデックスを使用している場合(これは非常にまれです)、NonDumbAwareActions に追加します。これらのアクションは、インデックスの作成中に自動的に無効になります。

エディタータブ

概念宣言を見れば、確かにエディターの下部にあるタブに気づくでしょう。あなたの言語からの概念に同じ機能を追加することができます。

これらのタブの意味は何ですか? 答えは非常に単純です。「ベース」ノードのいくつかの側面のエディターが含まれています。各タブは、シングルタブ(エディタータブなど、1 つのノードのみが表示されることを意味します)またはマルチタブ(ベースノードのこの側面に対して複数のノードを作成できる場合は、たとえば型システムタブを参照)のいずれかになります。)。

ノードのエディターはどのように作成されますか? いくつかのノードを開くとき、N と呼びます。MPS は N の「ベース」ノードを見つけようとします。ベースノードがない場合、MPS は選択したノードのエディターを開くだけです。ノードが見つかった場合(B と呼ぶ)、MPS はそのノードのいくつかのタブを開き、いくつかの従属ノードのエディターを含みます。次に、N のタブを選択し、B に対応する上部のアイコンとキャプションを設定します。

タブ付きエディターを作成するときは、実際には次のルールを提供します。

  • ベースノードを見つける

  • 下位ノードを見つける

  • オプションで従属ノード作成のアルゴリズム

要求された基本概念に一致するタブが表示され、それぞれの順序制約セクションで指定された相対的な順序規則に従って編成されます。

エディタータブの構造

お名前 - ルールの名前。好きな名前を付けることができます。唯一の明らかな制約は、名前がモデルの範囲内で一意でなければならないことです。

アイコン - このアイコンはタブのヘッダーに表示されます。「...」ボタンを押すと、アイコンファイルを選択できます。アイコンは言語の近くに配置する必要があることに注意してください (イメージとしてではなく、言語のルートからの相対パスとして保存されているからです。)

ショートカット文字 - キーボードを使用してタブにすばやく移動するための文字

順序の制約 - Order コンセプトのインスタンス。順序は、現在のタブが他のタブと比較して表示される順序を指定します。外部オーダーを参照するか、インプレースで指定することができます。

基本ノードの概念 - このベースノードと関連するすべてのタブの概念。

ベースノード - これは、既知のノードを指定してベースノードを検索するためのルールです。ベースノードが見つからない場合、またはこの TabbedEditor を適用できない場合は、null を返す必要があります。

該当します - 特定のベースノードでタブを使用できるかどうかを示します

command- ノードの作成をコマンドとして実行するかどうか、つまり、元に戻すことができ、ユーザーとの追加の UI 操作を使用しないかどうかを示します。

getNode/ getNodes - はこのタブで編集するノードまたはノードのリストを返します

getConcepts- このタブを使用して編集できるノードの概念を返します

作成 - が指定されている場合、これは、ユーザーがこのタブから新しいノードを作成するように要求したときに実行されます。要求された概念とベースノードがパラメーターとして与えられます。

ツール

ツールはグラフィカルなプレゼンテーションを持ち、いくつかの特定のタスクを実行することを目的とした機器です。例: 用途ビュー、Todo ビューアー、モデルおよびモジュールリポジトリビューアーはすべてツールです。MPS はツールのための豊富な UI サポートを持っています - ウィンドウの端から端までドラッグアンドドロップでそれを動かしたり、隠したり、見せたり、他の多くのアクションを実行することができます。

ツールは「プロジェクトごとに」作成されます。それらはクラスの再ロード時に初期化 / 破棄されます (言語生成後、"reload all" アクションなど)

ツール構造

名前 - ツールの名前。任意の名前を付けることができます。唯一の明らかな制約は、名前がモデルのスコープ内で一意である必要があることです。

キャプション - この文字列はツールのヘッダーとツールペインのツールのボタンに表示されます

番号 - を指定すると、alt + number がこのツールを表示するためのショートカットになります (利用可能な場合)

ツールのボタンに表示されるアイコン。「...」ボタンを押すとアイコンファイルを選択できます。アイコンはあなたの言語の近くに配置する必要があります (イメージとしてではなく、言語のルートからの相対パスとして保存されているからです。)

位置 - 上 / 下 / 左 / 右の上にツールを追加して目的の MPS ツールバーに追加します

その中に - はここでツールインスタンスを初期化します

処分 - はすべてのツールリソースをここに配置します

getComponent - は、ツールのウィンドウ内に表示するために Swing コンポーネント(JComponent を拡張するクラスのインスタンス)を返す必要があります。ツールにタブを作成する予定で、IDEA のツールフレームワークに精通している場合は、IDEA のタブのサポートを使用することをお勧めします。このフレームワークを使用すると、タブの機能と UI が大幅に向上します。

フィールドとメソッド - の通常のフィールドとメソッドは、あなたのツールと外部コードの中で使用することができます。

ツール操作

あるプロジェクトのツールに簡単にアクセスするための操作(GetToolInProjectOperation の概念)を追加しました。project.tool <toolName> として使用します。ここで、project は IDEA プロジェクトです。jetbrains.mps.lang.plugin.standalone 言語をインポートして使用できるようにすることを忘れないでください。

タブ付きツール

ツールウィンドウと同じですが、さらに複数のタブを含めることができます

ツール構造

名前 - ツールの名前。任意の名前を付けることができます。唯一の明らかな制約は、名前がモデルのスコープ内で一意である必要があることです。

キャプション - この文字列はツールのヘッダーとツールペインのツールのボタンに表示されます

番号 - を指定すると、alt + number がこのツールを表示するためのショートカットになります (利用可能な場合)

ツールのボタンに表示されるアイコン。「...」ボタンを押すとアイコンファイルを選択できます。アイコンはあなたの言語の近くに配置する必要があります (イメージとしてではなく、言語のルートからの相対パスとして保存されているからです。)

位置 - 上 / 下 / 左 / 右の上にツールを追加して目的の MPS ツールバーに追加します

その中に - はここでツールインスタンスを初期化します

処分 - はすべてのツールリソースをここに配置します

フィールドとメソッド - の通常のフィールドとメソッドは、あなたのツールと外部コードの中で使用することができます。

設定コンポーネント

MPS の起動間で、一部の設定(ツールの設定など)を編集および保存できるようにしたい場合があります。これらの目的のために、設定コンポーネントを導入しました。

各設定コンポーネントは、いくつかの設定ページといくつかの永続フィールドを含みます。設定ページは、ユーザー設定を編集するためのダイアログです。それらはファイル - > 設定を通してアクセス可能です。

永続フィールドは、プロジェクトが閉じられたときに .iws ファイルに保存され、プロジェクトが開いたときにそれらから復元されます。保存プロセスはリフレクションを使用するため、ほとんどの場合、シリアル化 / 逆シリアル化について気にする必要はありません。

設定コンポーネントの構造

名前 - コンポーネント名好きな名前を付けることができます。唯一の明らかな制約は、名前がモデルの範囲内で一意でなければならないことです。

フィールド - これらは永続フィールドです。これらは、読み取りおよびページの作成後に初期化されるため、アクセスできるたびに値が正しくなります。デフォルト値を指定することもできます。

/ 書く前に - を読み取った後、これらのブロックは、カスタムシリアル化の目的、および対応する設定ページがない設定の適用 / 収集に使用されます。(たとえば工具寸法)

ページ - 設定ページ

設定ページの構造

名前 - 設定ページでキャプションとして使用される文字列。名前はモデル内で一意である必要があります。

コンポーネント - 設定を編集するための UI コンポーネント。

icon- 設定ウィンドウに表示するアイコン。アイコンのサイズは最大 32x32 にすることができます

reset- このメソッドが呼び出されたときに、UI コンポーネントの設定値をリセットします。

commit- このメソッドでは、設定を UI コンポーネントから収集し、使用される場所にコミットする必要があります。

isModified - このメソッドが false を返す場合、commit は実行されません。これは通常、実行時間の長い commit メソッドを使用する設定ページで役立ちます。

PreferenceComponent 式

一部のプロジェクトで PreferenceComponent にアクセスするための式を追加しました。project.preferenceComponent <componentName> としてアクセスできます。ここで、project は IDEA プロジェクトです。使用するには、jetbrains.mps.lang.plugin.standalone 言語をインポートすることを忘れないでください。

カスタムプラグインパーツ (ProjectPlugin、ApplicationPlugin)

カスタムプラグインパーツは、プラグインの初期化 / 破棄時に実行されるカスタムアクションです。それらはプラグインとまったく同じように動作します。あなたの言語のために好きなだけカスタムプラグインを作成することができます。カスタムプラグインには、プロジェクトとアプリケーションのカスタムプラグインの 2 種類があります。プロジェクトカスタムプラグインはプロジェクトごとに 1 回インスタンス化されますが、アプリケーションカスタムプラグインはアプリケーションごとに 1 回インスタンス化されるため、プロジェクトパラメーターはありません。