MPS 2020.1 ヘルプ

プラグイン

プラグインはあなたのコードを 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 つのノードのみが表示されることを意味します)またはマルチタブ(ベースノードのこの側面に複数のノードを作成できる場合は型システムタブを参照)のいずれかです。)

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

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

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

  • 下位ノードを見つける

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

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

エディタータブの構造

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

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

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

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

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

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

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

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

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

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

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

ツール

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

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

ツール構造

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

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

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

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

位置 - 目的の MPS ツールバーにツールを追加するための top/bottom/left/right のオン

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

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

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

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

ツール操作

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

タブ付きツール

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

ツール構造

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

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

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

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

位置 - 目的の MPS ツールバーにツールを追加するための top/bottom/left/right のオン

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

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

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

設定コンポーネント

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 回インスタンス化されるため、プロジェクトパラメーターはありません。

最終更新日 : 2020 年 6 月 18 日