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/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 子句,例如選單、檢視等。
可用上下文鍵
以下是一些可用的上下文鍵,它們評估為布林值 true/false。
此列表並非詳盡無遺,您可以透過在鍵盤快捷方式編輯器 (首選項: 開啟鍵盤快捷方式) 中進行搜尋和過濾,或查閱預設鍵盤快捷方式 JSON 檔案 (首選項: 開啟預設鍵盤快捷方式 (JSON)) 來找到其他 when 子句上下文。您還可以使用 檢查上下文鍵實用程式來識別您感興趣的上下文鍵。
| 上下文名稱 | 何時為真 |
|---|---|
| 編輯器上下文 | |
editorFocus |
編輯器獲得焦點,無論是文字還是小部件。 |
editorTextFocus |
編輯器中的文字獲得焦點 (游標正在閃爍)。 |
textInputFocus |
任何編輯器都獲得焦點 (常規編輯器、除錯 REPL 等)。 |
inputFocus |
任何文字輸入區域都獲得焦點 (編輯器或文字框)。 |
editorTabMovesFocus |
是否使用 Tab 鍵將焦點移出編輯器。 |
editorHasSelection |
編輯器中已選擇文字。 |
editorHasMultipleSelections |
已選擇多個文字區域 (多個游標)。 |
editorReadonly |
編輯器是隻讀的。 |
editorLangId |
當編輯器關聯的 語言 ID 匹配時為真。 示例: "editorLangId == typescript"。 |
isInDiffEditor |
活動編輯器是差異編輯器。 |
isInEmbeddedEditor |
當焦點在嵌入式編輯器內部時為真。 |
| 作業系統上下文 | |
isLinux |
當作業系統是 Linux 時為真。 |
isMac |
當作業系統是 macOS 時為真。 |
isWindows |
當作業系統是 Windows 時為真。 |
isWeb |
從 Web 訪問編輯器時為真。 |
| 列表上下文 | |
listFocus |
列表獲得焦點。 |
listSupportsMultiselect |
列表支援多選。 |
listHasSelectionOrFocus |
列表有選擇或焦點。 |
listDoubleSelection |
列表選擇了 2 個元素。 |
listMultiSelection |
列表選擇了多個元素。 |
| 模式上下文 | |
inSnippetMode |
編輯器處於片段模式。 |
inQuickOpen |
快速開啟下拉選單獲得焦點。 |
| 資源上下文 | |
resourceScheme |
當資源 Uri 方案匹配時為真。 示例: "resourceScheme == file" |
resourceFilename |
當資源管理器或編輯器檔名匹配時為真。 示例: "resourceFilename == gulpfile.js" |
resourceExtname |
當資源管理器或編輯器檔名副檔名匹配時為真。 示例: "resourceExtname == .js" |
resourceDirname |
當資源管理器或編輯器資源的絕對資料夾路徑匹配時為真。 示例: "resourceDirname == /users/alice/project/src" |
resourcePath |
當資源管理器或編輯器資源的絕對路徑匹配時為真。 示例: "resourcePath == /users/alice/project/gulpfile.js" |
resourceLangId |
當資源管理器或編輯器標題的 語言 ID 匹配時為真。 示例: "resourceLangId == markdown" |
isFileSystemResource |
當資源管理器或編輯器檔案是可由檔案系統提供程式處理的檔案系統資源時為真。 |
resourceSet |
當資源管理器或編輯器檔案已設定時為真。 |
resource |
資源管理器或編輯器檔案的完整 Uri。 |
| 資源管理器上下文 | |
explorerViewletVisible |
如果資源管理器檢視可見,則為真。 |
explorerViewletFocus |
如果資源管理器檢視具有鍵盤焦點,則為真。 |
filesExplorerFocus |
如果檔案資源管理器部分具有鍵盤焦點,則為真。 |
openEditorsFocus |
如果“開啟的編輯器”部分具有鍵盤焦點,則為真。 |
explorerResourceIsFolder |
如果在資源管理器中選擇了資料夾,則為真。 |
| 編輯器小部件上下文 | |
findWidgetVisible |
編輯器查詢小部件可見。 |
suggestWidgetVisible |
建議小部件 (IntelliSense) 可見。 |
suggestWidgetMultipleSuggestions |
顯示了多個建議。 |
renameInputVisible |
重新命名輸入文字框可見。 |
referenceSearchVisible |
“查詢引用”的預覽視窗已開啟。 |
inReferenceSearchEditor |
“查詢引用”預覽視窗編輯器具有焦點。 |
config.editor.stablePeek |
保持預覽編輯器開啟 (由 editor.stablePeek 設定控制)。 |
codeActionMenuVisible |
程式碼操作選單可見。 |
parameterHintsVisible |
引數提示可見 (由 editor.parameterHints.enabled 設定控制)。 |
parameterHintsMultipleSignatures |
顯示了多個引數提示。 |
| 偵錯程式上下文 | |
debuggersAvailable |
有可用的適當偵錯程式擴充套件。 |
inDebugMode |
正在執行除錯會話。 |
debugState |
活動偵錯程式狀態。 可能的值為 inactive、initializing、stopped、running。 |
debugType |
當除錯型別匹配時為真。 示例: "debugType == 'node'"。 |
inDebugRepl |
焦點在除錯控制檯 REPL 中。 |
| 整合終端上下文 | |
terminalFocus |
整合終端獲得焦點。 |
terminalIsOpen |
已開啟整合終端。 |
| 時間線檢視上下文 | |
timelineFollowActiveEditor |
如果時間線檢視正在跟隨活動編輯器,則為真。 |
| 時間線檢視項上下文 | |
timelineItem |
當時間線項的上下文值匹配時為真。 示例: "timelineItem =~ /git:file:commit\\b/"。 |
| 擴充套件上下文 | |
extension |
當擴充套件 ID 匹配時為真。 示例: "extension == eamodio.gitlens"。 |
extensionStatus |
當擴充套件已安裝時為真。 示例: "extensionStatus == installed"。 |
extensionHasConfiguration |
如果擴充套件具有配置,則為真。 |
| 全域性 UI 上下文 | |
notificationFocus |
通知獲得鍵盤焦點。 |
notificationCenterVisible |
通知中心在 VS Code 右下角可見。 |
notificationToastsVisible |
通知提示在 VS Code 右下角可見。 |
searchViewletVisible |
搜尋檢視已開啟。 |
sideBarVisible |
側邊欄已顯示。 |
sideBarFocus |
側邊欄獲得焦點。 |
panelFocus |
面板獲得焦點。 |
inZenMode |
視窗處於禪模式。 |
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 |
視窗處於全屏模式時為真。 |
focusedView |
當前獲得焦點的檢視的識別符號。 |
canNavigateBack |
如果可能導航回退,則為真。 |
canNavigateForward |
如果可能導航前進,則為真。 |
canNavigateToLastEditLocation |
如果可能導航到上次編輯位置,則為真。 |
| 全域性編輯器 UI 上下文 | |
textCompareEditorVisible |
至少一個差異 (比較) 編輯器可見。 |
textCompareEditorActive |
差異 (比較) 編輯器處於活動狀態。 |
editorIsOpen |
如果打開了一個編輯器,則為真。 |
groupEditorsCount |
組中編輯器的數量。 |
activeEditorGroupEmpty |
如果活動編輯器組沒有編輯器,則為真。 |
activeEditorGroupIndex |
一個從 1 開始的數字,表示編輯器組在編輯器網格中的位置。索引為 1 的組將位於左上角第一個。 |
activeEditorGroupLast |
對於編輯器網格中的最後一個編輯器組,將為 true。 |
multipleEditorGroups |
當存在多個編輯器組時為真。 |
activeEditor |
組中活動編輯器的識別符號。 |
activeEditorIsDirty |
當組中的活動編輯器已修改時為真。 |
activeEditorIsNotPreview |
當組中的活動編輯器不是預覽模式時為真。 |
activeEditorIsPinned |
當組中的活動編輯器被固定時為真。 |
inSearchEditor |
當焦點在搜尋編輯器內部時為真。 |
activeWebviewPanelId |
當前活動 webview 面板的 ID。 |
activeCustomEditorId |
當前活動 自定義編輯器的 ID。 |
| 配置設定上下文 | |
config.editor.minimap.enabled |
當設定 editor.minimap.enabled 為 true 時為真。 |
注意:您可以使用任何評估為布林值的使用者或工作區設定,並加上字首
"config."。
可見/焦點檢視 when 子句上下文
您可以有一個 when 子句,用於檢查特定 檢視是否可見或獲得焦點。
| 上下文名稱 | 何時為真 |
|---|---|
view.${viewId}.visible |
當特定檢視可見時為真。 示例: "view.workbench.explorer.fileView.visible" |
focusedView |
當特定檢視獲得焦點時為真。 示例: "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 子句,用於檢查特定 檢視容器是否可見。
| 上下文名稱 | 何時為真 |
|---|---|
activeViewlet |
當檢視容器在側邊欄中可見時為真。 示例: "activeViewlet == 'workbench.view.explorer'" |
activePanel |
當檢視容器在面板中可見時為真。 示例: "activePanel == 'workbench.panel.output'" |
activeAuxiliary |
當檢視容器在輔助側邊欄中可見時為真。 示例: "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 子句僅在檔案資源管理器獲得焦點時為真。
"sideBarFocus && activeViewlet == 'workbench.view.explorer'"
在 when 子句中檢查設定
在 when 子句中,您可以透過在配置 (設定) 值前新增 config. 來引用它,例如 config.editor.tabCompletion 或 config.breadcrumbs.enabled。
新增自定義 when 子句上下文
如果您正在編寫自己的 VS Code 擴充套件,並且需要使用 when 子句上下文來啟用/停用命令、選單或檢視,而現有鍵不滿足您的需求,您可以使用 setContext 命令新增自己的上下文鍵。
下面的第一個示例將鍵 myExtension.showMyCommand 設定為 true,您可以在命令的啟用項中使用它,或與 when 屬性一起使用。第二個示例儲存了一個值,您可以使用它與 when 子句來檢查酷炫的開啟項數量是否大於 2。
vscode.commands.executeCommand('setContext', 'myExtension.showMyCommand', true);
vscode.commands.executeCommand('setContext', 'myExtension.numberOfCoolOpenThings', 4);
檢查上下文鍵實用程式
如果您想檢視執行時所有活動的上下文鍵,可以使用命令面板中的 **Developer: Inspect Context Keys** 命令 (⇧⌘P (Windows, Linux Ctrl+Shift+P))。**Inspect Context Keys** 將在 VS Code 開發者工具的 **Console** 選項卡 (Help > Toggle Developer Tools) 中顯示上下文鍵及其值。
當您執行 **Developer: Inspect Context Keys** 時,您的游標將突出顯示 VS Code UI 中的元素,當您單擊一個元素時,當前上下文鍵及其狀態將作為物件輸出到控制檯。

活動上下文鍵的列表非常廣泛,並且可能包含您已安裝擴充套件的 自定義上下文鍵。
注意:一些上下文鍵供 VS Code 內部使用,並且將來可能會更改。