🚀 在 VS Code 中免費取得

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 支援實用的功能,例如多個游標和移動/複製行命令。

多根目錄 Explorer 中的兩步驟摺疊

當您使用 多根目錄工作區時,「檔案總管」中的 摺疊資料夾 按鈕現在具有兩步驟行為。第一次按一下會摺疊每個最上層資料夾內的所有資料夾,第二次按一下會摺疊最上層資料夾。「搜尋」檢視已具有此行為。

Two-step File Explorer collapse button

主題:Monokai

根據 OS 色彩配置自動切換主題

Windows 和 macOS 現在支援淺色和深色色彩配置。有一個新的設定 window.autoDetectColorScheme,指示 VS Code 監聽 OS 色彩配置的變更,並相應地切換到相符的主題。

若要自訂色彩配置變更時使用的主題,您可以使用下列設定設定慣用的淺色和深色主題

  • workbench.preferredLightColorTheme
  • workbench.preferredDarkColorTheme

編輯器

控制「查看」檢視焦點

有一個新的設定和命令可以控制「查看」檢視初始放置焦點的位置。依預設,「查看」會將焦點放在右手邊的樹狀結構上,以便您可以快速導覽至參考。「查看」的初始焦點放在樹狀結構上,對於想要使用「查看」在編輯器中進行快速程式碼變更的人來說並不是最佳選擇。您現在可以使用 editor.peekWidgetDefaultFocus 設定定義您的偏好設定,它可以設定為 editortree。還有一個新的命令 togglePeekWidgetFocus (⌘K F2 (Windows、Linux Ctrl+K F2)) 可讓您在「查看」編輯器和樹狀結構之間移動焦點。

折疊區域醒目提示

現在更容易發現折疊程式碼區域,因為新增了背景醒目提示。

Fold highlight color

主題:Dark+

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

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

折疊改進

按住 Shift 並在折疊指示器上按一下一次,即可先折疊內部範圍。再次按住 Shift 並按一下 (當所有內部範圍都已折疊時) 將會折疊父系。再次按住 Shift 並按一下會展開所有項目。

Folding with Shift + Click

當在已折疊的範圍上使用 折疊 命令 (⌥⌘[ (Windows、Linux Ctrl+Shift+[)) 時,下一個未折疊的父系範圍將會被折疊。

新的換行選項

依預設,編輯器會假設所有字元的寬度都相同來計算自動換行符號。此假設可讓預設演算法快速運作,但在使用非等寬字型,或在字元寬度不同的指令碼中撰寫文字時,其結果不佳。有一個新的設定 editor.wrappingStrategy,可以設定為 advanced,讓編輯器將自動換行符號計算委派給瀏覽器。

協助工具

建議小工具改進

建議小工具現在不再使用 ARIA 警示,並正確地向螢幕閱讀器指示它已聚焦。這應該可以防止螢幕閱讀器意外地造成干擾。

當偵測到螢幕閱讀器時,editor.accessibilityPageSize 設定為 160

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

搭配 Orca 的 Linux 協助工具

我們已開始研究如何使用 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
}

例如,我們已將 presentation 新增至某些 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' 標籤的問題來追蹤進度。如果您對您想在此檢視中看到的其他類型資訊有任何想法,請告訴我們!

搜尋編輯器

我們已繼續開發新的「搜尋編輯器」,此反覆運算的目標是讓「搜尋編輯器」成為主要的搜尋體驗。為此,我們實作了一個 UI,用於設定「搜尋編輯器」的查詢

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 中的 Marketplace 安裝。您可以透過啟用 debug.javascript.usePreview 設定,開始將它與您現有的啟動組態搭配使用。以下是我們本月新增的一些新功能。

新的 JS 偵錯工具將自動偵錯您在新 JavaScript 偵錯終端機中執行的命令,您可以透過 偵錯:建立 JavaScript 偵錯終端機 命令開啟該終端機

JavaScript debug terminal

主題:Earthsong,字型:Fira Code

新的偵錯工具也在您 package.jsonscripts 區段中提供 偵錯 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 擴充功能,立即輕鬆試用所有這些新的 TypeScript 3.8 功能。如果您在使用 TypeScript 3.8 Beta 時遇到任何錯誤,請分享意見反應並告訴我們!

擴充功能貢獻

Java 偵錯工具支援資料中斷點

Java 偵錯工具 擴充功能現在支援 資料中斷點,這是 VS Code 1.38 中引入的功能。此功能可讓您建立在中斷點,當變數的值變更時,就會命中這些中斷點。

您可以在下方看到偵錯工具在 Owner.telephone 字串變更時中斷

Java Data Breakpoints

Java 呼叫階層檢視

Java 語言支援 擴充功能現在支援 呼叫階層 檢視,它會顯示從函式或到函式的所有呼叫,並讓您可以深入探究呼叫者的呼叫者和呼叫的呼叫。

在符號上按一下滑鼠右鍵,然後選取 查看 > 查看呼叫階層 以查看呼叫階層

Java Call Hierarchy view

遠端開發

遠端開發 擴充功能 的開發工作仍在繼續,這些擴充功能可讓您使用容器、遠端電腦或 Windows Linux 子系統 (WSL) 作為全功能開發環境。

1.42 中的功能重點包括

  • Remote - SSH:改進了對 Windows 伺服器的支援,包括自動 OS 偵測。
  • WSL:支援 在檔案總管中顯示,以開啟 WSL 資源的 Windows 檔案總管。
  • Dev Containers:預先建置的容器映像,其中包含 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+

上面的 hover 範例正在渲染每個可用的 codicon。hover 是使用下面的程式碼片段建立的,但為了可讀性,大多數 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"
            }
        }
    }
}

組態 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}) {
    }
});

如需更多資訊,請參閱 組態 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 hook 用於存取替換變數

偵錯的擴充功能 API 在 DebugConfigurationProvider 上提供了一個 hook resolveDebugConfiguration,可用於在偵錯組態傳遞到偵錯配接器之前驗證它。由於此 hook 是在變數被替換之前呼叫的,因此驗證程式碼可以輕鬆地將更多變數新增到偵錯組態中,並且仍然可以及時替換它們。

這種方法可能會使在 resolveDebugConfiguration hook 中使用已解析的變數值變得困難,例如,驗證或實作僅存在於擴充功能中的功能(而不是在偵錯配接器中,替換後的值可用的)。請參閱 issue #85206 以取得範例。一些擴充功能已開始自行替換變數(這通常是不完整的,因為它不涵蓋所有情況)。

從使用者的角度來看,這是令人困惑的。在偵錯組態中,可以使用某些屬性變數(因為它們在替換發生後在偵錯配接器中處理),而某些屬性變數不能使用(因為它們在擴充功能中處理,而替換尚未發生)。Issue #87450 是後一個問題的一個很好的例子。

在這個里程碑中,我們透過在 DebugConfigurationProvider 中新增第二個 hook resolveDebugConfigurationWithSubstitutedVariables 來解決這個問題,該 hook 接收具有所有變數都已替換的偵錯組態。

隨著這個新 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)需要實作 偵錯配接器協定。由於我們不想在 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
  }
}

由於偵錯配接器協定(作為 node 模組 vscode-debugprotocol 提供)是 vscode.DebugAdapter 介面的相容超集,因此如果您需要完整協定並想完全自行實作偵錯配接器,則可以匯入該模組。

一個更簡單的替代方案是(繼續)使用我們的偵錯配接器預設實作,作為 node 模組 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",
    // ...
  }]

我們建議受影響的擴充套件在二月份的時間範圍內調整其對新 API 的實作,以便我們有足夠的時間在三月份之前修復問題。

建議的擴充功能 API

每個里程碑都帶有新的建議 API,擴充套件作者可以試用它們。與往常一樣,我們渴望您的回饋。這是您試用建議 API 必須執行的操作

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

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

新增工作區編輯中繼資料

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

語意醒目提示

如果您有興趣為您的語言新增語意醒目提示,語意醒目提示概述 提供了概念和新 API 的摘要。

驗證提供者

某些擴充套件需要驗證到其他服務。 issue #88309 中的提案將使擴充套件可以註冊可由其他擴充套件存取的驗證提供者,從而為執行驗證提供通用機制。

時間軸提供者

擴充功能很快就能夠將它們自己的來源貢獻到新的 時間軸檢視 中。有興趣新增您自己的時間軸來源嗎?請查看 issue #84297 中的這個早期提案,並提供您擁有的任何回饋。

Documentation.Refactoring 貢獻點

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

Refactoring documentation

建議的貢獻點讓擴充套件可以透過使用命令來控制文件的顯示方式

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

Issue #86788 追蹤提案的狀態。

自訂編輯器的備份和熱退出 hook

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

此調查的結果是在 WebviewCustomEditorEditingDelegate 介面上新增了一個可選的 backup 方法。VS Code 會在資源變更後大約一秒鐘呼叫此方法。在 backup 方法內部,擴充套件應在其目前狀態下持久化資源。最常見的情況是將資源寫入工作區儲存資料夾。然後,當重新載入編輯器時,它應該檢查是否存在任何持久化的備份,然後再從工作區本身載入資源。

我們將在下一個迭代中繼續迭代自訂編輯器 API。

複雜的完成標籤

我們正在發展 CompletionItem API,以容納需要提供限定名稱、匯入路徑、傳回類型和其他資訊的複雜完成項目。資訊必須預先提供,而不是稍後解析。提供的資訊將會行內顯示在建議小工具中。我們將在下一個迭代中迭代 目前的提案。同時,我們正在考慮 在建議小工具中新增狀態列,以解決一些 UI 和可探索性挑戰。我們期待您對 API 的回饋。

Complex completion label

佈景主題:Nord,字型:Input Mono

診斷錯誤現在可以與其錯誤程式碼相關聯連結。當提供連結時,它將顯示在「問題」面板、行內錯誤檢視和診斷錯誤 hover 中。當我們在下一個迭代中繼續處理此功能時,您可以在 issue #11847 中提供回饋。

Diagnostic with link

語言伺服器協定

3.15 版本的 語言伺服器協定 現在可用。我們也發布了適用於 VS Code LSP client 和以 Node.js 撰寫的 LSP 伺服器 的對應 npm 模組。最新版本的程式庫包含語意 token 的建議規格和實作。

LSP 網站現在託管 語言伺服器索引格式規格 的初步版本,以及對應的 LSIF 概述

瀏覽器支援

將檔案拖放到編輯器中

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

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-configuration 和我們的 自訂規則。最後但並非最不重要的一點是,我們也更新了 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:當連線到不區分大小寫平台上的區分大小寫檔案系統時,Explorer 樹狀結構未顯示正確的內容
  • 83543:偵錯程式位置僅針對活動工作階段顯示
  • 85057:將對話方塊詳細資訊移動到自訂對話方塊中的描述列
  • 86445:無法透過熱鍵同時刪除多個監看式偵錯變數
  • 88240:建立許多監看式下拉式選單運算式時速度很慢
  • 89057:讓唯讀編輯器顯示問題
  • 89405:文字檔:不要為唯讀模型報告 dirty 狀態

感謝您

最後但同樣重要的是,非常感謝以下人士協助使 VS Code 變得更好

對我們的 issue tracking 的貢獻

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。
  • 簡體中文: 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。
  • 繁體中文: Winnie Lin、船長、Alan Tsai、TingWen Su。
  • 印尼文: Eriawan Kusumawardhono、Aldila、Arif Fahmi、Laurensius Dede Suhardiman、Mychael Go、Christian Elbrianno、Septian Adi。
  • 義大利文: Alessandro Alpi、Luigi Bruno。
  • 日文: Takayuki Fuwa、Seiichi Ariga、Koichi Makino、Yoshihisa Ozaki、貴康 内田、Ishii Shun、Kyohei Uchida、TENMYO Masakazu、Aya Tokura。
  • 韓文: Hongju。
  • 拉脫維亞文: Andris Vilde。
  • 挪威文: Frode Aarebrot、Anders Stensaas、Thomas Ødegård、Thomas Isaksen。
  • 波蘭文: Makabeus Orban、Mateusz Redynk、Kacper Łakomski、Piotr Rysak、Wojciech Maj、Oskar Janczak、Szymon Seliga、Franx Bar、Marcin Anonimus。
  • 葡萄牙文 (巴西): 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。
  • 葡萄牙文 (葡萄牙): Francisco Osorio、Luís Chaves、Ricardo Sousa Vieira、João Fernandes。
  • 羅馬尼亞文: Tiberiu Frățilă、LaServici、Dan Ichim。
  • 俄文: Vadim Svitkin、Николай Соколовский、Дмитрий Кирьянов、Baturin Valery。
  • 塞爾維亞文 (西里爾文): Dusan Milojkovic。
  • 西班牙文: José María Aguilar、Ricardo Estrada Rdez、JOSE AHIAS LOPEZ PORTILLO、Gustavo Gabriel Gonzalez、Camilo Sasía。
  • 瑞典文: Pelle Alstermo。
  • 坦米爾文: Rajesh Waran、MUTHU VIJAY、Sankar Raj、Kadhireshan S、saravanan ramesh、Aravindh JANAKIRAMAN、Pandidurai R、Madhu Chakravarthy、Madhu Maha。
  • 土耳其文: Mehmet Yönügül、Özgür ERSOY、mehmetcan Gün、Misir Jafarov、Isa Inalcik、Fırat Eşki、Gökberk Nur、Safa Selim。
  • 烏克蘭文: Serhii Shulhin、Arthur Murauskas、Oleksandr Krasnokutskyi、Фомін Тарас。
  • 越南文: Dat Nguyen、Vương、Van-Tien Hoang、Dao Ngo、ng-hai。