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 |
"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
子句,例如選單、檢視等。
可用上下文鍵
下面是一些可用的上下文鍵,它們評估為布林值 true/false。
此處列出的列表並非詳盡無遺,您可以透過在鍵盤快捷鍵編輯器(首選項:開啟鍵盤快捷鍵)中搜索和過濾或檢視預設鍵繫結 JSON 檔案(首選項:開啟預設鍵盤快捷鍵 (JSON))來查詢其他 when 子句上下文。您還可以使用檢查上下文鍵實用程式來識別您感興趣的上下文鍵。
上下文名稱 | 滿足以下條件時為 True |
---|---|
編輯器上下文 | |
editorFocus |
編輯器有焦點,無論是文字還是小部件。 |
editorTextFocus |
編輯器中的文字有焦點(游標閃爍)。 |
textInputFocus |
任何編輯器都有焦點(常規編輯器、除錯 REPL 等)。 |
inputFocus |
任何文字輸入區域都有焦點(編輯器或文字框)。 |
editorTabMovesFocus |
是否 Tab 會將焦點移出編輯器。 |
editorHasSelection |
編輯器中選擇了文字。 |
editorHasMultipleSelections |
選擇了多個文字區域(多個游標)。 |
editorReadonly |
編輯器是隻讀的。 |
editorLangId |
當編輯器的關聯語言 ID 匹配時為 True。 示例: "editorLangId == typescript" 。 |
isInDiffEditor |
活動編輯器是差異編輯器。 |
isInEmbeddedEditor |
當焦點在嵌入式編輯器內時為 True。 |
作業系統上下文 | |
isLinux |
當作業系統是 Linux 時為 True。 |
isMac |
當作業系統是 macOS 時為 True。 |
isWindows |
當作業系統是 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 |
活動偵錯程式狀態。 可能的值是 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 |
通知 toast 在 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 |
至少有一個差異(比較)編輯器可見。 |
textCompareEditorActive |
差異(比較)編輯器處於活動狀態。 |
editorIsOpen |
如果一個編輯器已開啟,則為 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.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
屬性中使用它。第二個示例儲存了一個值,您可以使用它與 when 子句檢查開啟的“酷”事物數量是否大於 2。
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 中的元素,當您單擊一個元素時,當前的上下文鍵及其狀態將作為物件輸出到控制檯。
活動上下文鍵列表很廣泛,可能包含您已安裝的擴充套件中的自定義上下文鍵。
注意:某些上下文鍵用於 VS Code 內部使用,將來可能會更改。