參加你附近的 ,瞭解 VS Code 中的 AI 輔助開發。

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 子句,例如選單、檢視等。

可用上下文鍵

下面是一些可用的上下文鍵,它們評估為布林值 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 活動偵錯程式狀態。
可能的值是 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 通知 toast 在 VS Code 右下角可見。
searchViewletVisible 搜尋檢視開啟。
sideBarVisible 側邊欄顯示。
sideBarFocus 側邊欄有焦點。
panelFocus 面板有焦點。
inZenMode 視窗處於 Zen 模式。
isCenteredLayout 編輯器處於居中佈局模式。
workbenchState 可以是 emptyfolder(1 個資料夾)或 workspace
workspaceFolderCount 工作區資料夾數量。
replaceActive 搜尋檢視替換文字框開啟。
view 對於 view/titleview/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.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 子句,請將 sideBarFocuspanelFocusauxiliaryBarFocusactiveViewletactivePanelactiveAuxiliary 上下文鍵結合使用。

例如,下面的 when 子句僅當檔案資源管理器有焦點時才為 true

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

在 when 子句中檢查設定

在 when 子句中,您可以引用配置(設定)值,方法是在其前面加上 config.,例如 config.editor.tabCompletionconfig.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 中的元素,當您單擊一個元素時,當前的上下文鍵及其狀態將作為物件輸出到控制檯。

Inspect Context Keys output

活動上下文鍵列表很廣泛,可能包含您已安裝的擴充套件中的自定義上下文鍵

注意:某些上下文鍵用於 VS Code 內部使用,將來可能會更改。