現已釋出!閱讀關於 11 月新增功能和修復的內容。

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 (包含) 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 活動偵錯程式狀態。
可能的值為 inactiveinitializingstoppedrunning
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 可以是 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 視窗處於全屏模式時為真。
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.enabledtrue 時為真。

注意:您可以使用任何評估為布林值的使用者或工作區設定,並加上字首 "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 子句僅在特定檢視容器獲得焦點時啟用,請將 sideBarFocuspanelFocusauxiliaryBarFocusactiveViewletactivePanelactiveAuxiliary 上下文鍵結合使用。

例如,下面的 when 子句僅在檔案資源管理器獲得焦點時為真。

"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);

檢查上下文鍵實用程式

如果您想檢視執行時所有活動的上下文鍵,可以使用命令面板中的 **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 中的元素,當您單擊一個元素時,當前上下文鍵及其狀態將作為物件輸出到控制檯。

Inspect Context Keys output

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

注意:一些上下文鍵供 VS Code 內部使用,並且將來可能會更改。

© . This site is unofficial and not affiliated with Microsoft.