プラグイン
プラグインとは、MPS IDE の機能とコードを統合するための方法です。
jetbrains.mps.lang.plugin および jetbrains.mps.lang.plugin.standalone 言語は、プラグインで使用できるいくつかのルート概念を提供します。この章では、それらすべてについて説明します。
プラグインのインスタンス化
プラグインを開発している間、プラグインを保持するソリューションがあり、その効果を確認するために各変更の後に MPS を再起動する必要がないようにプラグインクラスを自動的に再ロード可能にします。開発フェーズを正しく設定するには、次の手順に従います。
プラグイン用の新しいソリューションを作成します。
このソリューション内にモデルを作成します。モデル名を <solution_name>.plugin とすると、この命名規則により、プラグインモデルが MPS によって自動的に認識され、適切にロードされます。ただし、推奨される方法は、この命名規則に従わず、代わりに後述するように StandalonePluginDescriptor を使用してプラグインを識別することです。
jmlang.plugin および jmlang.plugin.standalone 言語をソリューションとモデルにインポートします。
モデル内にルート StandalonePluginDescriptor を作成します (jmlang.plugin .standalone 言語から取得されます)。
プラグインモデルに <solution_name>.plugin という命名規則に従わない場合は、StandalonePluginDescriptor の Generate initializer config フラグを true に設定してください。これにより、生成された startup.properties ファイルにプラグインが含まれ、MPS によってプラグインとしてロードされることが保証されます。
Java タブでソリューションのコンパイルとクラスの読み込みをカスタマイズし、MPS の拡張機能を提供する通常の MPS モジュールにします。

プラグインモデルを編集して、生成直後に現在の MPS インスタンスに適用された変更を確認できます。また、ソリューションを配布して、プラグインをユーザーに正常に機能させることもできます。
アクションとアクショングループ
MPS では、アクションおよびアクショングループエンティティを使用することで、任意のメニューにカスタムアクションを追加できます。
アクションは、具体的な動作を 1 つ記述します。アクションを整理するための名前付きリストは、他のグループやグループ(メニューを表す)に追加したり、ポップアップメニューに組み合わせたりするために使用できます。また、動的に変化するコンテンツを持つグループを作成することもできます。
既存のグループに新しいアクションを追加するには:
行動内容を説明してください。
記述された行動をグループ分けしてください。
これらのグループを既存のグループに追加します(たとえば、定義済みの MPS グループに追加して、MPS メニューに新しいアクションを追加します)。
事前定義された MPS グループは jetbrains.mps.ide.actions モデルに保存されます。これは jetbrains.mps.lang.plugin 言語のアクセサーリモデルであるため、モデルに明示的にインポートする必要はありません。
アクション構造
アクションのプロパティ
名前 - アクションの名前。名前はモデルのスコープ内で一意である必要があり、大文字小文字の区別が適切かどうかがチェックされます(名前の適切な大文字表記を参照)。
ニーモニック - ニーモニックが指定されている場合、このアクションを含むグループが表示されると、alt + ニーモニックショートカットを介してアクションを使用できます。ニーモニック(指定されている場合)は、アクションのキャプションの文字の 1 つである必要があることに注意してください。ニーモニックは、アクションのキャプションに下線付きのシンボルとして表示されます。
必要なアクセス - は、MPS がアクションに提供するアクセス制御を指定します。
なし - アクセス制御は提供されず、ロックはアクションによって手動で実行する必要があります。アクションは、UI をロックするリスクなしに UI 操作を実行できます。
読み取り - 読み取りアクセスが許可されます。このアクションは、UI をロックするリスクなしに UI 操作を実行できます。
コマンド - MPS モデルに対するすべての操作は、コマンド内で実行されます。コマンドはアンドゥリストの項目であり(手動で制御する必要はなく、MPS が自動的に制御します)、ユーザーはアクションの実行によってモデルに加えられた変更を取り消すことができます。また、コマンド内で実行されるすべてのコードは、モデルへの読み書きアクセス権を持ちます。ただし、コマンド内からユーザーに視覚的なダイアログを表示すると、読み書きロックを保持したままブロックされ、デッドロックが発生する可能性があるため注意が必要です。このオプションは、アクションで UI を使用しない場合にのみ使用してください。
エディターコマンド - 上記のオプションと同様に、この操作は取り消し可能なコマンドのコンテキストで実行され、読み取りおよび書き込みアクセスが許可されます。コマンドはエディターコンテキストから取得されるため、エディターコンテキストを操作のコンテキストパラメーターの 1 つとして指定する必要があります。
外部コマンドを実行 - (このオプションは、必須アクセスを優先して徐々に廃止する必要があります。true に 設定すると、必須アクセスプロパティの設定を上書きします) MPS モデルに対するすべての操作は、コマンド内で実行されます。コマンドは、元に戻すリストの項目です (手動で制御するのではなく、MPS が自動的に行います)。そのため、ユーザーは、アクションの実行によってモデルに加えられた変更を元に戻すことができます。また、コマンド内で実行されるすべてのコードは、モデルへの読み書きアクセス権を持ちます。注意点として、コマンド内からユーザーにビジュアルダイアログを表示すると、読み書きロックを保持したままブロックすることでデッドロックが発生する可能性があります。アクションで UI を使用しない場合にのみ、コマンド外で実行オプションを false に設定してください。それ以外の場合は、true に設定し、適切な読み書きアクセスロックを、アクション内の read アクションとコマンドステートメントを使用して手動で実行する必要があります。

でも利用可能 - 現在、この設定は「すべての場所」のみ可能です。つまり、アクションは補完メニューから呼び出せるコンテキストだけでなく、他のコンテキストでも利用可能になります。例: アクションがエディターのコンテキストメニューグループに追加されていても、フォーカスが論理ビューにあるとき、すべてのエディターが閉じているときにも利用できるようにしたい場合は、「他の場所でも利用可能」を「すべての場所」に設定する必要があります。
キャプション - メニューの動作を表す文字列
説明 - この文字列(指定されている場合)は、このアクションがアクティブなときにステータスバーに表示されます。(任意のメニューで選択)
アイコン - このアイコンは、すべてのメニューのアクションの近くに表示されます。アイコンファイルを選択するか、DSL を使用してアイコンを記述することができます。アイコンファイルは言語の近くに配置する必要があることに注意してください (アイコンファイルはイメージとしてではなく、言語のルートからの相対パスとして保存されるため)。
ビルドパラメーター
各アクションは、構築時に構築パラメーターを使用してパラメーター化できます。これは、アクションの動作を決定する任意のデータです。構築パラメーターを使用する単一のアクションは、複数の動作を表すことができます。アクションを管理し、キーマップを処理するために、MPS は、アクションによって表される各具体的な動作に対して一意の識別子を必要とします。そのため、各構築パラメーターに対して toString 関数が導入されました (インスペクタで確認できます)。プリミティブ型の場合は、この関数を明示的に指定する必要はありません。MPS が自動的に行います。より複雑なパラメーターの場合は、この関数を明示的に記述する必要があります。これにより、アクションの各具体的な動作に対して、toString() 関数から異なる値のセットが返されます。
動作制御を有効 / 無効にする
無効な状態でもアクションを表示したい場合(現在のコンテキストでアクションが適用されない場合)は常に見えるフラグ - 、これを true に設定します。それ以外の場合は false に設定します。
コンテキストパラメーター - は、アクションを実行するために現在のコンテキストに存在する必要がある項目を指定します。これらは、アクションのメソッドが実行される前にコンテキストから抽出されます。コンテキストパラメーターには条件が関連付けられており、required、custom、id が最もよく使用される 3 つの条件です。必須パラメーターの一部が抽出されなかった場合、アクションの状態は disabled に設定され、isApplicable/update/execute メソッドは実行されません。必須アクションパラメーターがすべて抽出された場合、それらの値をすべてのアクションメソッドで使用できます。カスタムコンテキストパラメーターを使用すると、指定された関数を使用して、コンテキストパラメーターが必須かどうかをケースごとに決定できます。is 条件は、取得したオブジェクトを指定されたクラスと比較します。
アクションパラメーターには、単純アクションパラメーターと複雑アクションパラメーターの 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 < グループ > 式)があります。
内部です
このオプションはインスペクターで指定されます。「内部」とマークされたグループは、MPS が内部モードで実行されている場合にのみ表示されます。
plugin.xml 経由で登録する
このオプションはインスペクターで指定されます。このフラグは、グループのアクションが plugin.xml ファイルを介して静的に登録されるか、グループのクラスを (再) ロードするときに動的に登録されるかを制御します。true に設定すると、グループをリストする (別名登録する) モデル内に IdeaComponent.xml (IdeaConfigurationXml の概念) のインスタンスを提供する必要があります。
IdeaComponent.xml
IntelliJ プラットフォームの要求に応じて、生成されたコンポーネント .xml ファイルを通じて、グループ、ブートストラップグループ、およびキーマップを静的に登録します。
Bootstrap グループ
Bootstrap グループは、MPS の外部で定義されたアクショングループ(たとえば、IDEA や IDEA プラグインによって提供されたグループ)を操作するための方法です。
この場合、MPS にブートストラップグループが定義され、その内部 ID が外部グループの ID に設定されます。この設定後、ブートストラップグループは通常のグループと同様に操作できます。つまり、ブートストラップグループを自分のグループに挿入したり、逆に自分のグループをブートストラップグループに挿入したりできます。
通常のユーザーがブートストラップグループを使用する必要はめったにありません。
インスペクターの plugin.xml オプションによる登録は、通常のグループの場合と同じ意味を持ち、上で説明されています。
MacOS で Bar サポートをタッチ
カスタムユーザーアクションとアクショングループは、事前定義された InterfaceGroups の 1 つに追加することにより、タッチバーに追加できます。
IDEATouchBarDefault
IDEATouchBarDefault_alt
IDEATouchBarDefault_cmd
IDEATouchBarDefault_cmd_alt
IDEATouchBarDefault_shift
IDEATouchBarDebug
進行状況インジケーターの表示
長時間かかる処理は、その動作状況と進行状況をユーザーに表示する必要があります。プログレスバー、キャンセル機能、バックグラウンド実行の有効化に関する詳細は、進捗インジケーターのページを参照してください。
キーマップの変更
KeymapChangesDeclaration の概念により、プラグインは主要なショートカットを個々のアクションに割り当て、ショートカットスキームにグループ化できます。
どのアクションにも、複数のキーボードショートカットを設定できます。これは、KeyMapChanges コンセプトを使用して指定できます。複数の「インスタンス」(パラメーター値ごとに 1 つのインスタンス) を持つパラメーター化されたアクションの場合、異なるパラメーター値に対して異なるショートカットを返す関数を指定できます。
MPS にはいくつかの「デフォルトキーマップ」があり、設定→キーマップで確認できます。キーマップのセクションでは、KeyMapChanges 定義が適用されるキーマップを指定できます。例: MacOS と Windows のキーマップで、同じ操作に対して異なるショートカットを設定できます。
プラグインによって追加されたすべてのアクションは設定 - > キーマップと設定 - > メニューとツールバーに表示されます。つまり、どのユーザーもすべての MPS アクションに使用されるショートカットをカスタマイズできます。


KeyMap Change には、モデル内で一意の名前が必要であり、変更するキーマップを指定する必要があります (または、Default を使用してすべてのキーマップを変更)。次に、キーストロークを割り当てるアクションにキーストロークを割り当てます。キーストロークは、キーストロークを直接指定した SimpleShortcutChange または、パラメーター化されたアクションを処理できる ParametrizedShortcutChange のいずれかです。
インスペクターの plugin.xml オプションによる登録は、通常のグループの場合と同じ意味を持ち、上で説明されています。
NonDumbAwareActions
アクションでプラットフォームインデックスを使用している場合(これは非常にまれです)、NonDumbAwareActions に追加します。これらのアクションは、インデックスの作成中に自動的に無効になります。
エディタータブ
概念宣言を見れば、確かにエディターの下部にあるタブに気づくでしょう。あなたの言語からの概念に同じ機能を追加することができます。
これらのタブには、「ベース」ノードのいくつかの側面を編集するためのエディターが含まれています。各タブは、単一タブ(たとえばエディタータブのように、1 つのノードのみが表示される)または複数タブ(ベースノードのこの側面に対して複数のノードを作成できる場合、たとえば型システムタブを参照)のいずれかになります。
ノードのエディターはどのように作成されるのでしょうか? ノード N を開くと、MPS は N の「ベース」ノードを探します。ベースノードが存在しない場合、MPS は選択したノードのエディターを開きます。ノードが見つかった場合(B とします)、MPS はいくつかのタブを開き、その中にいくつかの下位ノードのエディターを配置します。そして、N のタブを選択し、B に対応するトップアイコンとキャプションを設定します。
タブ付きエディターを作成するときには、実際に次の規則を指定します。
ベースノードを見つける
下位ノードを見つける
オプションで従属ノード作成のアルゴリズム
要求された基本概念に一致するタブが、それぞれの順序制約セクションで指定されている相対順序規則に従って表示および編成されています。
エディタータブの構造
お名前 - ルールの名前。任意の名前を付けることができますが、唯一の制約は、モデルの範囲内で名前が一意である必要があることです。
アイコン - このアイコンはタブのヘッダーに表示されます。アイコンファイルを選択するか、DSL を使用してアイコンを記述することができます。アイコンファイルは言語の近くに配置する必要があることに注意してください (アイコンファイルはイメージとしてではなく、言語のルートからの相対パスとして保存されるため)。
ショートカット文字 - キーボードを使用してタブにすばやく移動するための文字
順序の制約 - Order コンセプトのインスタンス。順序は、現在のタブが他のタブと比較して表示される順序を指定します。外部オーダーを参照するか、インプレースで指定することができます。
基本ノードの概念 - このためのベースノードの概念とすべての関連タブ。
ベースノード - これは、既知のノードを指定してベースノードを検索するためのルールです。ベースノードが見つからない場合、またはこの TabbedEditor を適用できない場合は、null を返す必要があります。
該当します - 指定されたベースノードにタブを使用できるかどうかを示します
getNode/getNodes - はこのタブで編集するノードまたはノードのリストを返します
コマンド - ノードの作成をコマンドとして実行するかどうか、つまり、元に戻すことができ、ユーザーとの追加的な UI 操作を使用しないかどうかを示します。
getConcepts - このタブで編集可能なノードの概念を返します
作成 - が指定されている場合、これはユーザーがこのタブから新しいノードを作成するように要求したときに実行されます。要求された概念とベースノードがパラメーターとして与えられます。
順序
順序ルートの概念を使用すると、エディタータブの順序付けルールを作成できます。詳細については、上の章を参照してください。
ツール
ツールとは、特定のタスクを実行するために設計された、グラフィカルな表示機能を備えた機器のことです。例: 使用状況ビュー、ToDo ビューアー、モデルおよびモジュール依存関係ビューアーはすべてツールです。MPS はツールに対して豊富な UI サポートを提供しており、ウィンドウの端から端へドラッグアンドドロップで移動したり、非表示、表示、その他多くの操作を実行できます。
ツールは「プロジェクトごと」に作成されます。クラスの再読み込み時に初期化および破棄されます (言語生成後、「すべて再読み込み」アクション時、同様のイベント)
ツール構造
名前 - ツールの名前。名前はモデルの範囲内で一意である必要があり、大文字小文字の区別が適切かどうかがチェックされます(名前の適切な大文字表記を参照)。
キャプション - この文字列はツールのヘッダーとツールペインのツールのボタンに表示されます
番号 - を指定すると、alt + number がこのツールを表示するためのショートカットになります (入手可能であれば)
アイコン - ツールのボタンに表示されるアイコン。アイコンファイルを選択するか、DSL を使用してアイコンを記述することができます。アイコンファイルは言語の近くに配置する必要があることに注意してください (アイコンファイルはイメージとしてではなく、言語のルートからの相対パスとして保存されるため)。
位置 - ツールを目的の MPS ツールバーに追加するには、上 / 下 / 左 / 右のいずれかを選択します。
その中に - はここでツールインスタンスを初期化します
処分 - はすべてのツールリソースをここに配置します
getComponent - は、ツールのウィンドウ内に表示するために Swing コンポーネント(JComponent を拡張するクラスのインスタンス)を返す必要があります。ツールにタブを作成する予定で、IDEA のツールフレームワークに精通している場合は、IDEA のタブのサポートを使用することをお勧めします。このフレームワークを使用すると、タブの機能と UI が大幅に向上します。
フィールドとメソッド - の通常のフィールドとメソッド。ツールや外部コードで使用できます。
ツール操作
プロジェクト内のツールにアクセスするための操作(GetToolInProjectOperation という概念)を追加しました。使用方法は project.tool<toolName> です。ここで project は IDEA プロジェクトです。使用するには、jetbrains.mps.lang.plugin.standalone 言語をインポートすることを忘れないでください。
例: TODO ツールウィンドウを開くには、アクションで次のコードを使用します。

タブ付きツール
ツールウィンドウと同じですが、複数のタブを含めることができます。
ツール構造
名前 - ツールの名前。任意の名前を付けることができますが、唯一の制約は、モデルの範囲内で名前が一意である必要があるということです。
キャプション - この文字列はツールのヘッダーとツールペインのツールのボタンに表示されます
番号 - を指定すると、alt + number がこのツールを表示するためのショートカットになります (入手可能であれば)
アイコン - ツールのボタンに表示されるアイコン。アイコンファイルを選択するか、DSL を使用してアイコンを記述することができます。アイコンファイルは言語の近くに配置する必要があることに注意してください (アイコンファイルはイメージとしてではなく、言語のルートからの相対パスとして保存されるため)。
位置 - ツールを目的の MPS ツールバーに追加するには、上 / 下 / 左 / 右のいずれかを選択します。
その中に - はここでツールインスタンスを初期化します
処分 - はすべてのツールリソースをここに配置します
フィールドとメソッド - の通常のフィールドとメソッド。ツールや外部コードで使用できます。
設定コンポーネント
MPS の起動間で、一部の設定(たとえば、ツールの設定など)を編集して保存したい場合があるかもしれません。そのため、設定コンポーネントを導入しました。
各設定コンポーネントには、複数の設定ページと複数の永続フィールドが含まれています。設定ページは、ユーザー設定を編集するためのダイアログです。設定ページは、ファイル - > 設定を介してアクセスできます。
永続フィールドは、プロジェクトが閉じられると $PROJECT_HOME/.mps/workspace.xml ファイルに保存され、プロジェクトが開かれるとそこから復元されます。保存プロセスではリフレクションが使用されるため、ほとんどの場合、シリアル化 / デシリアル化を気にする必要はありません。
設定コンポーネントの構造
名前 - コンポーネント名。任意の名前を付けることができますが、唯一の制約は、モデルの範囲内で名前が一意である必要があることです。
fields - これらは永続的なフィールドです。それらは読み込みとページ作成の前に 初期化されるため、それらの値はそれらがアクセスされることができるあらゆる瞬間に正しいでしょう。デフォルト値も指定できます。
/ 書く前に - を読んだ後、これらのブロックはカスタムのシリアライゼーションと環境設定の適用 / 収集に使用されます。これらは対応する環境設定ページを持ちません。(たとえば、工具の寸法)
pages - 設定ページ
設定ページの構造
名前 - 設定ページでキャプションとして使用される文字列。名前はモデル内で一意である必要があります。
コンポーネント - 設定を編集するための UI コンポーネント (Java Swing クラス)。
icon - 設定ウィンドウに表示するアイコン。アイコンのサイズは最大 32x32 です。このアイコンは現在、MPS では使用されていません。
help topic - この設定ページのヘルプとして機能するドキュメントページの補助 ID。これは、JetBrains ドキュメント化システムが使用されている場合にのみ有効です。
reset - このメソッドが呼び出されたときに UI コンポーネントの設定値をリセットします。
commit - この方法では、UI コンポーネントから設定を収集し、それらが使用される場所にコミットする必要があります。
isModified - このメソッドが false を返すと、コミットは実行されません。これは一般的に、長期間コミット方法を使う設定ページに役立ちます。
PreferenceComponent 式
プロジェクト内の PreferenceComponent にアクセスするための式を追加しました。この概念は GetPreferencesComponentInProjectOperation と呼ばれ、project.preferenceComponent<componentName> としてアクセスできます。ここで project は IDEA プロジェクトです。使用するには、jetbrains.mps.lang.plugin.standalone 言語をインポートすることを忘れないでください。
カスタムプラグインパーツ (ProjectPlugin、ApplicationPlugin)
カスタムプラグインパーツは、プラグインの初期化時と破棄時にカスタムコードを実行します。動作はプラグインと全く同じです。言語ごとに必要な数のカスタムプラグインを作成できます。カスタムプラグインには、プロジェクトカスタムプラグインとアプリケーションカスタムプラグインの 2 種類があります。プロジェクトカスタムプラグインはプロジェクトごとに 1 回インスタンス化されますが、アプリケーションカスタムプラグインはアプリケーションごとに 1 回インスタンス化されるため、プロジェクトパラメーターは持ちません。
IdeaInitializerDescriptor
IntelliJ プラットフォームにプラグインを登録するための plugin.xml ファイルを指定する便利な方法を提供します。

名前の適切な大文字表記
多くの概念の名称プロパティは、大文字小文字の区別が適切かどうかチェックされます。選択肢は 4 つあります。
タイトルケース - デフォルト。前置詞、冠詞、助詞、接続詞は小文字にし、その他の単語は最初の文字を大文字にします。MPS は Grazie プラグインを使用して言語を検出し、検出された言語のルールを使用してテキストを解析します。または、特定のルートノードでの名前検証に使用する言語をインスペクターで明示的に指定することもできます。
文頭の格 - IntelliJ プラットフォームのルールに従う (最初の文字は必ず大文字でなければなりません。AST、DSL、MPS のようなすべて大文字の単語は許可されています。単語の一部は最初の文字が大文字でも構いません。)
継承 - 最も近い祖先である ICheckedNamePolicy の大文字小文字のルールを使用します
大文字表記のルールはありません - 値は未確認のままです
Grazie で言語をサポートするには、「設定」→「エディター」→「自然言語」で言語サポートをインストールする必要があります。英語のサポートはデフォルトでインストールされています。