🚀 VS Code で を入手しましょう!

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 句は、コンテキストキー (たとえば、inDebugMode) で構成することも、さまざまな演算子を使用して、より微妙なエディターの状態を表現することもできます。

論理演算子

論理演算子を使用すると、単純なコンテキストキー、または他の論理演算子、等価演算子、比較演算子、一致演算子、in/not in 演算子、または括弧で囲まれた式を含む when 句式を組み合わせることができます。

演算子 記号
否定 ! "!editorReadonly" または "!(editorReadonly || inDebugMode)"
論理積 && "textInputFocus && !editorReadonly"
論理和 || "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 は不可)。

演算子 記号
より大きい >, >= "gitOpenRepositoryCount >= 1" ("gitOpenRepositoryCount>=1" は不可)
より小さい <, <= "workspaceFolderCount < 2" ("workspaceFolderCount<2" は不可)

一致演算子

(旧名: キーと値のペア一致演算子)

演算子 記号
一致 =~ "resourceScheme =~ /^untitled$|^file$/"

when 句には一致演算子 (=~) があります。式 key =~ regularExpressionLiteral は、右辺を左辺と照合する正規表現リテラルとして扱います。たとえば、すべての Docker ファイルのコンテキストメニュー項目を提供するには、次のように使用できます。

   "when": "resourceFilename =~ /docker/"

  • =~ 演算子の右辺は、JavaScript の正規表現リテラル (リファレンス) と同じルールに従いますが、文字は JSON 文字列と正規表現の両方のエスケープルールに従う必要があります。たとえば、サブ文字列 file:// に一致する正規表現リテラルは、JavaScript では /file:\/\// ですが、when 句では /file:\\/\\// になります。これは、JSON 文字列ではバックスラッシュをエスケープする必要があり、正規表現パターンではスラッシュをエスケープする必要があるためです。
  • !=~ 演算子は存在しませんが、一致式を否定することはできます - !(foo =~ /baz/)

正規表現フラグ

正規表現リテラルでフラグを使用できます。たとえば、resourceFilename =~ /json/imyContextKey =~ /baz/si などです。

サポートされているフラグ: ismu

無視されるフラグ: gy

'in' および 'not in' 条件演算子

when 句の in 演算子を使用すると、別のコンテキストキーの値内でコンテキストキーの値を動的に検索できます。たとえば、特定の種類のファイルを含むフォルダー (または静的に認識できないもの) にコンテキストメニューコマンドを追加する場合、in 演算子を使用して実現できます。not in 演算子を使用して、反対の条件を確認できます。

演算子 記号
包含 in "resourceFilename in supportedFolders"
非包含 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)]) を確認することで見つけることができます。また、コンテキストキーの検査ユーティリティを使用して、関心のあるコンテキストキーを特定することもできます。

コンテキスト名 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 クイックオープン ドロップダウンがフォーカスされている場合。
リソースコンテキスト
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 [開いているエディター] セクションにキーボードフォーカスがある場合に true。
explorerResourceIsFolder エクスプローラーでフォルダーが選択されている場合に true。
エディターウィジェットのコンテキスト
findWidgetVisible エディター検索ウィジェットが表示されている場合。
suggestWidgetVisible サジェストウィジェット (IntelliSense) が表示されている場合。
suggestWidgetMultipleSuggestions 複数のサジェストが表示されている場合。
renameInputVisible [名前の変更] 入力テキストボックスが表示されている場合。
referenceSearchVisible [参照のピーク] ピークウィンドウが開いている場合。
inReferenceSearchEditor [参照のピーク] ピークウィンドウエディターがフォーカスされている場合。
config.editor.stablePeek ピークエディターを開いたままにする ([editor.stablePeek] 設定で制御)。
codeActionMenuVisible コードアクションメニューが表示されている場合。
parameterHintsVisible パラメーターヒントが表示されている場合 ([editor.parameterHints.enabled] 設定で制御)。
parameterHintsMultipleSignatures 複数のパラメーターヒントが表示されている場合。
デバッガーのコンテキスト
debuggersAvailable 適切なデバッガー拡張機能が利用可能な場合。
inDebugMode デバッグセッションが実行中の場合。
debugState アクティブなデバッガーの状態。
使用可能な値は、inactiveinitializingstoppedrunning です。
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 emptyfolder (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 グループ内のアクティブなエディターがダーティの場合に true。
activeEditorIsNotPreview グループ内のアクティブなエディターがプレビューモードではない場合に true。
activeEditorIsPinned グループ内のアクティブなエディターがピン留めされている場合に true。
inSearchEditor フォーカスが検索エディター内にある場合に true。
activeWebviewPanelId 現在アクティブな webview パネルの ID。
activeCustomEditorId 現在アクティブな カスタムエディターの ID。
構成設定コンテキスト
config.editor.minimap.enabled 設定 editor.minimap.enabledtrue の場合に 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 または auxiliaryBarFocusactiveViewlet または activePanel または activeAuxiliary コンテキストキーと組み合わせて使用します。

たとえば、次の when 句は、ファイルエクスプローラーがフォーカスされている場合にのみ true になります。

"sideBarFocus && activeViewlet == 'workbench.view.explorer'"

when 句で設定を確認する

when 句では、config.editor.tabCompletionconfig.breadcrumbs.enabled など、構成 (設定) 値を参照するには、先頭に config. を付けます。

カスタム 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);

コンテキストキーの検査ユーティリティ

実行時に現在アクティブなすべてのコンテキストキーを確認する場合は、コマンドパレットから [開発者: コンテキストキーの検査] コマンド (⇧⌘P (Windows、Linux Ctrl+Shift+P)) を使用できます。[コンテキストキーの検査] を実行すると、コンテキストキーとその値が VS Code 開発者ツールの [コンソール] タブ ([ヘルプ] > [開発者ツールの切り替え]) に表示されます。

[開発者: コンテキストキーの検査] を実行すると、カーソルが VS Code UI の要素を強調表示し、要素をクリックすると、現在のコンテキストキーとその状態がオブジェクトとしてコンソールに出力されます。

Inspect Context Keys output

アクティブなコンテキストキーのリストは広範囲にわたっており、インストールした拡張機能からのカスタムコンテキストキーが含まれている場合があります。

: 一部のコンテキストキーは VS Code 内部で使用するためのものであり、将来変更される可能性があります。