MPS 2019.2ヘルプ

プラグイン

プラグインはあなたのコードをMPS IDE機能と統合する方法です。
jetbrains.mps.lang.pluginjetbrains.mps.lang.plugin.standalone言語はあなたのプラグインで使用することができるいくつかの根本的な概念をあなたに与えます。この章ではそれらすべてについて説明します。

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

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

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

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

  3. ソリューションとモデルにj.m.lang.pluginj.m.lang.plugin.standaloneの言語をインポートする

  4. モデルにルートStandalonePluginDescriptorを作成する (それは j.m.lang.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 xecute outsideコマンドオプションをfalseに設定することをお勧めします。それ以外の場合はtrueに設定し、読み取りアクションとアクション内のコマンドステートメントを使用して適切な読み取り/書き込みアクセスロックを手動で実行する必要があります。

Plug1

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

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

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

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

ビルドパラメータ

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

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

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

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

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

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

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

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

    • model -選択したノードを保持している現在のモデル

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

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

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

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

注: thisキーワードは現在のアクションを表します。コードから見えるすべてのアクションを取得するには、action <...>を使用してください。

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

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

グループ構成

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

プレゼンテーション

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

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

「is popup」が正しい場合

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

  • ニーモニックが指定されている場合、ニーモニック - が含まれているグループが表示されていると、ポップアップメニューはAlt +ニーモニックショートカットから利用できます。ニーモニック(指定されている場合)は、キャプションの文字の1つでなければなりません。ニーモニックは、ポップアップメニューのキャプションに下線付きの記号として表示されます。

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

内容

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

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

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

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

  • ActionName [パラメータ] - アクション

ビルド - この選択肢はグループで使用されるべきで、その内容は静的ですが、いくつかの初期条件に依存します - グループは一度構築され、それ以降は更新されません。ビルドブロック内に要素を追加するには、addステートメントを使用します。

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

修正とラベル

位置<位置>で<グループ>に追加 - このステートメントは、現在のグループを指定の位置にある<グループ>に追加します。すべてのグループには<デフォルト>の位置があり、これは現在のグループをターゲットグループの最後に追加するように指示します。いくつかのグループは彼ら自身にいわゆるアンカーを加えることによって追加の位置を提供することができます。アンカーを追加することは内容のセクションで説明されています。アンカー自体は表示されず、グループを挿入できる位置を表します。

actionGroup <...>式

任意の登録済みグループにアクセスするためのjetbrains.mps.lang.plugin言語で使用可能な特定の式、つまりactionGroup < グループ >式があります。

Bootstrapグループ

Bootstrapグループは、MPSの外部で定義されているアクショングループ(たとえば、IDEAや何らかのIDEAプラグインによって寄贈されたグループ)を扱う方法です。
この場合、ブートストラップグループはMPSで定義され、その内部IDは外部グループのIDに設定されます。これが終わったら、ブートストラップグループを通常のグループと同じように扱うことができます。それを自分のグループに挿入したり、その逆も可能です。
通常のユーザーがブートストラップグループを使用する必要はほとんどありません。

MacOSでBarサポートをタッチ

定義済みのInterfaceGroupsのいずれかに追加することで、カスタムユーザーアクションアクショングループタッチバーに追加できます。

  • IDEATouchBarDefault

  • IDEATouchBarDefault_alt

  • IDEATouchBarDefault_cmd

  • IDEATouchBarDefault_cmd_alt

  • IDEATouchBarDefault_shift

  • IDEATouchBarDebug

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

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

キーマップの変更

キーマップ変更宣言のコンセプトにより、プラグインは個々のアクションにキーショートカットを割り当て、ショートカットスキームにグループ化することができます。

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

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

Plug4

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

NonDumbAwareActions

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

エディター・タブ

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

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

How the editor for a node is created? When you open some node, call it N, MPS tries to find the "base" node for N. If there isn't any base node, MPS just opens the editor for the selected node. If the node is found (call it B), MPS opens some tabs for it, containing editors for some subordinate nodes. Then it selects the tab for N and sets the top icon and caption corresponding to B.

タブ付きエディターを作成するときには、実際に次の規則を指定します。

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

  • 下位ノードを見つける

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

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

エディタータブの構造

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

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

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

順序の制約 - 順序コンセプトのインスタンス順序は、現在のタブが他のタブに対して表示される順序を指定します。外部オーダーを参照することも、その場で1つ指定することもできます。

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

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

該当する - 指定されたベースノードにタブを使用できるかどうかを示します

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

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

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

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

ツール

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

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

ツール構造

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

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

番号 - が指定されている場合、Alt +番号はこのツールを表示するためのショートカットになります。(利用可能な場合)

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

位置 - 目的のMPSツールバーにツールを追加するための上/下/左/右のオン

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

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

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

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

ツール操作

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

タブ付きツール

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

ツール構造

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

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

番号 - が指定されている場合、Alt +番号はこのツールを表示するためのショートカットになります。(利用可能な場合)

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

位置 - 目的のMPSツールバーにツールを追加するための上/下/左/右のオン

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

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

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

設定コンポーネント

MPSスタートアップの間にいくつかの設定(たとえばあなたのツールの設定)を編集して保存したいことがあるかもしれません。これらの目的のために、環境設定コンポーネントを導入しました。

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

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

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

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

fields - これらは永続的なフィールドです。それらは読み込みとページ作成の前に初期化されるため、それらの値はそれらがアクセスされることができるあらゆる瞬間に正しいでしょう。デフォルト値も指定できます。

/ 書く前に - 読んだ後、これらのブロックはカスタムのシリアライゼーションとプリファレンスの適用/収集に使用されます。これらは対応するプリファレンスページを持ちません。(たとえば工具寸法)

pages - 設定ページ

設定ページの構造

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

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

icon - 設定ウィンドウに表示するアイコンアイコンのサイズは32x32までです

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

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

isModified - このメソッドがfalseを返すと、コミットは実行されません。これは一般的に、長期間コミット方法を使う設定ページに役立ちます。

PreferenceComponent式

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

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

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

最終更新日: 2019年8月30日