🚀 在 VS Code 中

2018 年 8 月 (版本 1.27)

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

下載:Windows: x64 | Mac: Intel | Linux 64 位元: deb rpm tarball | 32 位元: deb rpm tarball


歡迎使用 Visual Studio Code 2018 年 8 月發行版本。此版本包含許多重大更新,我們希望您會喜歡,以下是一些重點摘要

如果您想在線上閱讀這些版本資訊,請前往 Updates,網址為 code.visualstudio.com
您也可以觀看 Cloud Developer Advocate Brian Clark 製作的 1.27 版本重點影片

Insiders: 想盡快看到新功能嗎?您可以下載 Insiders 每日建置版本,並在最新更新可用時立即試用。如需最新的 Visual Studio Code 新聞、更新和內容,請在 Twitter 上追蹤我們 @code

工作台

設定編輯器

在過去幾個月中,我們一直在開發用於編輯設定的 GUI。在 1.27 版本中,我們將其設為預設設定編輯器。

Settings UI

您仍然可以使用 JSON 設定編輯器,方法是使用命令偏好設定:開啟使用者設定 (JSON) 或使用 "workbench.settings.editor" 設定變更您的預設設定編輯器。

我們本月進行的一項改進是透過將設定值描述 (enumDescriptions) 移至自訂下拉式選單控制項來清理 UI

dropdown

已修改的設定現在會以藍線標示,就像編輯器中已修改的行一樣。齒輪圖示會開啟內容選單,其中包含將設定重設為預設值的選項。

modified indicator and context menu

設定值現在已驗證,且會顯示任何驗證錯誤。

validation error

目錄現在在搜尋期間仍會保持可見,並篩選以僅顯示具有相符項目的類別。您可以按一下類別,將結果篩選為僅該類別下的設定。如果您希望在搜尋期間隱藏目錄,請將 "workbench.settings.settingsSearchTocBehavior" 設定為 "hidden"

settings search

當您在設定中搜尋時,我們由 Bing 驅動的搜尋服務仍會提供其認為相關的結果。現在,該服務也會向您顯示 Marketplace 中具有相關設定的擴充功能。您會在設定搜尋結果的底部看到一個按鈕,顯示相符的擴充功能。按一下時,[擴充功能] 檢視會開啟並顯示相符的擴充功能。

extension settings

Windows 和 Linux 上的自訂標題列和選單

在過去幾個反覆運算中,我們也一直努力改進 Windows 和 Linux 上標題列和選單的外觀、風格和可用性。在此反覆運算中,我們將移除預覽標籤,目標是讓其很快成為 Windows 上的預設體驗。若要啟用此功能,您可以將設定 "window.titleBarStyle" 設定為 "custom"

Custom Title Bar and Menus

相較於預設設定,新的體驗具有多項優勢

  • 整個產品中可主題化的標題列、選單列和內容選單。這表示您的深色佈景主題會保持深色!
  • 選單列中更佳的鍵盤導覽。我們讓使用鍵盤在選單之間切換以及使用選單助記鍵變得更容易。
  • 侵入性較低的選單列。當將 "window.menuBarVisibility" 設定為 "toggle" 時,新的體驗更精簡且較不突兀。
  • 更佳的協助工具。已解決數個協助工具問題,以改善螢幕助讀程式的選單可用性。

由於我們希望讓此新體驗成為 Windows 上的預設體驗,因此我們鼓勵您試用並向我們傳送您的意見反應,以便我們提供最佳的可能體驗。

階層連結改進

我們已調整新的階層連結列、進行各種改進並修正錯誤

  • 焦點文件符號現在會在編輯器中反白顯示。
  • 當執行焦點命令 (⇧⌘; (Windows、Linux Ctrl+Shift+;)) 時,會自動啟用階層連結。
  • 階層連結與佈景主題的搭配效果更好。
  • 階層連結現在會遵守檔案排除設定。

Breadcrumbs Highlights

新的終端機選單

工作選單已重新命名為終端機,並新增了一些整合式終端機的項目。

Terminal Menu

平台專屬鍵盤快速鍵

現在可以使用金鑰繫結 when 子句中的 isLinuxisMacisWindows,針對特定作業系統啟用鍵盤快速鍵

[
  {
    "key": "ctrl+o",
    "command": "workbench.action.files.openFolder",
    "when": "!isMac"
  },
  {
    "key": "cmd+o",
    "command": "workbench.action.files.openFolder",
    "when": "isMac"
  }
]

這讓跨不同機器共用您的 keybindings.json 檔案變得更容易。

將視窗以新的原生索引標籤開啟

新的僅限 macOS 命令 workbench.action.newWindowTab 會將視窗以新的原生索引標籤開啟。newWindowTab 沒有預設金鑰繫結,且需要啟用設定 window.nativeTabs

檔案在外部刪除/重新命名時不再關閉

我們已將 workbench.editor.closeOnFileDelete 設定的預設值從 true 變更為 false。這表示在 VS Code 外部 (或由另一個程式 (例如 Git 或來自整合式終端機的命令)) 刪除或重新命名的檔案將不再關閉做為編輯器索引標籤開啟的檔案。相反地,檔案會指出它已從磁碟刪除,而您只需儲存檔案即可還原它。

Deleted from Disk

注意: 除非檔案是未儲存的,否則檔案的內容在重新啟動之間不會保留。

中間按一下以在新編輯器中開啟檔案

現在可以使用滑鼠中鍵在 [檔案總管] 檢視中在新編輯器中開啟檔案,而不會在 預覽模式中重複使用先前的編輯器。

協助工具改進

我們已修正許多協助工具問題,主要與鍵盤導覽、螢幕助讀程式支援和焦點有關。完整清單可在此處找到。這是一項持續進行的工作,我們計劃在 9 月繼續進行。

改進的 Windows 背景更新

我們已對自訂 Windows 背景更新程式進行一些穩定性工作,以解決導致某些使用者安裝損毀的問題。這是一個持續進行的工作項目,在即將發行的版本中將有更多改進。

編輯器

自動關閉 & 周圍字元

當輸入某些括號 (例如 {[() 時,根據程式設計語言,當這些括號後面接著通常無法啟動運算式的特定字元 (例如 ;:.,=}])>) 時,預設會自動關閉。此行為可以使用 editor.autoClosingBrackets 設定自訂。同樣地,可以使用 editor.autoClosingQuotes 自訂輸入引號 (例如 "'`) 時的自動關閉行為。

當選取文字且您輸入其中一個字元時,選取範圍會以括號或引號括住。現在可以透過新的 editor.autoSurround 設定個別調整此行為。

語言

CSS 匯入的路徑自動完成

現在提供 CSS、SCSS 和 Less @import 的路徑自動完成。也處理了 SCSS 部分 @import

css-import

現在 CSS、SCSS 和 Less 中的 @importurl() 連結提供跳到定義功能。

css-definition

JSON

內建 JSON 語言擴充功能現在支援新的 JSON Schema Draft-07

最有趣的補充是 ifthenelse 關鍵字,允許條件式結構描述評估。

{
  "type": "integer",
  "minimum": 1,
  "maximum": 1000,
  "if": { "minimum": 100 },
  "then": { "multipleOf": 100 },
  "else": {
    "if": { "minimum": 10 },
    "then": { "multipleOf": 10 }
  }
}

if 關鍵字表示,如果值結構描述的結果通過驗證,則套用 then 結構描述,否則套用 else 結構描述。

HTML

HTML 格式器已更新至 JS Beautifier 的 1.8.1 版。

這會將新選項新增至 "html.format.wrapAttributes" 設定

  • 達到最大行長度時,"aligned-multiple" 會包裝屬性,並將所有包裝行與第一個屬性對齊。

aligned-multiple

TypeScript 3.0.3

VS Code 現在隨附 TypeScript 3.0.3。此次要版本修正了許多錯誤並提高了穩定性。您可以在此處閱讀有關完整變更集的資訊。

偵錯

已載入指令碼檢視現在可重複使用

一年多以來,偵錯檢視中的已載入指令碼瀏覽器是由 Node.js 偵錯擴充功能貢獻,且其他偵錯工具無法使用。在此版本中,我們已將 [已載入指令碼] 檢視新增為內建偵錯工具功能。所有具有「指令碼」概念的偵錯擴充功能都將能夠支援在動態更新的檢視中存取其指令碼。

此外,我們也改進了舊版 [已載入指令碼瀏覽器] 的一些缺點

  • 單一子資料夾的鏈現在會摺疊成單一節點。這讓您更容易向下鑽研深入但稀疏的資料夾階層。
  • 我們已開始解決協助工具問題。

中間按一下以移除中斷點

現在可以使用滑鼠中鍵在 [中斷點] 檢視中輕鬆移除中斷點。

將 "openDebug" 的預設值變更為在每次工作階段開始時開啟

對於新使用者來說,當您啟動偵錯工作階段且偵錯檢視並非每次都自動開啟時,有時可能會感到困惑。如果使用者尚不熟悉 UI,則他們不知道要尋找哪些關鍵字才能開啟 UI。為了避免混淆,我們將 debug.openDebug 的預設值變更為 openOnSessionStart,以便偵錯檢視在每次工作階段開始時開啟,而不僅僅是在第一次 (這是先前的預設行為)。

擴充功能撰寫

擴充功能記錄

做為 activate 函式的引數提供的 ExtensionContext 具有新的屬性 logPath。這是擴充功能可以儲存記錄檔之目錄的絕對檔案路徑。路徑對於擴充功能而言是唯一的,且不會由其他擴充功能重複使用。

語言伺服器通訊協定

新版本的語言伺服器通訊協定已推出,其中包含用於 VS Code 的對應節點模組。

新版本支援

  • 來自伺服器的程式碼動作種類公告,允許用戶端填入對應的選單項目。
  • 用於 textDocument/prepareRename 的實作。
  • 支援 工作區編輯中的檔案作業 (建立、重新命名和刪除)。

vscode-languageclient:JSON 記錄格式和記錄串流

先前,當使用 vscode-languageclient 建置語言伺服器擴充功能時,您可以指定 [langId].trace.server 以將 LSP 記錄傳送至 VS Code 輸出通道。

[langId].trace.server 現在可以機器可讀取的 JSON 格式輸出記錄資訊

"languageServerExample.trace.server": {
  "format": "json", // or "text"
  "verbosity": "verbose" // or "off" | "messages"
}

這開啟了有趣的用例,例如將 LSP 記錄串流至 LSP Inspector,以視覺化語言伺服器的行為

lsp-streaming

您可以在 Microsoft/language-server-protocol-inspectorlsp-log-streaming-sample 中深入瞭解。

偵錯擴充功能:內建的已載入指令碼檢視

[已載入指令碼瀏覽器] 現在是 VS Code 偵錯工具的內建元件。為了使用它,偵錯工具擴充功能需要以下列方式變更其偵錯工具配接器

  • supportsLoadedSourcesRequest 功能新增至從 initialize 要求傳回的 Capabilities,值為 true
  • 透過傳回目前已載入來源的集合來實作 loadedSources 要求。
  • 針對新載入或解除載入的來源傳送 loadedSource 事件。

新的佈景主題色彩

階層連結有新的佈景主題色彩

  • breadcrumb.background:階層連結項目的背景色彩。

設定編輯器有新的佈景主題色彩

  • settings.dropdownListBorder:新下拉式選單控制項的邊框色彩。
  • settings.modifiedItemIndicator:指示已修改設定的線條色彩。

Git 擴充功能 API

Git 擴充功能已開始公開更明確的 API。此 API 可由任何其他擴充功能用來與使用者工作區中開啟的 Git 存放庫互動。由於它仍處於初步階段,我們將在即將發行的版本中持續改進 API。

建議的擴充功能 API

每個里程碑都隨附新的建議 API,且擴充功能作者可以試用。與往常一樣,我們渴望您的意見反應。以下是您試用建議 API 必須執行的動作

  • 您必須使用 Insiders,因為建議 API 經常變更。
  • 您的擴充功能的 package.json 檔案中必須有這一行:"enableProposedApi": true
  • 將最新版本的 vscode.proposed.d.ts 檔案複製到您的專案中。

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

SCM:選取的原始檔控制

為了讓擴充功能知道使用者已選取哪些原始檔控制執行個體以在 UI 中顯示,SourceControl 執行個體現在具有 selected 屬性以及代表該狀態的 onDidChangeSelection 事件。

export interface SourceControl {
  /**
   * Whether the source control is selected.
   */
  readonly selected: boolean;

  /**
   * An event signaling when the selection state changes.
   */
  readonly onDidChangeSelection: Event<boolean>;
}

註解提供者

我們在此反覆運算中引入註解的概念,允許擴充功能在編輯器和新的註解面板中建立和管理對話。這讓擴充功能能夠支援程式碼檢閱案例。

註解會組織成執行緒並與特定文件相關聯。

export enum CommentThreadCollapsibleState {
  Collapsed = 0,
  Expanded = 1
}

interface CommentThread {
  threadId: string;
  resource: Uri;
  range: Range;
  comments: Comment[];
  collapsibleState?: CommentThreadCollapsibleState;
}

interface Comment {
  commentId: string;
  body: MarkdownString;
  userName: string;
  gravatar: string;
  command?: Command;
}

若要顯示註解,擴充功能必須註冊 DocumentCommentProviderWorkspaceCommentProvider

export interface CommentThreadChangedEvent {
  readonly added: CommentThread[];
  readonly removed: CommentThread[];
  readonly changed: CommentThread[];
}

interface CommentInfo {
  threads: CommentThread[];
  commentingRanges?: Range[];
}

interface DocumentCommentProvider {
  provideDocumentComments(
    document: TextDocument,
    token: CancellationToken
  ): Promise<CommentInfo>;
  createNewCommentThread(
    document: TextDocument,
    range: Range,
    text: string,
    token: CancellationToken
  ): Promise<CommentThread>;
  replyToCommentThread(
    document: TextDocument,
    range: Range,
    commentThread: CommentThread,
    text: string,
    token: CancellationToken
  ): Promise<CommentThread>;
  onDidChangeCommentThreads: Event<CommentThreadChangedEvent>;
}

interface WorkspaceCommentProvider {
  provideWorkspaceComments(token: CancellationToken): Promise<CommentThread[]>;
  onDidChangeCommentThreads: Event<CommentThreadChangedEvent>;
}

使用 DocumentCommentProvider,可以傳回開啟文件的註解。在提供註解時,擴充功能會同時指定文件上的目前執行緒,以及文件支援新增註解的範圍。註解可以從文件內新增或回覆。

A comment within an editor

當第一次註冊 WorkspaceCommentProvider 時,CommentsPanel 會變成可見,並顯示提供給它的所有註解。註解會依註解執行緒和資源分組。當在面板中選取註解時,會執行註解 command,因此擴充功能會決定行為。

Comments panel

預覽功能

預覽功能尚未準備好發行,但功能已足夠使用。我們歡迎您在開發期間提供早期意見反應。

Electron 3.0 探索

在此里程碑期間,我們探索將 Electron 3.0.0 捆綁到 VS Code 中。這是主要的 Electron 版本,隨附 Chrome 66 和 Node.js 10.x (與我們目前的版本 (具有 Chrome 61 和 Node.js 8.x) 相比,是一大躍進)。我們計劃在不久的將來將更新推送給我們的 Insiders 使用者,以收集更多意見反應。如果您有興趣協助,請務必安裝 VS Code Insiders

工程

擴充功能和 webpack

我們現在使用 webpack 來捆綁擴充功能。它解鎖了兩個成就:(1) 減少擴充功能的啟動時間,因為要載入的檔案更少,且要剖析的原始碼更少;(2) 減少安裝時間,因為需要解壓縮和寫入磁碟的檔案更少。到目前為止,我們已將捆綁大小減少約 4000 個檔案!

效能 Canary

我們新增了測試線束,以確保我們的啟動效能不會倒退。有一個新的指令碼可以部署到專用機器,以測試 Insider 建置版本的效能。指令碼只會安裝最新的建置版本,並確保它在時間限制內啟動。目前,我們從 Windows 開始,因為效能通常會受到防毒軟體更新的影響,但計劃是在我們支援的所有平台上進行測試。

IPC 堆疊改進

我們已改進我們自行開發的 IPC 堆疊,以支援處理序之間的位元組緩衝區訊息。這啟用了一些特定案例,例如在我們的不同處理序之間傳送二進位資料而沒有額外負荷,以及讓我們最佳化 IPC 以提高效能。

重大修正

  • 6363:儲存時移除替代資料流
  • 25919:強制以原生索引標籤開啟新視窗的新命令
  • 49021:不要在儲存時重設 WSL 權限中繼資料
  • 49403:自動附加導致在整合式終端機中偵錯時發生問題
  • 55025:允許在擴充功能主機重新啟動時繼續偵錯
  • 56084:[開啟的編輯器]:重新檢視群組順序,使其以視覺順序為基礎
  • 56691:路徑中存在 # 時啟動 vscode 時發生錯誤
  • 57018:停止/重新啟動偵錯工具無法停止 babel-node

感謝您

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

vscode 的貢獻

vscode-vsce 的貢獻

vscode-eslint 的貢獻

language-server-protocol 的貢獻

vscode-languageserver-node 的貢獻

debug-adapter-protocol 的貢獻

vscode-css-languageservice 的貢獻

vscode-html-languageservice 的貢獻

vscode-json-languageservice 的貢獻

node-jsonc-parser 的貢獻

vscode-generator-code 的貢獻

localization 的貢獻

Transifex VS Code 專案團隊中,有將近 1200 位成員,每月約有 100 位活躍貢獻者。我們感謝您的貢獻,無論是提供新的翻譯、為翻譯投票,或是建議流程改進。

以下是此版本的貢獻者快照。如需專案詳細資訊,包括貢獻者名稱清單,請造訪專案網站:https://aka.ms/vscodeloc

  • 保加利亞語: Любомир Василев。
  • 克羅埃西亞語: Nikša Mihaica。
  • 丹麥語: Christoffer Bech。
  • 英語 (英國): Matthew John Cheetham, Swotboy2000。
  • 芬蘭語: Petri Niinimäki, Feetu Nyrhinen, Jussi Palo。
  • 法語: Antoine Griffard, Guillaume Bauer, Smrman。
  • 德語: Carsten Siemens, Carsten Kneip, Jonas Droste, Markus Hatvan, Christian Studer, Peter Schneider, Jonas Keller, thefreshman89。
  • 匈牙利語: Tar Dániel, Bence László。
  • 簡體中文: Joel Yang, 子实 王, Wang Dongcheng, pluwen, DongWei, Henry Chu, aimin guo, Chris Pan 潘冬冬, 子昂 马。
  • 繁體中文: Duran Hsieh, Winnie Lin, Poy Chang, Alan Tsai。
  • 印尼語: Wildan Mubarok, G-RiNe Project。
  • 義大利語: Luca Bruni, Alessandro Alpi, Andrea Dottor, Emanuele Curati, Riccardo Cappello, Gianluca Acerbis, Emilie Rollandin, Marco Dal Pino, Luigi Bruno, Lorthirk, Aldo Donetti。
  • 日語: Shunya Tajima, Satoshi Kajiura, Yuichi Nukiyama, Hiroyuki Mori, yoshioms。
  • 韓語: Kyunghee Ko, PaulNara, smallsnail, Kwangjin Hwang。
  • 立陶宛語: Tomas Cimermonas。
  • 波蘭語: Artur, hawkeye116477, Patryk Brejdak, Mateusz Gazdziak, Robert Skórski, Sebastian Baran。
  • 葡萄牙語 (巴西): Roberto Fonseca, Bruno Sonnino, Marcelo Fernandes, Lucas Miranda, João Mesquita, Danilo Dantas, Rodrigo Crespi, Arthur Bruel, Thiago Moreira de Souza Arrais, Otacilio Saraiva Maia Neto, Loiane Groner, Fabio Correia。
  • 葡萄牙語 (葡萄牙): Richard Nunes, Daniel Correia, Tiago Costa。
  • 羅馬尼亞語: Bogdan Mateescu, Szauka。
  • 俄語: Roman Slauta, Ivan Kuzmenko。
  • 西班牙語: Alejandro Medina, José M. Aguilar, Roberto Fonseca, Javier Moreno, Andy Gonzalez, Alberto Poblacion, Nancy Todd, Antonio Sanmartín。
  • 泰盧固語: Hari Jujjavarapu, Sridhar L。