when 句のコンテキスト
Visual Studio Code は、VS Code UI 上でどの要素が表示され、アクティブになっているかに応じて、さまざまなコンテキストキーと特定の値を設定します。これらのコンテキストは、拡張機能のコマンドや、メニューやビューなどの UI 要素を条件付きで有効または無効にするために使用できます。
例えば、VS Code は when 句を使用してコマンドのキーバインドを有効または無効にします。これは「デフォルトのキーバインド JSON」(基本設定: デフォルトのキーボードショートカット (JSON) を開く)で確認できます。
{ "key": "f5", "command": "workbench.action.debug.start",
"when": "debuggersAvailable && !inDebugMode" },
上記のように、組み込みのデバッグの開始コマンドには F5 というキーボードショートカットが割り当てられており、これは適切なデバッガーが利用可能であり(コンテキストキー debuggersAvailable が true)、かつエディターがデバッグモードではない(コンテキストキー inDebugMode が false)場合にのみ有効になります。
条件演算子
when 句は、1つのコンテキストキー(例: inDebugMode)で構成することも、さまざまな演算子を使用してより詳細なエディターの状態を表現することもできます。
論理演算子
論理演算子を使用すると、単純なコンテキストキーや、他の論理演算子、等価演算子、比較演算子、マッチ演算子、in/not in 演算子、または括弧で囲まれた式を含む when 句の式を組み合わせることができます。
| 演算子 | 記号 | 例 |
|---|---|---|
| 否定 (Not) | ! |
"!editorReadonly" または "!(editorReadonly || inDebugMode)" |
| 論理積 (And) | && |
"textInputFocus && !editorReadonly" |
| 論理和 (Or) | || |
"isLinux || isWindows" |
論理演算子の優先順位に関する注意: 上表は、優先順位が高いものから低いものの順に並んでいます。例
| 記述 | 解釈 |
|---|---|
!foo && bar |
(!foo) && bar |
!foo || bar |
(!foo) || bar |
foo || bar && baz |
foo || (bar && baz) |
!foo && bar || baz |
(!foo && bar) || baz |
!(foo || bar) && baz |
(変更なし) !(foo || bar) && baz |
等価演算子
コンテキストキーの値が指定された値と等しいかどうかを確認できます。右辺は値であり、コンテキストキーとして解釈されない(つまり、コンテキスト内で検索されない)ことに注意してください。
| 演算子 | 記号 | 例 |
|---|---|---|
| 等価 | == |
"editorLangId == typescript" または "editorLangId == 'typescript'" |
| 不等価 | != |
"resourceExtname != .js" または "resourceExtname != '.js'" |
注記
- 右辺の値が空白を含む文字列の場合は、シングルクォートで囲む必要があります -
"resourceFilename == 'My New File.md'"。 ===は==と同じ動作をし、!==は!=と同じ動作をします。
比較演算子
コンテキストキーの値を数値と比較できます。演算子の左辺と右辺は空白で区切る必要があることに注意してください(foo < 1 は正しいが、foo<1 は不可)。
| 演算子 | 記号 | 例 |
|---|---|---|
| より大きい (Greater than) | >, >= |
"gitOpenRepositoryCount >= 1" ("gitOpenRepositoryCount>=1" は不可) |
| より小さい (Less than) | <, <= |
"workspaceFolderCount < 2" ("workspaceFolderCount<2" は不可) |
マッチ演算子
(旧名称: キー値ペアマッチ演算子)
| 演算子 | 記号 | 例 |
|---|---|---|
| 一致 (Matches) | =~ |
"resourceScheme =~ /^untitled$|^file$/" |
when 句にはマッチ演算子 (=~) があります。式 key =~ regularExpressionLiteral は、右辺を正規表現リテラルとして扱い、左辺と照合します。例えば、すべての Docker ファイルに対してコンテキストメニュー項目を提供する場合、以下のように使用できます。
"when": "resourceFilename =~ /docker/"
注記
=~演算子の右辺は、JavaScript の正規表現リテラル(リファレンス)と同じルールに従いますが、JSON 文字列と正規表現の両方のエスケープルールに従う必要があります。例えば、サブ文字列file://に一致させるための正規表現リテラルは、JavaScript では/file:\/\//ですが、when 句では/file:\\/\\//となります。これは、JSON 文字列内でバックスラッシュをエスケープし、正規表現パターン内でスラッシュをエスケープする必要があるためです。!=~演算子は存在しませんが、マッチ式を否定することで同様のことが可能です -!(foo =~ /baz/)。
正規表現フラグ
正規表現リテラルでフラグを使用できます。例えば、resourceFilename =~ /json/i や myContextKey =~ /baz/si などです。
サポートされているフラグ: i, s, m, u。
無視されるフラグ: g, y。
'in' および 'not in' 条件演算子
when 句の in 演算子を使用すると、別のコンテキストキーの値内でコンテキストキーの値を動的に検索できます。例えば、特定の種類のファイルを含むフォルダー(または静的に判定できないもの)にコンテキストメニューコマンドを追加したい場合、in 演算子を使用して実現できます。反対の条件を確認するには not in 演算子を使用します。
| 演算子 | 記号 | 例 |
|---|---|---|
| In | in |
"resourceFilename in supportedFolders" |
| Not in | not in |
"resourceFilename not in supportedFolders" |
まず、どのフォルダーでコマンドをサポートするかを決定し、フォルダー名を配列に追加します。次に、setContext コマンドを使用して、その配列をコンテキストキーにします。
vscode.commands.executeCommand('setContext', 'ext.supportedFolders', [
'test',
'foo',
'bar'
]);
// or
// Note in this case (using an object), the value doesn't matter, it is based on the existence of the key in the object
// The value must be of a simple type
vscode.commands.executeCommand('setContext', 'ext.supportedFolders', {
test: true,
foo: 'anything',
bar: false
});
次に、package.json に explorer/context メニューの貢献を追加できます。
// Note, this assumes you have already defined a command called ext.doSpecial
"menus": {
"explorer/context": [
{
"command": "ext.doSpecial",
"when": "explorerResourceIsFolder && resourceFilename in ext.supportedFolders"
}
]
}
この例では、resourceFilename の値(この場合はフォルダー名)を取得し、ext.supportedFolders の値の中に存在するかどうかを確認しています。存在すればメニューが表示されます。この強力な演算子により、メニューやビューなど、when 句をサポートする、よりリッチで動的な貢献が可能になります。
利用可能なコンテキストキー
以下は、Boolean の true/false に評価される利用可能なコンテキストキーの一部です。
このリストはすべてではありません。他の when 句のコンテキストは、キーボードショートカットエディター(基本設定: キーボードショートカットを開く)で検索・フィルターするか、デフォルトのキーバインド JSON ファイル(基本設定: デフォルトのキーボードショートカット (JSON) を開く)を確認することで見つけることができます。また、Inspect Context Keys ユーティリティを使用して、興味のあるコンテキストキーを特定することもできます。
| コンテキスト名 | True となる条件 |
|---|---|
| エディターコンテキスト | |
editorFocus |
エディター(テキストまたはウィジェット)にフォーカスがある。 |
editorTextFocus |
エディター内のテキストにフォーカスがある(カーソルが点滅している)。 |
textInputFocus |
いずれかのエディターにフォーカスがある(通常のエディター、デバッグ REPL など)。 |
inputFocus |
いずれかのテキスト入力領域(エディターまたはテキストボックス)にフォーカスがある。 |
editorTabMovesFocus |
Tab キーでフォーカスがエディターから移動するかどうか。 |
editorHasSelection |
エディター内でテキストが選択されている。 |
editorHasMultipleSelections |
テキストの複数の領域が選択されている(マルチカーソル)。 |
editorReadonly |
エディターが読み取り専用である。 |
editorLangId |
エディターに関連付けられた言語 ID が一致する場合に true。 例: "editorLangId == typescript"。 |
isInDiffEditor |
アクティブなエディターが差分エディターである。 |
isInEmbeddedEditor |
埋め込みエディター内にフォーカスがある場合に true。 |
| オペレーティングシステムコンテキスト | |
isLinux |
OS が Linux の場合に true。 |
isMac |
OS が macOS の場合に true。 |
isWindows |
OS が Windows の場合に true。 |
isWeb |
Web からエディターにアクセスしている場合に true。 |
| リストコンテキスト | |
listFocus |
リストにフォーカスがある。 |
listSupportsMultiselect |
リストが複数選択をサポートしている。 |
listHasSelectionOrFocus |
リストに選択またはフォーカスがある。 |
listDoubleSelection |
リストで 2 つの要素が選択されている。 |
listMultiSelection |
リストで複数の要素が選択されている。 |
| モードコンテキスト | |
inSnippetMode |
エディターがスニペットモードである。 |
inQuickOpen |
クイックオープン(Quick Open)ドロップダウンにフォーカスがある。 |
| リソースコンテキスト | |
resourceScheme |
リソースの URI スキームが一致する場合に true。 例: "resourceScheme == file" |
resourceFilename |
エクスプローラーまたはエディターのファイル名が一致する場合に true。 例: "resourceFilename == gulpfile.js" |
resourceExtname |
エクスプローラーまたはエディターのファイル拡張子が一致する場合に true。 例: "resourceExtname == .js" |
resourceDirname |
エクスプローラーまたはエディターのリソースの絶対フォルダーパスが一致する場合に true。 例: "resourceDirname == /users/alice/project/src" |
resourcePath |
エクスプローラーまたはエディターのリソースの絶対パスが一致する場合に true。 例: "resourcePath == /users/alice/project/gulpfile.js" |
resourceLangId |
エクスプローラーまたはエディターのタイトルの言語 ID が一致する場合に true。 例: "resourceLangId == markdown" |
isFileSystemResource |
エクスプローラーまたはエディターのファイルが、ファイルシステムプロバイダーから処理可能なファイルシステムリソースである場合に true。 |
resourceSet |
エクスプローラーまたはエディターのファイルが設定されている場合に true。 |
resource |
エクスプローラーまたはエディターのファイルの完全な URI。 |
| エクスプローラーコンテキスト | |
explorerViewletVisible |
エクスプローラービューが表示されている場合に true。 |
explorerViewletFocus |
エクスプローラービューにキーボードフォーカスがある場合に true。 |
filesExplorerFocus |
ファイルエクスプローラーセクションにキーボードフォーカスがある場合に true。 |
openEditorsFocus |
「開いているエディター (OPEN EDITORS)」セクションにキーボードフォーカスがある場合に true。 |
explorerResourceIsFolder |
エクスプローラーでフォルダーが選択されている場合に true。 |
| エディターウィジェットコンテキスト | |
findWidgetVisible |
エディターの検索ウィジェットが表示されている。 |
suggestWidgetVisible |
補完ウィジェット(IntelliSense)が表示されている。 |
suggestWidgetMultipleSuggestions |
複数の候補が表示されている。 |
renameInputVisible |
名前変更用の入力テキストボックスが表示されている。 |
referenceSearchVisible |
参照のプレビューウィンドウ(Peek References)が開いている。 |
inReferenceSearchEditor |
参照のプレビューウィンドウのエディターにフォーカスがある。 |
config.editor.stablePeek |
プレビューエディターを開いたままにするか(editor.stablePeek 設定で制御)。 |
codeActionMenuVisible |
コードアクションメニューが表示されている。 |
parameterHintsVisible |
パラメーターヒントが表示されている(editor.parameterHints.enabled 設定で制御)。 |
parameterHintsMultipleSignatures |
複数のパラメーターヒントが表示されている。 |
| デバッガーコンテキスト | |
debuggersAvailable |
適切なデバッガー拡張機能が利用可能である。 |
inDebugMode |
デバッグセッションが実行中である。 |
debugState |
アクティブなデバッガーの状態。 可能な値: inactive, initializing, stopped, running。 |
debugType |
デバッグタイプが一致する場合に true。 例: "debugType == 'node'"。 |
inDebugRepl |
デバッグコンソールの REPL にフォーカスがある。 |
| 統合ターミナルコンテキスト | |
terminalFocus |
統合ターミナルにフォーカスがある。 |
terminalIsOpen |
統合ターミナルが開いている。 |
| タイムラインビューコンテキスト | |
timelineFollowActiveEditor |
タイムラインビューがアクティブなエディターに追従している場合に true。 |
| タイムラインビューアイテムコンテキスト | |
timelineItem |
タイムラインアイテムのコンテキスト値が一致する場合に true。 例: "timelineItem =~ /git:file:commit\\b/"。 |
| 拡張機能コンテキスト | |
extension |
拡張機能の ID が一致する場合に true。 例: "extension == eamodio.gitlens"。 |
extensionStatus |
拡張機能がインストールされている場合に true。 例: "extensionStatus == installed"。 |
extensionHasConfiguration |
拡張機能に設定がある場合に true。 |
| グローバル UI コンテキスト | |
notificationFocus |
通知にキーボードフォーカスがある。 |
notificationCenterVisible |
通知センターが VS Code の右下に表示されている。 |
notificationToastsVisible |
通知トーストが VS Code の右下に表示されている。 |
searchViewletVisible |
検索ビューが開いている。 |
sideBarVisible |
サイドバーが表示されている。 |
sideBarFocus |
サイドバーにフォーカスがある。 |
panelFocus |
パネルにフォーカスがある。 |
inZenMode |
ウィンドウが Zen モードである。 |
isCenteredLayout |
エディターが中央レイアウトモードである。 |
workbenchState |
empty, folder(フォルダー 1 つ), workspace のいずれか。 |
workspaceFolderCount |
ワークスペースフォルダーの数。 |
replaceActive |
検索ビューの「置換」テキストボックスが開いている。 |
view |
view/title および view/item/context 用。コマンドを表示するビュー。例: "view == myViewsExplorerID"。 |
viewItem |
view/item/context 用。ツリーアイテムからの contextValue。例: "viewItem == someContextValue"。 |
webviewId |
webview/context 用。コマンドを表示する Webview ID。例: "webviewId == catCoding"。 |
isFullscreen |
ウィンドウがフルスクリーンモードである場合に true。 |
focusedView |
現在フォーカスがあるビューの識別子。 |
canNavigateBack |
戻る操作が可能である場合に true。 |
canNavigateForward |
進む操作が可能である場合に true。 |
canNavigateToLastEditLocation |
最後に編集した場所への移動が可能である場合に true。 |
| グローバルエディター UI コンテキスト | |
textCompareEditorVisible |
少なくとも 1 つの差分(比較)エディターが表示されている。 |
textCompareEditorActive |
差分(比較)エディターがアクティブである。 |
editorIsOpen |
エディターが 1 つ開いている場合に true。 |
groupEditorsCount |
グループ内のエディターの数。 |
activeEditorGroupEmpty |
アクティブなエディターグループにエディターがない場合に true。 |
activeEditorGroupIndex |
エディターグリッド内のエディターグループの位置を示す 1 から始まる数値。インデックス 1 のグループは、左上隅にある最初のグループとなります。 |
activeEditorGroupLast |
エディターグリッド内の最後のエディターグループである場合に true となります。 |
multipleEditorGroups |
複数のエディターグループが存在する場合に true。 |
activeEditor |
グループ内のアクティブなエディターの識別子。 |
activeEditorIsDirty |
グループ内のアクティブなエディターが未保存の状態(dirty)である場合に true。 |
activeEditorIsNotPreview |
グループ内のアクティブなエディターがプレビューモードではない場合に true。 |
activeEditorIsPinned |
グループ内のアクティブなエディターがピン留めされている場合に true。 |
inSearchEditor |
検索エディター内にフォーカスがある場合に true。 |
activeWebviewPanelId |
現在アクティブな Webview パネルの ID。 |
activeCustomEditorId |
現在アクティブな カスタムエディターの ID。 |
| 構成設定コンテキスト | |
config.editor.minimap.enabled |
設定 editor.minimap.enabled が true である場合に true。 |
注意: ブール値に評価されるすべてのユーザー設定またはワークスペース設定は、
"config."プレフィックスを付けることでここで使用できます。
表示/フォーカスされたビューの when 句コンテキスト
特定のビューが表示されているか、フォーカスされているかを確認する when 句を作成できます。
| コンテキスト名 | True となる条件 |
|---|---|
view.${viewId}.visible |
特定のビューが表示されている場合に true。 例: "view.workbench.explorer.fileView.visible" |
focusedView |
特定のビューにフォーカスがある場合に true。 例: "focusedView == 'workbench.explorer.fileView'" |
ビューの識別子
workbench.explorer.fileView- ファイルエクスプローラーworkbench.explorer.openEditorsView- 開いているエディターoutline- アウトラインビューtimeline- タイムラインビューworkbench.scm- ソース管理workbench.scm.repositories- ソース管理リポジトリworkbench.debug.variablesView- 変数workbench.debug.watchExpressionsView- ウォッチworkbench.debug.callStackView- コールスタックworkbench.debug.loadedScriptsView- ロードされたスクリプトworkbench.debug.breakPointsView- ブレークポイントworkbench.debug.disassemblyView- 逆アセンブリworkbench.views.extensions.installed- インストール済みの拡張機能extensions.recommendedList- 推奨される拡張機能workbench.panel.markers.view- 問題workbench.panel.output- 出力workbench.panel.repl.view- デバッグコンソールterminal- 統合ターミナルworkbench.panel.comments- コメント
表示されているビューコンテナーの when 句コンテキスト
特定のビューコンテナーが表示されているかを確認する when 句を作成できます。
| コンテキスト名 | True となる条件 |
|---|---|
activeViewlet |
サイドバーでビューコンテナーが表示されている場合に true。 例: "activeViewlet == 'workbench.view.explorer'" |
activePanel |
パネルでビューコンテナーが表示されている場合に true。 例: "activePanel == 'workbench.panel.output'" |
activeAuxiliary |
セカンダリサイドバーでビューコンテナーが表示されている場合に true。 例: "activeAuxiliary == 'workbench.view.debug'" |
ビューコンテナーの識別子
workbench.view.explorer- ファイルエクスプローラーworkbench.view.search- 検索workbench.view.scm- ソース管理workbench.view.debug- 実行workbench.view.extensions- 拡張機能workbench.panel.markers- 問題workbench.panel.output- 出力workbench.panel.repl- デバッグコンソールterminal- 統合ターミナルworkbench.panel.comments- コメント
特定のビューコンテナーにフォーカスがある場合にのみ有効な when 句を作成したい場合は、sideBarFocus, panelFocus, auxiliaryBarFocus を activeViewlet, activePanel, activeAuxiliary コンテキストキーと組み合わせて使用します。
例えば、以下の when 句は、ファイルエクスプローラーにフォーカスがある場合にのみ true となります。
"sideBarFocus && activeViewlet == 'workbench.view.explorer'"
when 句での設定の確認
when 句では、config. をプレフィックスとして付けることで、構成(設定)値を参照できます(例: config.editor.tabCompletion や config.breadcrumbs.enabled)。
カスタム when 句コンテキストの追加
独自の VS Code 拡張機能を作成しており、既存のキーでは不十分で、when 句コンテキストを使用してコマンド、メニュー、ビューを有効/無効にする必要がある場合は、setContext コマンドを使用して独自のコンテキストキーを追加できます。
以下の最初の例では、キー myExtension.showMyCommand を true に設定しており、これはコマンドの有効化や when プロパティで使用できます。2 番目の例では、開いているクールなものの数が 2 より多いかどうかを確認する際に when 句で使用できる値を保存しています。
vscode.commands.executeCommand('setContext', 'myExtension.showMyCommand', true);
vscode.commands.executeCommand('setContext', 'myExtension.numberOfCoolOpenThings', 4);
Inspect Context Keys ユーティリティ
現在アクティブなすべてのコンテキストキーを実行時に確認したい場合は、コマンドパレットから Developer: Inspect Context Keys コマンドを使用できます(⇧⌘P (Windows, Linux Ctrl+Shift+P))。Inspect Context Keys は、コンテキストキーとその値を VS Code 開発者ツールのコンソール (Console) タブ(ヘルプ > 開発者ツールの切り替え)に表示します。
Developer: Inspect Context Keys を実行すると、カーソルで VS Code UI の要素を強調表示できます。要素をクリックすると、現在のコンテキストキーとその状態がオブジェクトとしてコンソールに出力されます。

アクティブなコンテキストキーのリストは非常に広範囲であり、インストールしている拡張機能からのカスタムコンテキストキーが含まれる場合があります。
注意: 一部のコンテキストキーは VS Code 内部用であり、将来変更される可能性があります。