VS Codeのエージェントモードを拡張するには、を試してください!

変数の参照

Visual Studio Code は、デバッグおよびタスク構成ファイル、および一部の選択された設定で変数の置換をサポートしています。変数の置換は、launch.json および tasks.json ファイルの一部のキーおよび値の文字列内で ${variableName} 構文を使用することでサポートされます。

定義済み変数

以下の定義済み変数がサポートされています

変数 説明
${userHome} ユーザーのホームフォルダーのパス
${workspaceFolder} VS Code で開かれたフォルダーのパス
${workspaceFolderBasename} VS Code で開かれたフォルダーの名前 (スラッシュ (/) なし)
${file} 現在開いているファイル
${fileWorkspaceFolder} 現在開いているファイルのワークスペースフォルダー
${relativeFile} workspaceFolder に対する現在開いているファイルの相対パス
${relativeFileDirname} workspaceFolder に対する現在開いているファイルの dirname の相対パス
${fileBasename} 現在開いているファイルの basename
${fileBasenameNoExtension} 現在開いているファイルの basename (拡張子なし)
${fileExtname} 現在開いているファイルの拡張子
${fileDirname} 現在開いているファイルのフォルダーパス
${fileDirnameBasename} 現在開いているファイルのフォルダー名
${cwd} VS Code の起動時のタスクランナーの現在の作業ディレクトリ
${lineNumber} アクティブなファイルで現在選択されている行番号
${columnNumber} アクティブなファイルで現在選択されている列番号
${selectedText} アクティブなファイルで現在選択されているテキスト
${execPath} 実行中の VS Code 実行可能ファイルへのパス
${defaultBuildTask} デフォルトのビルドタスクの名前
${pathSeparator} オペレーティングシステムがファイルパスのコンポーネントを区切るために使用する文字
${/} ${pathSeparator} の省略形

定義済み変数の例

次の条件があると仮定します

  1. エディターで /home/your-username/your-project/folder/file.ext にあるファイルが開かれている;
  2. ルートワークスペースとしてディレクトリ /home/your-username/your-project が開かれている。

これにより、各変数に次の値が割り当てられます

  • ${userHome}: /home/your-username
  • ${workspaceFolder}: /home/your-username/your-project
  • ${workspaceFolderBasename}: your-project
  • ${file}: /home/your-username/your-project/folder/file.ext
  • ${fileWorkspaceFolder}: /home/your-username/your-project
  • ${relativeFile}: folder/file.ext
  • ${relativeFileDirname}: folder
  • ${fileBasename}: file.ext
  • ${fileBasenameNoExtension}: file
  • ${fileExtname}: .ext
  • ${fileDirname}: /home/your-username/your-project/folder
  • ${fileDirnameBasename}: folder
  • ${lineNumber}: カーソルの行番号
  • ${columnNumber}: カーソルの列番号
  • ${selectedText}: コードエディターで選択されたテキスト
  • ${execPath}: Code.exe の場所
  • ${pathSeparator}: macOS または Linux では /、Windows では \
ヒント

tasks.json および launch.json の文字列値内で IntelliSense を使用して、定義済み変数の完全なリストを取得します。

ワークスペースフォルダーごとにスコープが設定された変数

ルートフォルダーの名前を (コロンで区切って) 変数に追加することで、ワークスペースの兄弟ルートフォルダーにアクセスできます。ルートフォルダー名がない場合、変数は使用されているのと同じフォルダーにスコープが設定されます。

たとえば、ServerClient フォルダーを持つマルチルートワークスペースでは、${workspaceFolder:Client}Client ルートのパスを参照します。

環境変数

環境変数は ${env:Name} 構文で参照できます。たとえば、${env:USERNAME}USERNAME 環境変数を参照します。

{
  "type": "node",
  "request": "launch",
  "name": "Launch Program",
  "program": "${workspaceFolder}/app.js",
  "cwd": "${workspaceFolder}",
  "args": ["${env:USERNAME}"]
}

構成変数

VS Code の設定 (構成) を参照するには、${config:Name} 構文を使用します。たとえば、${config:editor.fontSize}editor.fontSize 設定を参照します。

コマンド変数

任意の VS Code コマンドを ${command:commandID} 構文で変数として使用できます。

コマンド変数は、コマンド評価の結果 (文字列) に置き換えられます。コマンドの実装は、UI を使用しない単純な計算から、VS Code の拡張 API を介して利用できる UI 機能に基づく洗練された機能までさまざまです。コマンドが文字列以外のものを返した場合、変数置換は完了しません。コマンド変数は必ず文字列を返す必要があります。

この機能の例として、VS Code の Node.js デバッガー拡張機能があります。これは、すべての実行中の Node.js プロセスから単一のプロセスを選択するためのインタラクティブなコマンド extension.pickNodeProcess を提供します。コマンドは、選択されたプロセスのプロセス ID を返します。これにより、extension.pickNodeProcess コマンドをプロセス ID でアタッチ起動構成で次のように使用できます

{
  "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "Attach by Process ID",
      "processId": "${command:extension.pickNodeProcess}"
    }
  ]
}

launch.json 構成でコマンド変数を使用する場合、囲んでいる launch.json 構成は引数を介してコマンドにオブジェクトとして渡されます。これにより、コマンドは呼び出されたときに特定の launch.json 構成のコンテキストとパラメーターを認識できます。

入力変数

コマンド変数はすでに強力ですが、特定のユースケースで実行されるコマンドを構成するメカニズムがありません。たとえば、一般的な「ユーザー入力プロンプト」にプロンプトメッセージデフォルト値を渡すことはできません。

この制限は、入力変数 (構文は ${input:variableID}) で解決されます。variableID は、launch.json および tasks.jsoninputs セクションのエントリを参照し、そこで追加の構成属性が指定されます。入力変数のネストはサポートされていません。

次の例は、入力変数を使用する tasks.json の全体的な構造を示しています

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "task name",
      "command": "${input:variableID}"
      // ...
    }
  ],
  "inputs": [
    {
      "id": "variableID",
      "type": "type of input variable"
      // type specific configuration attributes
    }
  ]
}

現在、VS Code は次の 3 種類の入力変数をサポートしています

  • promptString: ユーザーから文字列を取得するための入力ボックスを表示します。
  • pickString: ユーザーがいくつかのオプションから選択できるようにクイックピックドロップダウンを表示します。
  • command: 任意のコマンドを実行します。

各タイプには追加の構成属性が必要です

promptString:

  • description: クイック入力に表示され、入力のコンテキストを提供します。
  • default: ユーザーが何も入力しなかった場合に使用されるデフォルト値。
  • password: 入力値を表示しないパスワードプロンプトで入力するには true に設定します。

pickString:

  • description: クイックピックに表示され、入力のコンテキストを提供します。
  • options: ユーザーが選択できるオプションの配列。
  • default: ユーザーが何も入力しなかった場合に使用されるデフォルト値。これはオプションの値のいずれかである必要があります。

オプションは文字列値、またはラベルと値の両方を持つオブジェクトにすることができます。ドロップダウンにはラベル: 値が表示されます。

コマンド:

  • command: 変数補間時にコマンドを実行します。
  • args: コマンドの実装に渡されるオプションのオプションバッグ。

以下は、Angular CLI を使用した inputs の使用法を示す tasks.json の例です

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "ng g",
      "type": "shell",
      "command": "ng",
      "args": ["g", "${input:componentType}", "${input:componentName}"]
    }
  ],
  "inputs": [
    {
      "type": "pickString",
      "id": "componentType",
      "description": "What type of component do you want to create?",
      "options": [
        "component",
        "directive",
        "pipe",
        "service",
        "class",
        "guard",
        "interface",
        "enum"
      ],
      "default": "component"
    },
    {
      "type": "promptString",
      "id": "componentName",
      "description": "Name your component.",
      "default": "my-new-component"
    }
  ]
}

例の実行

Inputs Example

次の例は、特定のフォルダーで見つかったすべてのテストケースのリストからユーザーがテストケースを選択できるようにするデバッグ構成で、command 型のユーザー入力変数を使用する方法を示しています。何らかの拡張機能が、構成可能な場所にあるすべてのテストケースを特定し、それらのいずれかを選択するためのピッカー UI を表示する extension.mochaSupport.testPicker コマンドを提供していると仮定します。コマンド入力の引数は、コマンド自体によって定義されます。

{
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Run specific test",
      "program": "${workspaceFolder}/${input:pickTest}"
    }
  ],
  "inputs": [
    {
      "id": "pickTest",
      "type": "command",
      "command": "extension.mochaSupport.testPicker",
      "args": {
        "testFolder": "/out/tests"
      }
    }
  ]
}

コマンド入力はタスクでも使用できます。この例では、組み込みのタスク終了コマンドが使用されています。すべてのタスクを終了するための引数を受け入れることができます。

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Terminate All Tasks",
      "command": "echo ${input:terminate}",
      "type": "shell",
      "problemMatcher": []
    }
  ],
  "inputs": [
    {
      "id": "terminate",
      "type": "command",
      "command": "workbench.action.tasks.terminate",
      "args": "terminateAll"
    }
  ]
}

よくある質問

デバッグ構成またはタスクにおける変数置換の詳細

デバッグ構成またはタスクにおける変数置換は 2 パスのプロセスです

  • 最初のパスでは、すべての変数が文字列の結果に評価されます。変数が複数回出現する場合でも、1 回だけ評価されます。
  • 2 番目のパスでは、すべての変数が最初のパスの結果に置換されます。

この結果、変数の評価 (たとえば、拡張機能で実装されたコマンドベースの変数) は、デバッグ構成またはタスクの他の置換された変数にアクセスできません。元の変数のみを参照します。これは、変数が互いに依存できないことを意味します (これにより分離が保証され、置換が評価順序に対して堅牢になります)。

ユーザーおよびワークスペース設定で変数置換はサポートされていますか?

定義済み変数は、settings.json ファイルの一部の設定キー (ターミナルの cwdenvshellshellArgs の値など) でサポートされています。window.title のような一部の設定には、独自の変数があります。

  "window.title": "${dirty}${activeEditorShort}${separator}${rootName}${separator}${appName}"

設定エディターのコメント (⌘, (Windows, Linux Ctrl+,)) を参照して、設定固有の変数について学習してください。

なぜ ${workspaceRoot} は文書化されていないのですか?

変数 ${workspaceRoot} は、マルチルートワークスペースのサポートとの整合性を高めるために、${workspaceFolder} の採用により非推奨となりました。

tasks.json の変数が解決されないのはなぜですか?

tasks.json のすべての値が変数置換をサポートしているわけではありません。具体的には、commandargsoptions のみが変数置換をサポートしています。inputs セクションの入力変数は、入力変数のネストがサポートされていないため解決されません。

変数の実際の値を知るにはどうすればよいですか?

変数の実行時値を確認する簡単な方法の 1 つは、VS Code タスクを作成して、変数の値をコンソールに出力することです。たとえば、${workspaceFolder} の解決された値を確認するには、tasks.json で次の簡単な「echo」タスクを作成して実行します (ターミナル > タスクの実行)。

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "echo",
      "type": "shell",
      "command": "echo ${workspaceFolder}"
    }
  ]
}