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

2020 年 1 月 (版本 1.42)

更新 1.42.1:此更新解決了這些問題

下載:Windows:x64 | Mac:Intel | Linux:deb rpm tarball snap


歡迎使用 Visual Studio Code 2020 年 1 月釋出版本。此版本中包含許多我們希望您會喜歡的更新,其中一些主要亮點包括:

如果您想線上閱讀這些發行說明,請訪問 code.visualstudio.com 上的更新頁面。

Insiders:想盡快看到新功能嗎?您可以下載每夜更新的 Insiders 構建版本,並第一時間嘗試最新的更新。有關最新的 Visual Studio Code 新聞、更新和內容,請在 Twitter 上關注我們 @code

工作臺

重新命名預覽

Visual Studio Code 現在允許您預覽重新命名更改。重新命名時,您可以透過 ⌘Enter (Windows, Linux Ctrl+Enter) 確認新名稱,並檢視重構預覽面板。它會在差異編輯器中顯示待處理的更改,並允許您取消勾選/勾選單個更改。一旦重新命名被應用(或中止),差異編輯器和預覽面板就會關閉,將您帶回當前編輯器。

Rename preview

主題:GitHub Sharp,字型:FiraCode

限制開啟的編輯器數量

有新的設定用於限制一次開啟的最大編輯器數量。

  • workbench.editor.limit.enabled: 啟用此功能(預設為關閉)。
  • workbench.editor.limit.perEditorGroup: 是對每個編輯器組應用限制還是跨所有組應用限制。
  • workbench.editor.limit.value: 開啟的最大編輯器數量(預設為 10)。

如果啟用,當您開啟新編輯器時,VS Code 將關閉最近最少使用的編輯器。

您可以在下面看到將限制設定為 3 時的行為

Open editor limit

主題:Nord

注意: 髒編輯器(有未儲存更改的檔案)永遠不會自動關閉,但仍計入開啟的編輯器總數。

無標題編輯器改進

VS Code 中的無標題編輯器是尚未儲存到磁碟的文字緩衝區。您可以讓它們保持開啟狀態,並且所有文字內容都將在重啟之間儲存和恢復。

無標題編輯器標題

過去,無標題編輯器被賦予通用名稱,例如 Untitled-1,向上計數。在此版本中,無標題編輯器將使用文件第一行的內容作為編輯器標題,並將通用名稱包含為描述。

Untitled file title using first line of text

主題:Nord

注意:如果第一行為空或不包含任何單詞,則標題將回退到與以前一樣的 Untitled-*

預設語言模式

預設情況下,無標題檔案沒有配置特定的語言模式。VS Code 有一個設定 files.defaultLanguage,用於為無標題檔案配置預設語言。在此版本中,此設定可以採用新值 {activeEditorLanguage},它將動態使用當前活動編輯器的語言模式,而不是固定的預設值。

此外,當您將文字複製並貼上到無標題編輯器中時,如果文字是從 VS Code 編輯器複製的,VS Code 現在將自動更改無標題編輯器的語言模式。

Untitled file language mode dynamically set

主題:One Dark Pro

注意:如果無標題編輯器已經指定了語言模式,貼上文字不會更改它。

導航最近使用的編輯器

在此版本中,現在有一個跨所有編輯器組的最近使用 (MRU) 編輯器列表。當編輯器作為活動編輯器開啟或如果已開啟則成為新的活動編輯器時,它被視為最近使用。一旦編輯器關閉,它將從列表中移除。

此列表的一個應用是新的 edt mru 選擇器,您可以透過新的檢視:顯示所有最近使用的編輯器 (workbench.action.showAllEditorsByMostRecentlyUsed) 命令開啟它。

MRU editor list

您可以新增鍵盤快捷鍵以在此選擇器中快速導航而無需使用滑鼠。例如,下面是一個鍵繫結,以便 Ctrl+TabCtrl+Shift+Tab 導航跨所有組的編輯器(而不是像預設鍵繫結那樣僅在活動組內導航)。

[
  {
    "key": "ctrl+tab",
    "command": "workbench.action.quickOpenPreviousRecentlyUsedEditor",
    "when": "!inEditorsPicker"
  },
  {
    "key": "ctrl+shift+tab",
    "command": "workbench.action.quickOpenLeastRecentlyUsedEditor",
    "when": "!inEditorsPicker"
  }
]

如果您想在不使用選擇器的情況下導航列表,有新的命令:

  • 檢視:開啟下一個最近使用的編輯器 (workbench.action.openNextRecentlyUsedEditor)
  • 檢視:開啟上一個最近使用的編輯器 (workbench.action.openPreviousRecentlyUsedEditor)

為了區分哪些編輯器導航命令使用選擇器而哪些不使用,一些現有命令的行為發生了變化。具體來說,組中最近使用的編輯器命令不再使用選擇器:

  • 檢視:開啟組中下一個最近使用的編輯器 (workbench.action.openNextRecentlyUsedEditorInGroup)
  • 檢視:開啟組中上一個最近使用的編輯器 (workbench.action.openPreviousRecentlyUsedEditorInGroup)

對於基於選擇器的導航,請使用:

  • 檢視:快速開啟組中上一個最近使用的編輯器 (workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup)
  • 檢視:快速開啟組中最近最少使用的編輯器 (workbench.action.quickOpenLeastRecentlyUsedEditorInGroup)

移動面板

包含輸出、除錯控制檯、終端和問題面板的面板現在可以移動到編輯器的左側。

命令檢視:切換面板位置 (workbench.action.togglePanelPosition) 已刪除,取而代之的是以下新命令:

  • 檢視:將面板向左移動 (workbench.action.positionPanelLeft)
  • 檢視:將面板向右移動 (workbench.action.positionPanelRight)
  • 檢視:將面板移到底部 (workbench.action.positionPanelBottom)

重啟時恢復所有視窗

VS Code 在啟動時恢復視窗的設定已更改為預設恢復所有視窗。如果您想恢復到以前的行為,請配置 "window.restoreWindows": "one" 以僅開啟一個視窗。

儲存衝突解決

當您嘗試儲存一個已被 VS Code 外部或另一個程式(例如 Git)更改的髒檔案時,VS Code 有一個內建機制來顯示通知。

Save conflict dialog with overwrite

這樣做的目的是通知您,儘管檔案在變髒後發生了更改,但儲存將覆蓋磁碟上的內容。選擇比較按鈕可以讓您檢視您的更改以及磁碟上的版本,然後選擇覆蓋或恢復檔案。

在您知道磁碟上的更改可以被覆蓋的情況下,通知上現在有一個覆蓋按鈕。您還可以全域性、按工作區或按檔案型別配置 files.saveConflictResolution,以完全停用此行為。選項為 askUser(預設)或 overwriteFileOnDisk

處理緩慢的儲存操作

VS Code 允許擴充套件在將檔案儲存到磁碟時更改檔案內容。儲存時格式化儲存時修復等功能就是示例。但是,儲存是一個關鍵操作,在儲存期間執行處理的擴充套件必須快速完成,以便實際的儲存操作可以繼續。“快速”過去由 VS Code 強制執行,VS Code 會在超時後取消擴充套件儲存操作。這種強制執行保證了快速儲存,但有時會令人沮喪,因為預期的處理可能不會發生。

在此版本中,我們放棄了基於超時的方法,轉而顯示一個進度通知,允許您取消參與儲存的擴充套件(“儲存參與者”)。通知會告知您儲存操作正在執行,您可以決定是否要等待儲存參與者完成。

Save Participant notification

主題:Light+

原始碼管理輸入

原始碼管理檢視中的輸入框現在使用 Monaco Editor。Monaco Editor 支援多游標和移動/複製行命令等有用功能。

多根資源管理器中的兩步摺疊

當您使用多根工作區時,檔案資源管理器中的摺疊資料夾按鈕現在具有兩步行為。第一次單擊將摺疊每個頂級資料夾中的所有資料夾,第二次單擊將摺疊頂級資料夾。搜尋檢視已經具有此行為。

Two-step File Explorer collapse button

主題:Monokai

根據作業系統配色方案自動切換主題

Windows 和 macOS 現在支援淺色和深色配色方案。有一個新設定 window.autoDetectColorScheme,它指示 VS Code 偵聽作業系統配色方案的變化並相應地切換匹配的主題。

要自定義配色方案更改時使用的主題,您可以使用以下設定來設定首選的淺色和深色主題:

  • workbench.preferredLightColorTheme
  • workbench.preferredDarkColorTheme

編輯器

控制 Peek 檢視焦點

有一個新的設定和命令來控制 Peek 檢視最初將焦點放在哪裡。預設情況下,Peek 將焦點放在右側的樹上,以便您可以快速導航到引用。對於希望使用 Peek 在編輯器中進行快速程式碼更改的人來說,將初始焦點放在樹上並不是最好的。您現在可以使用 editor.peekWidgetDefaultFocus 設定定義您的偏好,該設定可以設定為 editortree。還有一個新命令 togglePeekWidgetFocus (⌘K F2 (Windows, Linux Ctrl+K F2)),它允許您在 Peek 編輯器和樹之間移動焦點。

摺疊區域高亮顯示

透過新增背景高亮顯示,摺疊程式碼區域現在更容易發現。

Fold highlight color

主題:Dark+

此功能由設定 editor.foldingHighlight 控制,顏色可以使用 editor.foldBackground 顏色進行自定義。

  "workbench.colorCustomizations": {
    "editor.foldBackground": "#355000"
  }

摺疊改進

對摺疊指示器進行 Shift + Click 一次以首先摺疊內部範圍。再次進行 Shift + Click(當所有內部範圍都已摺疊時)將摺疊父級。再次進行 Shift + Click 將展開所有內容。

Folding with Shift + Click

當對已摺疊範圍使用摺疊命令 (⌥⌘[ (Windows, Linux Ctrl+Shift+[)) 時,下一個未摺疊的父範圍將被摺疊。

新換行選項

預設情況下,編輯器透過假設所有字元具有相同的寬度來計算換行符。此假設使得預設演算法速度很快,但在使用非等寬字型或以字元寬度不同的指令碼編寫文字時,其結果很差。有一個新設定 editor.wrappingStrategy,可以設定為 advanced,讓編輯器將換行符計算委託給瀏覽器。

輔助功能

建議小部件改進

建議小部件現在不再使用 ARIA 警報,並正確向螢幕閱讀器指示它已獲得焦點。這應該可以防止螢幕閱讀器意外地妨礙。

檢測到螢幕閱讀器時 editor.accessibilityPageSize 設定為 160

editor.accessibilityPageSize 設定控制螢幕閱讀器一次可以讀出的編輯器行數。但是,使用大值時會對效能產生影響。我們決定在檢測到螢幕閱讀器時自動將值設定為 160 行(由於 NVDA 錯誤,不超過此值)。

Linux Orca 可訪問性

我們已開始研究使用 Orca 螢幕閱讀器使 VS Code 在 Linux 上可訪問。但是,由於這項工作需要 Electron 7,我們預計在下一個穩定版本中取得更多進展。與此同時,對於 Linux 可訪問性,您可以使用我們的 Insiders 版本並提供反饋。

整合終端

滾動靈敏度

終端的滾動靈敏度現在可以使用新設定獨立於編輯器進行配置:

  • terminal.integrated.mouseWheelScrollSensitivity - 滑鼠滾輪滾動乘數(預設為 1)。
  • terminal.integrated.fastScrollSensitivity - 按下 Alt 時的快速滾動乘數(預設為 5)。

除錯

簡化的初始除錯檢視

為了簡化除錯檢視的啟動,VS Code 現在只顯示一個執行和除錯按鈕。不帶除錯執行操作(並非所有偵錯程式都支援)仍在除錯主選單中可用。

根據使用者反饋,如果您設定了至少一個斷點,則斷點窗格會顯示在起始檢視中。

Simplified initial Debug view

除錯控制檯改進

除錯控制檯輸入

除錯控制檯輸入現在使用當前活動編輯器的語言模式。這意味著除錯控制檯輸入支援語法著色、縮排、引號自動關閉以及其他語言功能。

Debug Console input with syntax coloring

輸入/輸出呈現

我們調整了除錯控制檯中輸入和輸出的呈現方式,使其更易於區分。VS Code 僅在輸入表示式旁邊顯示一個箭頭。

Debug Console input with arrow display

除錯控制檯輸入歷史記錄建議

除錯控制檯輸入框現在會自動建議以前輸入的條目。文字圖示用於將歷史記錄建議與其他 IntelliSense 條目區分開來。

Debug console history

除錯後隱藏除錯控制檯

有一個新設定 debug.console.closeOnEnd,用於控制除錯停止後除錯控制檯是否應自動關閉。

支援 console.table(...)

除錯控制檯現在可以顯示來自 Node.js console.table(...) API 的輸出。

Debug Console table output

載入指令碼檢視改進

載入指令碼檢視已更新為使用 VS Code 的新樹檢視。它現在以與 VS Code 檔案資源管理器相同的緊湊形式渲染單個子資料夾。此外,現在可以在您鍵入時搜尋和展開樹。

Expand as you type in Loaded Scripts view

我們計劃在下一個版本中刪除除錯:開啟載入指令碼命令,因為它會複製樹的“鍵入時搜尋和展開”功能。

啟動配置排序和分組

啟動配置和複合配置現在支援新的結構化屬性 presentation。使用 ordergrouphidden 屬性,您可以在除錯配置下拉列表和除錯快速選擇中對配置和複合配置進行排序、分組和隱藏。

例如,launch.json 中的啟動配置可以具有以下 presentation 欄位:

"presentation": {
    "group": "5_tests",
    "order": 10,
    "hidden": false
}

舉個例子,我們為 VS Code 自己的某些啟動配置添加了呈現方式,以便以更有意義的方式對它們進行分組,並隱藏那些僅作為複合啟動配置一部分的配置。

Debug view context menu

除錯活動欄圖示和裝飾

根據使用者反饋,我們更新了活動欄中的除錯圖示,以更好地表示執行和除錯。在除錯時,除錯圖示上會有一個數字裝飾,以顯示活動除錯會話的數量。

Debug Activity Bar icon showing two debug sessions

任務

使用者級別任務

現在在使用者設定級別支援在 tasks.json 中宣告的任務。如果您有一個在許多專案中使用或不想將任務放在專案資料夾中的構建指令碼,您可以在使用者 tasks.json 檔案中新增任務。執行任務:開啟使用者任務命令以建立使用者級別任務,這些任務將在所有資料夾和工作區中可用。此處僅支援 shellprocess 任務型別。

輸入 pickString 標籤

如果您使用任務 inputs,您可以為 pickString 輸入 options 新增一個友好標籤:

"inputs": [
  {
      "id": "pickAnInputValue",
      "description": "Pick a Value",
      "type": "pickString",
      "options": [
          "first-value",
          {
              "label": "Second Value",
              "value": "second-long-value-that-can-be-simplified-for-display"
          }
      ],
      "default": "first-value"
  }
]

標籤將顯示為:

Task pickString input with label

語言

TypeScript 3.7.5

我們更新了捆綁的 TypeScript 版本到 3.7.5。此次次要更新包含一些重要的錯誤修復,包括修復 Windows 上未儲存在 C: 驅動器上的專案的 IntelliSense。

HTML 映象游標預設關閉

HTML 映象游標現在是一個選擇加入的功能。在即將到來的迭代中,我們將繼續改進其實現,使此功能更易於理解並可用於更多語言。您仍然可以透過開啟 html.mirrorCursorOnMatchingTag 來使用此功能。

預覽功能

預覽功能尚未準備好釋出,但已足夠實用。我們歡迎您在這些功能開發期間提供早期反饋。

時間線檢視

在本里程碑中,我們在新的時間線檢視上取得了進展,並有一個早期預覽可以分享。這是一個用於視覺化資源(檔案、資料夾)的時間序列事件(例如 Git 提交、檔案儲存、測試執行等)的統一檢視。要啟用時間線檢視,您必須使用 Insiders 版本,然後新增以下設定:

"timeline.showView": true

您可以在下面看到時間線檢視顯示檔案的 Git 提交歷史記錄:

Timeline view

主題:Dark Amethyst

在此早期預覽中,時間線檢視顯示活動文件的 Git 提交歷史記錄,目前限制為 32 項。選擇其中一個提交將開啟該提交引入的更改的差異檢視。擴充套件程式也將能夠貢獻自己的時間線源,這些源將顯示在此統一時間線檢視中。最終,您還可以選擇(過濾)您希望在檢視中看到的源。

請繼續關注,我們為這項新功能準備了更多內容。您可以透過訂閱問題 #84297並關注帶有'timeline'標籤的問題來跟蹤進展。如果您對希望在此檢視中看到的其他型別資訊有任何想法,請告訴我們!

搜尋編輯器

我們繼續在新的搜尋編輯器上進行工作,本迭代的目標是讓搜尋編輯器成為主要的搜尋體驗。為此,我們實現了用於配置搜尋編輯器查詢的使用者介面:

Search Editor UI

主題:Noctis Lilac,字型:Hasklig

現在有幾個用於搜尋編輯器的命令,您可以將它們繫結到您選擇的鍵盤快捷鍵:

  • search.action.openNewEditor: 在活動編輯器組中開啟一個新的搜尋編輯器。
  • search.action.openInEditor: 將當前搜尋結果複製到一個新的搜尋編輯器中。

有關搜尋編輯器的更多資訊和進一步更新,請參閱問題 #23931

注意:搜尋編輯器在 Insiders 中預設啟用,可以透過將 search.enableSearchEditorPreview 設定為 true 在 Stable 中選擇加入。

TypeScript 和 JavaScript 的語義高亮顯示

TypeScript 和 JavaScript 的語義高亮顯示支援正在開發中,尚未預設啟用。您可以透過新增以下設定來試用它:

"editor.semanticHighlighting.enabled": true

啟用後,您將看到一些識別符號具有新的顏色和樣式,現在根據其解析型別進行高亮顯示。預設語法 (TextMate) 高亮顯示器將許多令牌歸類為 variables,這些令牌現在被解析為名稱空間、類、引數等。

在匯入部分中可以最好地看到這一點,現在每個匯入的符號都使用符號的型別進行著色:

TypeScript semantic highlighting

您可以使用開發者:檢查編輯器令牌和範圍命令來檢查為每個位置計算的語義和語法令牌。

新的 JavaScript 偵錯程式

我們一直在為 Node.js 和 Chrome 開發一個新的偵錯程式。它預設安裝在 Insiders 中,並且可以從 VS Code Stable 中的市場安裝。您可以透過啟用 debug.javascript.usePreview 設定來將其與現有啟動配置一起使用。以下是我們本月新增的一些新功能。

新的 JS 偵錯程式將自動除錯您在新 JavaScript 除錯終端中執行的命令,您可以透過除錯:建立 JavaScript 除錯終端命令開啟它:

JavaScript debug terminal

主題:Earthsong,字型:Fira Code

新的偵錯程式還在 package.json 的 scripts 部分提供了除錯 CodeLens,可以執行和除錯指令碼而無需額外的配置:

JavaScript debug CodeLens

您可以透過 debug.javascript.codelens.npmScripts 設定配置 CodeLens 的可見性和位置(頂部或內聯)。

試試吧!如果您在新偵錯程式中遇到任何問題,可以在 vscode-js-debug 儲存庫中提交問題。

將檢視從側邊欄移動到面板

正在積極開展工作以使 VS Code 的佈局自定義更加容易。您可以使用以下設定來測試進度:

"workbench.view.experimental.allowMovingToNewContainer": true

啟用此設定後,某些檢視會有一個新的上下文選單條目,用於在側邊欄和麵板之間移動它們。目前,此設定僅影響資源管理器中的大綱檢視和擴充套件程式貢獻的檢視。您也不能像在側邊欄中那樣將這些檢視組合在面板中。

Outline view moving to panel and back

主題:LaserWave,字型:Cascadia Code

這只是對功能的預覽,它的許多方面都可能發生變化,包括上面提到的限制。歡迎在我們的 Insiders 版本中檢視進一步的進展。

關於搜尋的注意:隨著新的通用移動檢視方法,舊的搜尋檢視設定 search.location 和命令搜尋:切換搜尋檢視位置 (search.action.toggleSearchViewPosition) 正在被棄用。您的設定應自動遷移,但您需要使用新的通用方法來移動搜尋檢視。您不需要啟用上述實驗預覽設定即可使用新的上下文選單條目移動搜尋檢視。

TypeScript 3.8 beta 支援

儘管 VS Code 要到下個月正式釋出才會捆綁 TypeScript 3.8,但本次迭代我們添加了對所有激動人心的新 TypeScript 3.8-beta 功能的支援。

其中包括:

  • JavaScript 和 TypeScript 檔案中私有欄位的 IntelliSense 和語法高亮顯示。
  • JavaScript 和 TypeScript 的呼叫層次結構支援。
  • 轉換為模板字串重構!

您今天可以透過安裝 TypeScript Nightly extension 輕鬆試用所有這些新的 TypeScript 3.8 功能。請分享反饋,如果您遇到 TypeScript 3.8 beta 的任何錯誤,請告訴我們!

對擴充套件的貢獻

Java 偵錯程式支援資料斷點

Debugger for Java 擴充套件現在支援 VS Code 1.38 中引入的資料斷點。此功能允許您建立斷點,當變數的值發生變化時,這些斷點將被命中。

您可以在下面看到當 Owner.telephone 字串發生變化時偵錯程式中斷:

Java Data Breakpoints

Java 呼叫層次結構檢視

Language Support for Java 擴充套件現在支援呼叫層次結構檢視,該檢視顯示從函式或對函式的呼叫,並允許您深入檢視呼叫者的呼叫者和呼叫的呼叫。

右鍵單擊符號並選擇檢視 > 檢視呼叫層次結構以檢視呼叫層次結構:

Java Call Hierarchy view

遠端開發

遠端開發擴充套件的工作仍在繼續,它允許您使用容器、遠端機器或 適用於 Linux 的 Windows 子系統 (WSL) 作為功能齊全的開發環境。

1.42 中的功能亮點包括:

  • 遠端 - SSH:改進了對 Windows 伺服器的支援,包括自動作業系統檢測。
  • WSL:支援在資源管理器中顯示以開啟 WSL 資源的 Windows 資源管理器。
  • 開發容器:預構建的容器映象,包括 Git 和 zsh 等依賴項。
  • 轉發埠檢視:對映、檢視和重用 SSH 和容器埠。

您可以在遠端開發發行說明中瞭解有關新擴充套件功能和錯誤修復的資訊。

擴充套件創作

Codicons 以供重用

對於大多數 VS Code 圖示,使用 codicon 圖示字型。擴充套件現在可以透過簡單且宣告性的方式重用這些圖示:

  • vscode.ThemeIcon 型別現在可以使用 codicon 的名稱進行例項化。例如,new vscode.ThemeIcon("zap")
  • vscode.MarkdownString 型別現在支援 $(<name>) 內聯語法。例如,myMdString.appendMarkdown('Hello $(globe)');。請注意,要在 MarkdownString 中使用 codicons,必須啟用 supportThemeIcons 建構函式引數。
  • 在擴充套件的 package.json 檔案中定義的 commands 現在可以使用 codicon 作為其圖示。使用內聯語法,例如 "icon": "$(zap)"

All available codicons displayed in a hover

主題:Light+

上面的懸停示例正在渲染每個可用的 codicon。懸停是使用下面的程式碼片段建立的,但為了可讀性,大多數 codicon 名稱已從 all 常量中刪除。

vscode.languages.registerHoverProvider(
  '*',
  new (class implements vscode.HoverProvider {
    provideHover(doc: vscode.TextDocument, pos: vscode.Position) {
      const all = `$(activate-breakpoints)$(add)...$(zoom-out)`;
      const md = new vscode.MarkdownString(all, true);
      return new vscode.Hover(md, doc.getWordRangeAtPosition(pos));
    }
  })()
);

完成項的插入和替換

在單詞末尾觸發的完成通常會替換該單詞。但是,當在單詞內部觸發完成時,不清楚是應該替換單詞末尾還是不替換。根據擴充套件作者的偏好,使用者會得到一種行為或另一種行為。這並不理想,現在有一個 API 可以表達完成項的插入和替換範圍。

為此,我們向 CompletionItem#range 添加了一個新的 OR 型別:

export class CompletionItem {
  range?: Range | { inserting: Range; replacing: Range };

  //...
}
  1. 如果範圍是 undefined,則 VS Code 使用當前單詞範圍進行替換,並使用在游標位置裁剪的相同範圍進行插入
  2. 如果範圍是簡單的 vscode.Range,則 VS Code 知道只有一個位置用於插入或替換。
  3. 如果範圍是具有 insertingreplacing 範圍的物件,VS Code 將直接使用它們。

此資訊與 editor.suggest.insertMode 設定結合使用,允許使用者定義他們的偏好。我們要求擴充套件作者儘快採用此 API,因為我們計劃在下一個版本中使插入和替換行為更加可見。

最佳化的 CallHierarchyProvider

我們對 CallHierarchyProvider#prepareCallHierarchy 進行了一個小更改,以便它現在可以返回一個或多個 CallHierarchyItem 元素。當在具有多個過載的元素上請求呼叫層次結構時,many 選項很有用。

終端上公開建立選項

Terminal 物件有一個新的 creationOptions 屬性,擴充套件程式可以使用它來識別終端是如何建立的。

特定於語言的設定

擴充套件程式現在可以使用新的配置範圍 language-overridable 貢獻可以被語言覆蓋的設定。

示例

"contributes": {
    "configuration": {
        "title": "sample",
        "properties": {
            "sample.languageSetting": {
                "type": "boolean",
                "scope": "language-overridable"
            }
        }
    }
}

Configuration API 已增強以支援這些設定。您可以使用 API 透過傳遞必要的 languageId 來讀取和更新這些設定。

示例

/**
 * Read language configuration.
 */
const textDocumentConfiguration = vscode.workspace.getConfiguration('sample', {resource, languageId});
textDocumentConfiguration.get('languageSetting');

/**
 * Override configuration under language
 */
textDocumentConfiguration.update('languageSetting', false, ConfigurationTarget.Global, true);

/**
 * Listen language configuration changes
 */
workspace.onDidChangeConfiguration(e => {
    if(e.affectsConfiguration('sample.languageSetting',  {resource, languageId}) {
    }
});

有關詳細資訊,請參閱 Configuration API

擴充套件檢視上下文選單

您現在可以使用新的選單位置 extension/context 將命令貢獻到擴充套件檢視中擴充套件程式的上下文選單。

示例

"contributes": {
    "commands": [
        {
            "command": "extension.helloWorld",
            "title": "Hello World"
        }
    ],
    "menus": {
        "extension/context": [
            {
                "command": "extension.helloWorld",
                "group": "2_configure",
                "when": "extensionStatus==installed",
            }
        ]
    }
}

Extensions view context menu

執行命令時,擴充套件程式的 ID 將作為引數傳遞。

示例

vscode.commands.registerCommand('extension.helloWorld', extensionId => {
  vscode.window.showInformationMessage(extensionId);
});

支援以下預定義上下文,您可以在命令的 when 條件中使用它們:

  • extensionStatus==installed
  • isBuiltinExtension

用於訪問已替換變數的 DebugConfigurationProvider 掛鉤

用於除錯的擴充套件 API 在 DebugConfigurationProvider 上提供了一個掛鉤 resolveDebugConfiguration,可用於在將除錯配置傳遞給除錯介面卡之前對其進行驗證。由於此掛鉤是在變數替換之前呼叫的,因此驗證程式碼可以輕鬆地向除錯配置新增更多變數,並且仍能及時替換它們。

這種方法使得在 resolveDebugConfiguration 掛鉤中使用已解析的變數值變得困難,例如用於驗證或實現僅存在於擴充套件中(而不是在可以獲取已替換值的除錯介面卡中)的功能。請參閱問題 #85206 以獲取示例。一些擴充套件已開始自行替換變數(這通常是不完整的,因為它沒有涵蓋所有情況)。

從使用者的角度來看,這令人困惑。在除錯配置中,某些屬性變數可以使用(因為它們在替換髮生後在除錯介面卡中處理),而某些屬性變數不能使用(因為它們在替換尚未發生的擴充套件中處理)。問題 #87450 是後一個問題的一個很好的例子。

在此里程碑中,我們透過向 DebugConfigurationProvider 新增第二個掛鉤 resolveDebugConfigurationWithSubstitutedVariables 來解決此問題,該掛鉤接收具有所有變數已替換的除錯配置。

隨著此新 API 的可用性,我們要求所有除錯擴充套件作者仔細審查其 DebugConfigurationProvider.resolveDebugConfiguration 的當前實現,並將所有不引入新變數但會從在已替換變數上執行中受益的程式碼移到新方法 resolveDebugConfigurationWithSubstitutedVariables 中。

在擴充套件中實現除錯介面卡

現有的除錯擴充套件 API 支援註冊 DebugAdapterDescriptorFactory 以多種方式執行除錯介面卡:

作為外部程序

vscode.debug.registerDebugAdapterDescriptorFactory('mock', {
  createDebugAdapterDescriptor: _session => {
    return new vscode.DebugAdapterExecutable('mockDebug.exe');
  }
});

作為網路會話

vscode.debug.registerDebugAdapterDescriptorFactory('mock', {
  createDebugAdapterDescriptor: _session => {
    return new vscode.DebugAdapterServer(12345, 'localhost');
  }
});

在此里程碑中,我們添加了第三種變體,可以在其中提供除錯介面卡的“內聯”實現:

vscode.debug.registerDebugAdapterDescriptorFactory('mock', {
  createDebugAdapterDescriptor: _session => {
    return new vscode.DebugAdapterInlineImplementation(new InlineDebugAdapter());
  }
});

這消除了透過基於流的機制與介面卡通訊的需要,並簡化了開發,因為介面卡在擴充套件內部執行,並且可以作為 VS Code 擴充套件除錯的一部分輕鬆除錯。

內聯實現(例如,上面的 InlineDebugAdapter)需要實現 Debug Adapter Protocol。由於我們不想將完整的 Debug Adapter Protocol 包含在 VS Code 的擴充套件 API 中,因此我們引入了該協議的一個最小子集。介面 vscode.DebugAdapter 只有兩種方法,一種用於將 DAP 訊息傳遞給介面卡 (handleMessage),另一種用於偵聽從介面卡接收的 DAP 訊息 (onDidSendMessage)。

基於此介面,除錯介面卡的實現將從以下原始碼開始:

class InlineDebugAdapter implements vscode.DebugAdapter {
  private sendMessage = new vscode.EventEmitter<DebugProtocol.ProtocolMessage>();
  private sequence: 1;

  readonly onDidSendMessage: vscode.Event<DebugProtocol.ProtocolMessage> = this.sendMessage
    .event;

  handleMessage(message: DebugProtocol.ProtocolMessage): void {
    switch (message.type) {
      case 'request':
        const request = <DebugProtocol.Request>message;
        switch (request.command) {
          case 'initialize':
            const response: DebugProtocol.Response = {
              type: 'response',
              seq: this.sequence++,
              success: true,
              request_seq: request.seq,
              command: request.command
            };
            this.sendMessage.fire(response);
            break;
          // many more requests needs to be handled here...
          default:
            break;
        }
        break;
      case 'response':
        break;
      case 'event':
        break;
    }
  }

  dispose() {
    // clean up resources
  }
}

由於除錯介面卡協議(可作為節點模組 vscode-debugprotocol 獲得)是 vscode.DebugAdapter 介面的相容超集,如果您需要完整的協議並希望完全由自己實現除錯介面卡,則可以匯入該模組。

一個更簡單的替代方法是(繼續)使用我們除錯介面卡的預設實現,可作為節點模組 vscode-debugadapter 獲得。從版本 1.38.0-pre.4 開始,此模組中引入的 DebugSession(或 LoggingDebugSession)與擴充套件 API 中定義的介面 vscode.DebugAdapter 相容。

使用此 API,現有的除錯介面卡實現可以輕鬆使用,如下所示:

vscode.debug.registerDebugAdapterDescriptorFactory('mock', {
  createDebugAdapterDescriptor: _session => {
    return new vscode.DebugAdapterInlineImplementation(new MockDebugSession());
  }
});

有關詳細資訊,請參閱 Mock debug 示例。

注意:在此版本中,我們已完成用於建立除錯介面卡的擴充套件 API。因此,我們宣佈將在 3 月份的版本中刪除對 debuggers 貢獻點的兩個已棄用屬性的支援

  • adapterExecutableCommand - 改用擴充套件 API vscode.DebugAdapterDescriptorFactoryvscode.DebugAdapterExecutable。Mock debug 示例展示瞭如何使用 API
  • enableBreakpointsFor - 改用 breakpoints 貢獻點。需要在 package.json 中完成轉換。

如果當前(已棄用)JSON 如下所示:

"contributes": {
  "debuggers": [{
    "type": "csharp",
    // ...
    "enableBreakpointsFor": [ "csharp", "razor" ]
    // ...
  }]

轉換將是:

"contributes": {
  "breakpoints": [
    { "language": "csharp" },
    { "language": "razor" }
  ],
  "debuggers": [{
    "type": "csharp",
    // ...
  }]

我們建議受影響的擴充套件在 2 月份及時調整其實現以適應新 API,以便我們有足夠的時間在 3 月份之前修復問題。

建議的擴充套件 API

每個里程碑都會帶來新的提議 API,擴充套件作者可以進行嘗試。一如既往,我們渴望您的反饋。以下是試用提議 API 的方法:

  • 您必須使用 Insiders 版本,因為提議的 API 經常更改。
  • 您的擴充套件的 package.json 檔案中必須包含以下行:"enableProposedApi": true
  • 將最新版本的 vscode.proposed.d.ts 檔案複製到您專案的源位置。

請注意,您不能釋出使用提議 API 的擴充套件。下一個版本中可能會有重大更改,我們絕不希望破壞現有擴充套件。

新增工作區編輯元資料

現在 VS Code 中支援的重構預覽帶有一個新的可選 API 提案。它允許您對工作區編輯的更改進行分類。例如,您可以定義更改是否需要使用者確認或新增“字串和註釋中的重新命名”等描述。該提案可以在問題 #77728中跟蹤,其當前設計圍繞 WorkspaceEditMetadata 介面。

語義高亮顯示

如果您有興趣為您的語言新增語義高亮顯示,語義高亮顯示概述包含概念和新 API 的摘要。

身份驗證提供程式

某些擴充套件需要對其他服務進行身份驗證。 問題 #88309 中的提案將使擴充套件能夠註冊可供其他擴充套件訪問的身份驗證提供程式,從而提供執行身份驗證的通用機制。

時間線提供程式

擴充套件程式很快就能夠將自己的源貢獻到新的時間線檢視中。有興趣新增您自己的時間線源嗎?檢視問題 #84297中的這個早期提案並提供您擁有的任何反饋。

Documentation.Refactoring 貢獻點

擬議的 documentation.refactoring 貢獻點允許擴充套件程式為其重構提供文件。使用者可以在請求重構時選擇檢視此文件:

Refactoring documentation

擬議的貢獻點允許擴充套件程式透過使用命令來控制其文件的顯示方式:

"contributes": {
  "documentation": {
    "refactoring": [
      {
        "title": "Learn more about JS/TS refactorings",
        "when": "typescript.isManagedFile",
        "command": "_typescript.learnMoreAboutRefactorings"
      }
    ]
  }
}
  • title — 向用戶顯示的文件操作的標籤。
  • whenWhen clause,用於何時顯示文件。
  • command — 顯示文件的命令。例如,此命令可以開啟網頁或直接在 VS Code 中顯示文件。

問題 #86788 跟蹤提案的狀態。

自定義編輯器的備份和熱退出掛鉤

我們在此迭代中繼續迭代擬議的自定義編輯器 API。本月我們主要的調查是如何為自定義編輯器啟用熱退出問題 #88719 涵蓋了我們在支援熱退出時遇到的一些挑戰以及我們考慮的一些方法。

這項調查的結果是在 WebviewCustomEditorEditingDelegate 介面上添加了一個新的可選 backup 方法。VS Code 會在資源更改後一秒左右呼叫此方法。在 backup 方法內部,擴充套件程式應將其當前狀態的資源持久化。最常見的是,這意味著將資源寫入工作區儲存資料夾。然後,當編輯器重新載入時,它應該檢查是否存在任何持久化備份,然後再從工作區本身載入資源。

我們將在下一次迭代中繼續迭代自定義編輯器 API。

複雜完成標籤

我們正在改進 CompletionItem API,以適應需要提供限定名稱、匯入路徑、返回型別和其他資訊的複雜完成項。資訊必須提前提供,而不是稍後解決。提供的資訊將內聯顯示在建議小部件中。我們將在下一次迭代中迭代當前提案。同時,我們正在考慮向建議小部件新增狀態列,以解決一些 UI 和可發現性挑戰。我們期待您對 API 的反饋。

Complex completion label

主題:Nord,字型:Input Mono

診斷錯誤現在可以具有與其錯誤程式碼關聯的連結。當提供連結時,它將顯示在“問題”面板、內聯錯誤檢視和診斷錯誤懸停中。在我們下一次迭代中繼續處理此功能時,您可以在問題 #11847中提供反饋。

Diagnostic with link

語言伺服器協議

Language Server Protocol 的 3.15 版本現已推出。我們還發布了 VS Code LSP 客戶端和用 Node.js 編寫的 LSP 伺服器的相應 npm 模組。最新版本的庫包含語義令牌的擬議規範和實現。

LSP 網站現在託管 Language Server Index Format specification 的初步版本以及相應的 LSIF 概述

瀏覽器支援

將檔案拖放到編輯器中

在瀏覽器中使用 VS Code 時,您現在可以將本地檔案拖放到編輯器區域,以將它們作為髒(未儲存)檔案開啟,其中包含檔案的內容。

In-browser support for drag and drop

新命令

命令 命令 ID
將面板向左移動 workbench.action.positionPanelLeft
將面板向右移動 workbench.action.positionPanelRight
將面板移到底部 workbench.action.positionPanelBottom
開啟下一個最近使用的編輯器 workbench.action.openNextRecentlyUsedEditor
開啟上一個最近使用的編輯器 workbench.action.openPreviousRecentlyUsedEditor
開啟組中下一個最近使用的編輯器 workbench.action.openNextRecentlyUsedEditorInGroup
開啟組中上一個最近使用的編輯器 workbench.action.openPreviousRecentlyUsedEditorInGroup
開啟最近使用的編輯器選擇器 workbench.action.showAllEditorsByMostRecentlyUsed
透過選擇器開啟上一個最近使用的編輯器 workbench.action.quickOpenPreviousRecentlyUsedEditor
⌃Tab (Windows, Linux Ctrl+Tab) 透過選擇器開啟組中上一個最近使用的編輯器 workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup
透過選擇器開啟最近最少使用的編輯器 workbench.action.quickOpenLeastRecentlyUsedEditor
⌃⇧Tab (Windows, Linux Ctrl+Shift+Tab) 透過選擇器開啟組中最近最少使用的編輯器 workbench.action.quickOpenLeastRecentlyUsedEditorInGroup
開發者:重啟擴充套件主機 workbench.action.restartExtensionHost

工程

TSLint 到 ESLint 遷移

VS Code 主要用 TypeScript 編寫。除了編譯器,我們還使用 linting 來強制執行某些樣式和工程規則。過去,我們使用 TSLint 完成該任務,但大約一年前,TSLint 的維護者宣佈棄用,轉而支援 ESLint。

在本里程碑中,我們已遷移到 ESLint - 這包括我們的 lint 配置和我們的自定義規則。最後但並非最不重要的一點是,我們還更新了 yo code 擴充套件生成器,以便新的 TypeScript 擴充套件也由 ESLint 檢查。

如果您在自己的專案中使用 TSLint,我們建立了從 TSLint 遷移到 ESLint 指南來幫助您切換到 ESLint。

使用 TypeScript 3.8-beta 構建 VS Code

VS Code 現在使用 TypeScript 3.8 beta 版本構建。

支援在 Shadow DOM 中託管 Monaco Editor

我們修復了圍繞滑鼠處理和動態 CSS 的各種問題,以便 Monaco Editor 現在可以託管在 Shadow DOM API shadow root 內部。

新文件

容器

有新文章介紹瞭如何使用 Microsoft Docker 擴充套件建立容器。您會找到有關容器化 Node.jsASP.NET Core 應用程式、推送到容器登錄檔以及將容器部署到雲的教程。

Docker extension

值得注意的修復

  • 12058: 定期儲存 UI 狀態以防止在關閉時丟失
  • 79205: 當連線到不區分大小寫平臺上的區分大小寫檔案系統時,資源管理器樹不顯示正確內容
  • 83543: 除錯程式位置僅針對活動會話顯示
  • 85057: 將對話方塊詳細資訊移至自定義對話方塊中的描述行
  • 86445: 無法透過熱鍵同時刪除多個 Watch 除錯變數
  • 88240: 建立許多 Watch 下拉表示式速度緩慢
  • 89057: 讓只讀編輯器顯示問題
  • 89405: 文字檔案:不要報告只讀模型的髒狀態

感謝

最後但同樣重要的是,衷心感謝!以下幫助使 VS Code 變得更好的各位:

對我們問題跟蹤的貢獻

vscode 的貢獻

vscode-eslint 的貢獻

language-server-protocol 的貢獻

vscode-languageserver-node 的貢獻

debug-adapter-protocol 的貢獻

vscode-vsce 的貢獻

vscode-js-debug 的貢獻

vscode-generator-code 的貢獻

vscode-azurecli 的貢獻

vscode-emmet-helper 的貢獻

localization 的貢獻

有超過 800 名 雲 + AI 本地化 社群成員使用 Microsoft 本地化社群平臺 (MLCP),其中約 170 名活躍貢獻者為 Visual Studio Code 做出貢獻。我們感謝您的貢獻,無論是提供新的翻譯、對翻譯進行投票還是提出流程改進建議。

這是貢獻者的快照。有關專案詳細資訊,包括貢獻者姓名列表,請訪問專案網站:https://aka.ms/vscodeloc

  • 波斯尼亞語 (拉丁語, 波斯尼亞和黑塞哥維那): Sead Mulahasanović, Adnan Rizvan, Ismar Bašanović。
  • 保加利亞語: Andreyka Lechev。
  • 捷克語: Michal Černík。
  • 丹麥語: Lasse Stilvang。
  • 荷蘭語: Philip Denys, Lemuel Gomez, Dennis Hummel, Gideon van de Laar。
  • 英語 (英國): Martin Littlecott, Alexander Ogilvie, Krishna Regar, Alonso Calderon, Daniel Imms, Kamalsinh Solanki。
  • 芬蘭語: Tuula P.
  • 法語: Antoine Griffard, Thierry DEMAN-BARCELÒ, Edouard Choinière, Joel Monniot, Rodolphe NOEL, Lucas A., Alain, BUFERNE, Xavier Laffargue, Mohamed Sahbi, DJ Dakta。
  • 德語: Pascal Wiesendanger, Marvin Heilemann, jan-nitsche, Jakob von der Haar, Michael Richter。
  • 希臘語: Valantis Kamayiannis, Θοδωρής Τσιρπάνης。
  • 希伯來語:Ariel Bachar。
  • 印地語: Kiren Paul, Niraj Kumar, Preeti Madhwal, Jaadu Jinn, Mahtab Alam。
  • 匈牙利語: József Cserkó, Kiss Attila Csaba, Krisztián Papp。
  • Simplified Chinese: Yizhi Gu, Tingting Yi, Justin Liu, ick, Charles Dong, Peng Zeng, Tony Xia, 斌 項, 普魯文, paul cheung, 張銳, Zhiqiang Li, Yixing Zheng, AlexiZz Nakido, 冉 耀隆, Chow David, Sheng Jiang, yungkei fan, Yao Rui, Joel Yang, 鍾越, Chenglong Wei, 一斤瓜子, Yiting Zhu, Alexander ZHANG, YanJun Sun, Libing Yang, ZHENGCHENG CHEN, 張 任飛, 光宇 樸, 石巖 詹, 舜傑 楊, WJ Wang, Siam Chen.
  • Traditional Chinese: Winnie Lin, 船長, Alan Tsai, TingWen Su.
  • Indonesian: Eriawan Kusumawardhono, Aldila, Arif Fahmi, Laurensius Dede Suhardiman, Mychael Go, Christian Elbrianno, Septian Adi.
  • 義大利語:Alessandro Alpi, Luigi Bruno。
  • Japanese: Takayuki Fuwa, Seiichi Ariga, Koichi Makino, Yoshihisa Ozaki, 貴康 內田, Ishii Shun, Kyohei Uchida, TENMYO Masakazu, Aya Tokura.
  • Korean: Hongju.
  • 拉脫維亞語:Andris Vilde。
  • Norwegian: Frode Aarebrot, Anders Stensaas, Thomas Ødegård, Thomas Isaksen.
  • Polish: Makabeus Orban, Mateusz Redynk, Kacper Łakomski, Piotr Rysak, Wojciech Maj, Oskar Janczak, Szymon Seliga, Franx Bar, Marcin Anonimus.
  • Portuguese (Brazil): Marcelo Fernandes, Arthur Lima, Albert Tanure, Loiane Groner, Nylsinho Santos, Alessandro Trovato, Pudda, Matheus Vitti Santos, Rodrigo Crespi, Wellington OStemberg, Roberto Fonseca, Felipe Galante, Rodrigo Tavares, Alessandro Fragnani, Felipe Nascimento, Alexis Lopes.
  • Portuguese(Portugal): Francisco Osorio, Luís Chaves, Ricardo Sousa Vieira, João Fernandes.
  • Romanian: Tiberiu Frățilă, LaServici, Dan Ichim.
  • Russian: Vadim Svitkin, Николай Соколовский, Дмитрий Кирьянов, Baturin Valery.
  • Serbian Cyrillic: Dusan Milojkovic.
  • Spanish: José María Aguilar, Ricardo Estrada Rdez, JOSE AHIAS LOPEZ PORTILLO, Gustavo Gabriel Gonzalez, Camilo Sasía.
  • Swedish: Pelle Alstermo.
  • Tamil: Rajesh Waran, MUTHU VIJAY, Sankar Raj, Kadhireshan S, saravanan ramesh, Aravindh JANAKIRAMAN, Pandidurai R, Madhu Chakravarthy, Madhu Maha.
  • Turkish: Mehmet Yönügül, Özgür ERSOY, mehmetcan Gün, Misir Jafarov, Isa Inalcik, Fırat Eşki, Gökberk Nur, Safa Selim.
  • Ukrainian: Serhii Shulhin, Arthur Murauskas, Oleksandr Krasnokutskyi, Фомін Тарас.
  • Vietnamese: Dat Nguyen, Vương, Van-Tien Hoang, Dao Ngo, ng-hai.
© . This site is unofficial and not affiliated with Microsoft.