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

変数の参照

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

事前定義済み変数

次の事前定義済み変数がサポートされています

変数 説明
${userHome} ユーザーのホームフォルダーへのパス
${workspaceFolder} VS Code で開いているフォルダーへのパス
${workspaceFolderBasename} VS Code で開いているフォルダーの名前 (スラッシュなし)
${file} 現在開いているファイル
${fileWorkspaceFolder} 現在開いているファイルのワークスペースフォルダー
${relativeFile} 現在開いているファイル (workspaceFolder からの相対パス)
${relativeFileDirname} 現在開いているファイルの dirname (workspaceFolder からの相対パス)
${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 を返します。これにより、プロセス ID でアタッチ起動構成で extension.pickNodeProcess コマンドを次のように使用できます。

{
  "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: ユーザーが別の値を入力しなかった場合に使用されるデフォルト値。これはオプション値のいずれかである必要があります。

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

コマンド:

  • 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 のユーザー入力変数を使用する方法を示しています。ある拡張機能が、構成可能な場所にあるすべてのテストケースを見つけ、そのうちの1つを選択するためのピッカー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番目のパスでは、すべての変数が最初のパスの結果に置き換えられます。

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

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

事前定義済み変数は、ターミナルの cwdenvshellshellArgs の値など、settings.json ファイル内の限られた数の設定キーでサポートされています。一部の設定、たとえば window.title には独自の変数があります。

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

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

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

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

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

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

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

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

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