言語と参照のインジェクション
言語インジェクションを使用すると、ファイルのメイン言語とは異なるプログラミング言語のコードを操作できます。
文字列リテラルに言語 (HTML、CSS、XML、RegExp など) を挿入すると、それがプロジェクトのメイン言語でなくても、挿入されたコードに対する包括的なコーディング支援が得られます。
IDE は、言語インジェクションに加えて、文字列リテラルをクラスやファイルなどの他のエンティティへの参照として扱う参照インジェクションもサポートしています。
言語インジェクションを追加する
一時的な言語インジェクションを追加する
言語を挿入したい文字列リテラル、タグ、属性内にキャレットを配置して Alt+Enter を押す(または インテンションアクション アイコン
を使用する)。
言語または参照の挿入 を選択し、インジェクションする言語を選択します。

永続的な言語インジェクションを追加する
言語インジェクションコメント (アノテーション) を使用して、インジェクションされた言語の永続的なフラグメントを追加します。
ターゲット文字列リテラルの前に空白行を追加し、次のコメントを入力する:
# language=<language_ID>
コメントは、インジェクションしたい言語のコメント構文ではなく、追加先のファイルのコメント構文で記述してください。 言語 ID は、たとえばインジェクション可能な言語のリストなどで PyCharm が表示する言語名とは異なる場合があります。
言語 ID を確認するには、コメント内の
language=の後にキャレットを置き、 Ctrl+Space を押します。 補完リストには、すべてのインジェクション可能な言語の ID が、丸括弧内の言語名とともに表示されます。設定で言語 ID を確認することもできます。 Ctrl+Alt+S を押して設定を開き、 を選択します。 言語のインジェクションルールをダブルクリックすると、言語 ID が ID フィールドに指定されます。
(オプション) コメントに接頭辞または接尾辞を含めます。
# language=<language_ID> prefix=<prefix> suffix=<suffix>これは次の場合に必要です:
文字列は不完全 / 部分的な SQL 文です
文字列は、サポートされている呼び出し(
select /where)など)で直接使用されていません。
挿入された言語フラグメントを編集する
PyCharm では、インジェクトされた言語フラグメントを専用エディターで編集できます。
フラグメントエディターを開く
挿入されたコード部分内にキャレットを配置し、 Alt+Enter を押す(または インテンションアクション アイコン
を使用する)。
<language ID> フラグメントを編集 を選択します。
PyCharm は、インジェクトされた言語でコードを編集するための専用エディターセクションを開きます。 このエディターは、コード補完、インスペクション、インテンションアクション、コードスタイルアクションを含む完全なコーディング支援機能を提供する。

参照を挿入する
参照インジェクションは、文字列リテラルをファイルなどの他のエンティティへのリンクとして解釈します。
例: resources/settings.yaml はファイルへの参照として扱うことができます。
一時的な参照インジェクションを追加する
参照を挿入したい文字列リテラル内にキャレットを配置し、 Alt+Enter を押す(または インテンションアクション アイコン
を使用する)。
言語または参照の挿入 を選択し、オプションを選択します。 例: ファイル参照 は指定されたファイルへのリンクを追加します。
インストールしたプラグインによっては、他の参照オプションが利用できる場合があります。

永続的な参照インジェクションを追加する
コメントを使用して永続的な参照インジェクションを追加します。
ターゲット文字列リテラルの前に空白行を追加し、必要な値を含む # language= コメントを入力します。
例: # language=file-reference はファイルへの参照を追加します:
インジェクションをキャンセルする
永続的な言語インジェクションをキャンセルする
言語インジェクションをキャンセルするには、それを導入するために使用したコメント (アノテーション) を削除します。
一時的な言語挿入をキャンセルする
キャレットをコード断片に配置し、 Alt+Enter を押す(または インテンションアクション アイコン
を使用する)。
言語または参照の挿入解除 を選択します。
インテンションアクションバルブアイコンを無効にする
エディターでインテンションアクションアイコン を非表示にするには、次の手順を実行します。
Ctrl+Alt+S を押して設定を開き、 を選択します。
インテンションバルブを表示する チェックボックスをクリアします。
変更を適用して、ダイアログを閉じます。
自動インジェクションのルールを構成する
PyCharm には、IDE がコード内の特定の場所に言語を自動的に挿入するための事前定義ルールのセットがあります。
エディター | 言語インジェクション 設定ページ Ctrl+Alt+S で言語インジェクションルールを設定できます。

定義済みのすべてのインジェクションルールは ビルトイン スコープ用に設定されています。 言い換えると、これらはグローバル(したがってすべての PyCharm プロジェクトで利用できます)。 カスタムルールは IDE または 1 つのプロジェクトに対してのみ設定できます。 カスタムインジェクションの範囲を変更するには、 を使用してください。
VCS を介してカスタムルールを共有するには、ツールバーの対応するオプションを使用して、カスタムルールを プロジェクト スコープに移動します。 そうすることで、バージョン管理下に置くことができるカスタムルールを使用して IntelliLang.xml という名前の新しいファイルを .idea ディレクトリに作成します。
VCS を使用しない場合は、ルールを XML ファイルにエクスポートして (ツールバーの をクリック)、別のプロジェクトにインポートすることで、ルールを共有できます。
カスタムインジェクションルールを構成する
次のいずれかを実行します:
新しいルールを作成するには、ツールバーの
をクリックし、ルールを適用するコンテキストを選択します。たとえば、Python 文字列リテラルの場合は 汎用 Python を選択します。
既存のルールを編集するには、そのルールを選択し、ツールバーの
をクリックします。
既存のルールに基づいてルールを作成するには、ベースルールを選択し、ツールバーの
複製 をクリックしてから、コピーを選択し、ツールバーの
編集 をクリックします。
言語インジェクション設定 ダイアログが開きます。 ダイアログ内のコントロールは、選択したインジェクションタイプによって異なります。
インジェクションする言語の ID または名前を指定します。
必要に応じて、プレフィックスとサフィックス、つまりインジェクションの前後に追加する文字シーケンスを指定します。 不完全なフラグメントをラップするために必要になる場合があります。 次のコード箇所があるとします。
condition = "WHERE id = ?"この文字列に SQL をインジェクションするには、プレフィックスとして
SELECT * FROM usersの後にスペースを指定し、インジェクションされたフラグメントが完全な SQL ステートメントになるようにします。 または、インジェクションされる言語としてJSON (JSON)を選択した場合は、プレフィックスとして{、サフィックスとして}を指定できます。ルールタイプに応じて、 配置パターン または テンプレートタグ フィールドに、PyCharm にリテラルをインジェクションとして認識させたいコンテキストを定義するルールを入力します。 ルールは、関数の引数、変数イニシャライザーなどをターゲットにできます。
psiElement()やstring()などのプラットフォームパターンに加えて、次の Python 固有のパターンを使用できます:pyLiteralExpression(): 文字列リテラルなどのリテラル式に一致します。pyStringLiteralMatches("regexp"): 値に指定された正規表現と一致するものが含まれる文字列リテラルに一致します。 一致では大文字と小文字が区別されず、.は改行にも一致します。 Docstring と 10,000 文字以上の文字列リテラルは照合されません。pyArgument("function_name", index): 指定された名前の関数またはメソッドへの呼び出しの引数に一致します。indexは引数のゼロベースの位置です。 PyCharm は関数名を呼び出し内の名前と比較し、関数を解決しません。pyModuleFunctionArgument("function_name", index, "module_name"): 指定されたモジュールのトップレベルで定義されている関数への呼び出しの引数に一致します。module_nameは、モジュールの修飾名ではなく、拡張子を除いたモジュールファイルの名前です。 たとえば、 mypkg/db_utils.py の場合はdb_utilsを指定します。pyMethodArgument("method_name", index, "class_qualified_name"): 指定された修飾名を持つクラスで定義されているメソッドへの呼び出しの引数に一致します。 継承されたメソッドの場合は、それを定義しているクラスを指定します。 PyCharm はオブジェクトの推論される型によって呼び出しを解決するため、不明な型のオブジェクトに対する呼び出しは一致しません。
pyArgument()、pyModuleFunctionArgument()、pyMethodArgument()パターンは、execute(sql="...")などのキーワード引数には一致しません。条件を組み合わせるには、
.and()を使用します。例:
SELECTで始まる文字列リテラルに言語をインジェクトします:pyStringLiteralMatches("^\\s*SELECT\\s")executeという名前の関数またはメソッドへの任意の呼び出しの最初の引数に言語をインジェクトします:pyLiteralExpression().and(pyArgument("execute", 0))db_utils.py で定義されている
run_query()関数の最初の引数に言語をインジェクトします:pyModuleFunctionArgument("run_query", 0, "db_utils")myapp/db.py で定義されている
リポジトリクラスのquery()メソッドの最初の引数に言語をインジェクトします:pyMethodArgument("query", 0, "myapp.db.Repository")ルールは プログラム構造インターフェースパターンから構築されており、実際には内部 PyCharm 言語のメソッドの連鎖呼び出しです。 プログラム構造インターフェースは、PyCharm が扱うようにファイルの構造を示します。
定義済みのインジェクションルールを編集する場合、パターンはすでに指定されています。 これにより、生産性と使いやすさが向上します。 新しい設定を作成するよりも、これらの設定を利用することをお勧めします。
オプション:
拡張生 advanced 領域で、インジェクションルールを適用できるコンテキストを絞り込むための追加設定を指定し、インジェクションプロセスをより細かく制御できるようにします。
値パターン フィールドに、言語をインジェクションするコンテキストを決定する正規表現を入力します。 パターンの最初のキャプチャーグループを挿入対象として使用することで、特定のパターンに一致する値、パターンに一致する複数の部分にのみ言語を挿入するように手順を構成できます。
たとえば、
^javascript:(.*)は、JavaScript コードの実行にハイパーリンク href で使用できるjavascriptプロトコルに一致します。単一ファイル - このオプションがオフの場合、値のパターンに一致するフラグメントは、たとえばフラグメントエディターの観点から、別々の「ファイル」として別々に扱われます。
このオプションがオンの場合、対応するフラグメントはすべてマージされて単一のユニット、つまり「ファイル」になります。
値のパターンを考える
xxx (.+) yyy (.+) zzzそしてフラグメント
xxx select * yyy from family zzz,このオプションがオフの場合、
select *とfrom familyは 2 つの独立したフラグメント(または「ファイル」)として扱われます。 このオプションがオンの場合、select * from familyは単一のユニットまたは「ファイル」として扱われます。
XML タグ と XML 属性 のインジェクションルールについては、 言語インジェクション設定ダイアログ: XML タグの挿入 と 言語インジェクション設定ダイアログ: XML 属性の挿入 を参照してください。
汎用 Python のインジェクションルールと Python 固有の場所パターンについては、 言語インジェクション設定ダイアログ: 汎用 Python を参照してください。