CINXE.COM
May 2023 (version 1.79)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="awa-expId" content="vscw_aaflight1016_treatment:103440;" /> <meta name="awa-env" content="prod" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="google-site-verification" content="hNs7DXrTySP_X-0P_AC0WulAXvUwgSXEmgfcO2r79dw" /> <!-- Twitter and Facebook OpenGraph Metadata--> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:site" content="@code" /> <meta name="description" content="Learn what is new in the Visual Studio Code May 2023 Release (1.79)" /> <meta name="keywords" content="" /> <!-- Twitter and Facebook OpenGraph Metadata--> <meta name="twitter:card" content="summary_large_image" /> <meta property="og:url" content="https://code.visualstudio.com/updates/v1_79" /> <meta property="og:type" content="article" /> <meta property="og:title" content="May 2023 (version 1.79)" /> <meta property="og:description" content="Learn what is new in the Visual Studio Code May 2023 Release (1.79)" /> <meta property="og:image" content="https://code.visualstudio.com/assets/updates/1_79/release-highlights.png" /> <link rel="shortcut icon" href="/assets/favicon.ico" sizes="128x128" /> <link rel="apple-touch-icon" href="/assets/apple-touch-icon.png"> <title>May 2023 (version 1.79)</title> <link rel="stylesheet" href="/vendor/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="/dist/v2/style.css"> <script src="https://consentdeliveryfd.azurefd.net/mscc/lib/v2/wcp-consent.js"></script> <script type="text/javascript" src="https://js.monitor.azure.com/scripts/c/ms.analytics-web-4.min.js"></script> <script type="text/javascript"> // Leave as var; siteConsent is initialized and referenced elsewhere. var siteConsent = null; const GPC_DataSharingOptIn = false; WcpConsent.onInitCallback(function () { window.appInsights = new oneDS.ApplicationInsights(); window.appInsights.initialize({ instrumentationKey: "1a3eb3104447440391ad5f2a6ee06a0a-62879566-bc58-4741-9650-302bf2af703f-7103", propertyConfiguration: { userConsented: false, gpcDataSharingOptIn: false, callback: { userConsentDetails: siteConsent ? siteConsent.getConsent : undefined }, }, cookieCfg: { ignoreCookies: ["MSCC"] }, webAnalyticsConfiguration:{ // Web Analytics Plugin configuration urlCollectQuery: true, urlCollectHash: true, autoCapture: { scroll: true, pageView: true, onLoad: true, onUnload: true, click: true, resize: true, jsError: true } } }, []); window.appInsights.getPropertyManager().getPropertiesContext().web.gpcDataSharingOptIn = GPC_DataSharingOptIn; }); </script> <link rel="alternate" type="application/atom+xml" title="RSS Feed for code.visualstudio.com" href="/feed.xml" /> </head> <body > <!-- Setting theme here to avoid FOUC --> <script> function setTheme(themeName) { if (themeName === 'dark') { document.documentElement.removeAttribute('data-theme'); // dark is default, so no data-theme attribute needed } if (themeName === 'light') { document.documentElement.setAttribute('data-theme', themeName); } return; } // Determine initial theme: user preference or system preference let theme = localStorage.getItem('theme') || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); setTheme(theme); // Apply the initial theme // Listen for changes in the system theme preference window.matchMedia('(prefers-color-scheme: dark)').addListener(e => { if (!localStorage.getItem('theme')) { // Only if no user preference is saved setTheme(e.matches ? 'dark' : 'light'); } }); </script> <div id="main"> <div class="navbar-fixed-container"> <div class="navbar navbar-inverse navbar-fixed-top " data-spy="affix" data-offset-top="1"> <div id='cookie-banner'></div> <nav role="navigation" aria-label="Top Level"> <div class="container"> <div class="nav navbar-header"> <a class="navbar-brand" href="/"><span>Visual Studio Code</span></a> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse" aria-label="Expand and Collapse Menu"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> </div> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav navbar-left"> <li ><a id="nav-docs" href="/docs">Docs</a></li> <li class="active" ><a id="nav-updates" href="/updates">Updates</a></li> <li ><a id="nav-blogs" href="/blogs">Blog</a></li> <li ><a id="nav-extend" href="/api">API</a></li> <li><a href="https://marketplace.visualstudio.com/VSCode" target="_blank" rel="noopener" id="nav-extensions">Extensions</a></li> <li ><a id="nav-faqs" href="/docs/supporting/faq">FAQ</a></li> <li class='search visible-xs visible-sm' ><a href="/Search">Search</a></li> <li ><a id="nav-copilot" href="/docs/copilot/overview">GitHub Copilot</a></li> </ul> </ul> <ul class="nav navbar-nav navbar-right" role="presentation"> <li> <button type="button" class="theme-switch" id="theme-toggle"> <img class="theme-icon-light" src="/assets/icons/theme-light.svg" alt="Switch to the dark theme" /> <img class="theme-icon-dark" src="/assets/icons/theme-dark.svg" alt="Switch to the light theme" /> </button> </li> <li> <a href="/Search" title="Search" class="btn search-btn" id="nav-search"> <img class="search-icon-light" src="/assets/icons/search.svg" width="16px" height="16px" alt="Search" /> <img class="search-icon-dark" src="/assets/icons/search-dark.svg" width="16px" height="16px" alt="Search" /> </a> </li> <li class="search" role="presentation"> <form class="nav-search search-form" role="search" aria-label="Search"> <div class="input-group" role="presentation"> <input type="text" name="q" class="search-box form-control" placeholder="Search Docs" aria-label="Search text"/> <span class="input-group-btn"> <button tabindex="0" class="btn" type="submit" aria-label="Search"> <img class="search-icon-dark" src="/assets/icons/search-dark.svg" alt="Search" /> <img class="search-icon-light" src="/assets/icons/search.svg" alt="Search" /> </button> </span> </div> </form> </li> <!-- this was hiden in the home and download page, keeping it for now --> <li><a class="link-button" href="/Download" id="nav-download"> <span>Download</span></a></li> </ul> </div> </div> </nav> </div> </div> <div class="updates-banner "> <div class="container"> <p class="message">🚀 Get <a class="copilot-deep-link" href="vscode://github.copilot-chat?referrer=vscode-updatebanner" id="banner-link-updates" rel="noopener">GitHub Copilot Free</a> in VS Code!</p> </div> <div tabindex="0" role="button" title="Dismiss this update" class="dismiss-btn" id="banner-dismiss-btn"><span class="sr-only">Dismiss this update</span><span aria-hidden="true" class="glyph-icon"></span></div> </div> <!-- This div wraps around the entire site --> <!-- The body itself should already have a main tag --> <div id="main-content"> <div class="container body-content docs releases"> <div class="row"> <!-- left nav --> <div class="col-xs-12 col-md-2 docs-navbar-container"> <nav id="docs-navbar" aria-label="Updates" class="docs-nav updates-nav visible-md visible-lg"> <h4>Updates</h4> <ul class="nav"> <li > <a href="/updates/v1_97" >January 2025</a> </li> <li > <a href="/updates/v1_96" >November 2024</a> </li> <li > <a href="/updates/v1_95" >October 2024</a> </li> <li > <a href="/updates/v1_94" >September 2024</a> </li> <li > <a href="/updates/v1_93" >August 2024</a> </li> <li > <a href="/updates/v1_92" >July 2024</a> </li> <li > <a href="/updates/v1_91" >June 2024</a> </li> <li > <a href="/updates/v1_90" >May 2024</a> </li> <li > <a href="/updates/v1_89" >April 2024</a> </li> <li > <a href="/updates/v1_88" >March 2024</a> </li> <li > <a href="/updates/v1_87" >February 2024</a> </li> <li > <a href="/updates/v1_86" >January 2024</a> </li> <li > <a href="/updates/v1_85" >November 2023</a> </li> <li > <a href="/updates/v1_84" >October 2023</a> </li> <li > <a href="/updates/v1_83" >September 2023</a> </li> <li > <a href="/updates/v1_82" >August 2023</a> </li> <li > <a href="/updates/v1_81" >July 2023</a> </li> <li > <a href="/updates/v1_80" >June 2023</a> </li> <li class="active"> <a href="/updates/v1_79" aria-label="Current Page: May 2023">May 2023</a> </li> <li > <a href="/updates/v1_78" >April 2023</a> </li> <li > <a href="/updates/v1_77" >March 2023</a> </li> <li > <a href="/updates/v1_76" >February 2023</a> </li> <li > <a href="/updates/v1_75" >January 2023</a> </li> </ul> </nav> <nav id="small-nav" aria-label="Updates" class="docs-nav updates-nav hidden-md hidden-lg"> <label class="faux-h4" for="small-nav-dropdown">Updates</label> <select id="small-nav-dropdown" aria-label="updates"> <option value="/updates/v1_97" >January 2025</option> <option value="/updates/v1_96" >November 2024</option> <option value="/updates/v1_95" >October 2024</option> <option value="/updates/v1_94" >September 2024</option> <option value="/updates/v1_93" >August 2024</option> <option value="/updates/v1_92" >July 2024</option> <option value="/updates/v1_91" >June 2024</option> <option value="/updates/v1_90" >May 2024</option> <option value="/updates/v1_89" >April 2024</option> <option value="/updates/v1_88" >March 2024</option> <option value="/updates/v1_87" >February 2024</option> <option value="/updates/v1_86" >January 2024</option> <option value="/updates/v1_85" >November 2023</option> <option value="/updates/v1_84" >October 2023</option> <option value="/updates/v1_83" >September 2023</option> <option value="/updates/v1_82" >August 2023</option> <option value="/updates/v1_81" >July 2023</option> <option value="/updates/v1_80" >June 2023</option> <option value="/updates/v1_79" selected>May 2023</option> <option value="/updates/v1_78" >April 2023</option> <option value="/updates/v1_77" >March 2023</option> <option value="/updates/v1_76" >February 2023</option> <option value="/updates/v1_75" >January 2023</option> </select> </nav> </div> <!-- small right nav --> <div class="col-xs-12 visible-xs"> <nav aria-labelledby="small-right-nav-label" class="small-nav docs-nav updates-nav"> <label class="faux-h4" for="small-right-nav-dropdown" id="small-right-nav-label">In this update</label> <select id="small-right-nav-dropdown" class="small-nav-select" aria-label="Sections"> <option value="#_accessibility">Accessibility</option> <option value="#_workbench">Workbench</option> <option value="#_editor">Editor</option> <option value="#_terminal">Terminal</option> <option value="#_source-control">Source Control</option> <option value="#_notebooks">Notebooks</option> <option value="#_languages">Languages</option> <option value="#_remote-development">Remote Development</option> <option value="#_contributions-to-extensions">Contributions to extensions</option> <option value="#_preview-features">Preview features</option> <option value="#_webassemblies-in-vs-code-for-the-web">WebAssemblies in VS Code for the Web</option> <option value="#_extension-authoring">Extension authoring</option> <option value="#_proposed-apis">Proposed APIs</option> <option value="#_engineering">Engineering</option> <option value="#_vs-code-at-microsoft-build">VS Code at Microsoft Build</option> <option value="#_notable-fixes">Notable fixes</option> <option value="#_thank-you">Thank you</option> </select> </nav> </div> <!-- main content --> <main class="col-xs-12 col-sm-9 col-md-8 body"> <div class="edit-github pull-right"> <a href="https://vscode.dev/github/microsoft/vscode-docs/blob/main/release-notes/v1_79.md" class="btn btn-default" title="Edit this document in vscode.dev"> <span class="glyphicon glyphicon-pencil"></span> <span class="hidden-xs">Edit</span> </a> </div> <h1>May 2023 (version 1.79)</h1> <p><strong>Update 1.79.1</strong>: The update addresses this security <a href="https://github.com/microsoft/vscode/issues?q=is%3Aissue+milestone%3A%22May+2023+Recovery+1%22+is%3Aclosed" class="external-link" target="_blank">issue</a>.</p> <p><strong>Update 1.79.2</strong>: The update addresses these <a href="https://github.com/microsoft/vscode/issues?q=is%3Aissue+milestone%3A%22May+2023+Recovery+2%22+is%3Aclosed" class="external-link" target="_blank">issues</a>.</p> <p>Downloads: Windows: <a href="https://update.code.visualstudio.com/1.79.2/win32-x64-user/stable">x64</a> <a href="https://update.code.visualstudio.com/1.79.2/win32-arm64-user/stable">Arm64</a> | Mac: <a href="https://update.code.visualstudio.com/1.79.2/darwin-universal/stable">Universal</a> <a href="https://update.code.visualstudio.com/1.79.2/darwin/stable">Intel</a> <a href="https://update.code.visualstudio.com/1.79.2/darwin-arm64/stable">silicon</a> | Linux: <a href="https://update.code.visualstudio.com/1.79.2/linux-deb-x64/stable">deb</a> <a href="https://update.code.visualstudio.com/1.79.2/linux-rpm-x64/stable">rpm</a> <a href="https://update.code.visualstudio.com/1.79.2/linux-x64/stable">tarball</a> <a href="https://code.visualstudio.com/docs/supporting/faq#_previous-release-versions">Arm</a> <a href="https://update.code.visualstudio.com/1.79.2/linux-snap-x64/stable">snap</a></p> <hr> <p>Welcome to the May 2023 release of Visual Studio Code. There are many updates in this version that we hope you'll like, some of the key highlights include:</p> <ul> <li><strong><a href="#_readonly-mode">Read-only mode</a></strong> - Mark specific files and folders in your workspace as read-only.</li> <li><strong><a href="#_paste-as">'Paste as' options</a></strong> - Choose how you'd like item links pasted into the editor.</li> <li><strong><a href="#_copy-external-media-files-into-workspace-on-drop-or-paste-for-markdown">Automatic copy of external files</a></strong> - Drag or paste to Markdown adds new files to your workspace.</li> <li><strong><a href="#_default-branch-name">Default Git repo branch name</a></strong> - Use "main" as the default or override via a user setting.</li> <li><strong><a href="#_rich-content-search">Notebooks rich content search</a></strong> - Search based on Notebook output or filter on cell type.</li> <li><strong><a href="#_linked-editing-for-jsx-tags">Linked editing for JSX tags</a></strong> - Simultaneously change opening and closing JSX tags.</li> <li><strong><a href="#_github-copilot">Preview: GitHub Copilot Chat improvements</a></strong> - Easily manage your chat session history. Inline chat "live preview."</li> <li><strong><a href="#_vs-code-at-microsoft-build">VS Code at Microsoft Build 2023</a></strong> - Catch up on the sessions in the YouTube playlist.</li> </ul> <blockquote><p>If you'd like to read these release notes online, go to <a href="https://code.visualstudio.com/updates">Updates</a> on <a href="https://code.visualstudio.com">code.visualstudio.com</a>.</p> </blockquote><p><strong>Insiders:</strong> Want to try new features as soon as possible? You can download the nightly <a href="https://code.visualstudio.com/insiders">Insiders</a> build and try the latest updates as soon as they are available.</p> <h2 id="_accessibility" data-needslink="_accessibility">Accessibility</h2> <h3 id="_verbosity-settings" data-needslink="_verbosity-settings">Verbosity settings</h3> <p>Additional <a href="https://code.visualstudio.com/updates/v1_78#_aria-verbosity-settings">accessibility.verbosity</a> settings have been added to inform screen reader users how to interact with features when they are focused.</p> <p>For <a href="#_github-copilot">GitHub Copilot</a>, there are hints describing how to access the accessible help menus for the Copilot chat view and in editor code chat via:</p> <ul> <li><code>accessibility.verbosity.panelChat</code></li> <li><code>accessibility.verbosity.inlineChat</code></li> </ul> <p>These help menus provide information about what to expect, how to navigate from the input box to other elements, and more.</p> <p>Other new <code>verbosity</code> settings provide information for specific VS Code UI:</p> <ul> <li><code>accessibility.verbosity.keybindingsEditor</code> - when in the Keyboard Shortcuts editor.</li> <li><code>accessibility.verbosity.notebook</code> - when in a notebook.</li> </ul> <p>The <code>accessibility.verbosity</code> settings are enabled by default (set to 'true') but you can silence them individually.</p> <h3 id="_settings-editor" data-needslink="_settings-editor">Settings editor</h3> <p>VoiceOver on macOS now reads the descriptions of enum setting options in the Settings editor. Try it out with enum settings such as <code>files.autoSave</code> and <code>editor.accessibilitySupport</code>.</p> <p><img src="/assets/updates/1_79/enum-setting-voiceover.png" alt="onFocusChange option description of files.autoSave setting being displayed by VoiceOver's high-contrast textbox on macOS" loading="lazy"></p> <h2 id="_workbench" data-needslink="_workbench">Workbench</h2> <h3 id="_readonly-mode" data-needslink="_readonly-mode">Readonly mode</h3> <p>In some development scenarios, it can be helpful to explicitly mark some of a workspace's folders or files as read-only. For example, if the folder or file contents is being managed by a different process (such as the <code>node_modules</code> folder that is managed by Node.js package manager), marking them are read-only can avoid inadvertent changes.</p> <p>For this use case, there are new settings to mark file paths as read-only in the Explorer and in text and notebook editors:</p> <ul> <li><code>files.readonlyInclude</code> - Paths or glob patterns to make a file read-only if matching.</li> <li><code>files.readonlyExclude</code>- Paths or glob patterns to skip files from being read-only when they match <code>files.readonlyInclude</code>.</li> <li><code>files.readonlyFromPermissions</code> - Whether a file that has no write-permissions on disk should be read-only.</li> </ul> <p>According to the rules of the settings, if a path is considered to be read-only, you cannot modify it from the Explorer (for example, delete it) and the text or notebook editor is read-only.</p> <p><video src="/assets/updates/1_79/readonly-mode.mp4" autoplay loop controls muted title="Readonly mode set for a node_modules folder"></video></p> <p>For more ad-hoc toggling of the read-only mode, there are new commands to change the mode for the current session only, overruling your setting configurations:</p> <ul> <li><strong>Set Active Editor Readonly in Session</strong> - Mark active editor read-only.</li> <li><strong>Set Active Editor Writeable in Session</strong> - Mark active editor writeable.</li> <li><strong>Toggle Active Editor Readonly in Session</strong> - Toggle between read-only and writeable.</li> <li><strong>Reset Active Editor Readonly in Session</strong> - Reset the session state.</li> </ul> <h3 id="_windows-unc-host-allowlist-improvements" data-needslink="_windows-unc-host-allowlist-improvements">Windows UNC host allowlist improvements</h3> <p>As part of an <a href="https://github.com/microsoft/vscode/security/advisories/GHSA-mmfh-4pv3-39hr" class="external-link" target="_blank">important security fix</a>, VS Code introduced an allowlist for UNC hosts. This milestone we addressed many of the usability problems reported by Windows users when they have UNC paths in their day to day work with VS Code.</p> <h4 id="_dialog-improvements" data-needslink="_dialog-improvements">Dialog improvements</h4> <p>The confirmation dialog to allow a UNC host on startup now updates the <code>security.allowedUNCHosts</code> setting and adds the host when you select the checkbox.</p> <p><img src="/assets/updates/1_79/unc-dialog.png" alt="Windows UNC allow dialog" loading="lazy"></p> <p>In addition, clicking the <strong>Learn More</strong> button no longer closes the dialog.</p> <h4 id="_new-securityrestrictuncaccess-setting" data-needslink="_new-securityrestrictuncaccess-setting">New security.restrictUNCAccess setting</h4> <p>A new setting <code>security.restrictUNCAccess</code> lets you disable the UNC allowlist for hosts and restore the behavior to how it was before this security fix. We strongly advise against changing this setting, as it makes your system vulnerable again to the <a href="https://github.com/microsoft/vscode/security/advisories/GHSA-mmfh-4pv3-39hr" class="external-link" target="_blank">Information Disclosure Vulnerability</a>.</p> <h3 id="_new-tab-sizing-option-fixed" data-needslink="_new-tab-sizing-option-fixed">New tab sizing option fixed</h3> <p>The <code>workbench.editor.tabSizing</code> setting has a new option <code>fixed</code> that makes each tab equal width. When space becomes limited, tabs will shrink equally up to a minimum. The new setting <code>workbench.editor.tabSizingFixedMaxWidth</code> sets the initial size of the tab.</p> <p><video src="/assets/updates/1_79/tab-size-fixed.mp4" autoplay loop controls muted title="Fixed tab size"></video></p> <p>In this mode, when you rapidly close tabs using the mouse, the widths of tabs remain stable to allow for closing each tab by clicking onto the same point. The width is then adjusted when you leave the mouse from the editor tab area.</p> <h3 id="_network-quality-indication" data-needslink="_network-quality-indication">Network quality indication</h3> <p>When you are connected to a remote machine, the best experience for VS Code remote editing capabilities requires a good network connection with low latency. In this milestone, we updated the remote indicator in the Status bar to give you some feedback when either latency is very high or the network connection appears to be offline.</p> <h4 id="_high-latency-web-desktop" data-needslink="_high-latency-web-desktop">High latency (web, desktop)</h4> <p>We periodically measure the latency to the remote you are connected to. When a certain threshold is hit, the remote indicator updates to reflect that.</p> <p><img src="/assets/updates/1_79/slow-network.png" alt="Slow network detection shown in the right of the Status bar" loading="lazy"></p> <h4 id="_offline-detection-web-only" data-needslink="_offline-detection-web-only">Offline detection (web only)</h4> <p>If you are using a web browser to connect to a remote and you suddenly lose internet connection, the remote indicator updates to reflect that.</p> <p><img src="/assets/updates/1_79/offline-indication.gif" alt="Web offline detection displaying "Network appears to be offline" message from the Status bar" loading="lazy"></p> <h3 id="_continue-working-on" data-needslink="_continue-working-on">Continue Working On</h3> <p>The <a href="https://code.visualstudio.com/docs/sourcecontrol/github#_continue-working-on">Continue Working On</a> feature allows you to store and retrieve working changes between VS Code development environments for the same repository, for example, when you upgrade from a local Git repository to a GitHub codespace, or when you switch between different machines for the same repository.</p> <p>You can now transfer working changes between development environments for a GitHub repository even if it is configured with an HTTP remote in one environment and an SSH remote in another. Additionally, we have started to transfer additional workbench state, such as your Source Control view state preference, for a more seamless transition.</p> <h2 id="_editor" data-needslink="_editor">Editor</h2> <h3 id="_paste-as" data-needslink="_paste-as">Paste as</h3> <p>When pasting a file into a text editor, there are multiple ways you might want to insert it. You may want an absolute path point to the file. You may want a path relative to the current workspace. Or you may even want something specific to the current editor's language, such as inserting a Markdown link to the file when pasting into Markdown. VS Code's new 'paste as' functionality gives you control over how the pasted content is inserted.</p> <p>After pasting, VS Code now shows a small 'paste as' control if there are other ways the pasted content could have been inserted:</p> <p><video title="Using the paste as control to change how an image is inserted into a notebook Markdown cell" src="/assets/updates/1_79/paste-as-widget.mp4" controls loop autoplay muted></video></p> <p>You can open the 'paste as' control by clicking on it or using the <span class="dynamic-keybinding" data-commandId="editor.changePasteType" data-osx="⌘." data-win="Ctrl+." data-linux="Ctrl+."><span class="keybinding">⌘.</span> (Windows, Linux <span class="keybinding">Ctrl+.</span>)</span> keyboard shortcut. The paste selector goes away as soon as you start typing or move the cursor outside of the inserted text. You can also fully disable the drop selector control using <code>"editor.pasteAs.showPasteSelector": "never"</code>.</p> <p>When you paste content into a Markdown cell in a notebook, for example, the 'paste as' control lets you switch between:</p> <ul> <li>Inserting the image as an attachment</li> <li>Inserting a Markdown image reference</li> <li>Inserting a relative path (for files in the workspace)</li> <li>Inserting an absolute path</li> </ul> <p>If you prefer selecting how content in the clipboard should be pasted before actually pasting, you can instead use the new <strong>Paste As...</strong> command. This lets you select how the content should be pasted:</p> <p><img src="/assets/updates/1_79/paste-as-command.png" alt="Using the Paste As... command to select how content is pasted" loading="lazy"></p> <h3 id="_quick-suggestions-and-snippets" data-needslink="_quick-suggestions-and-snippets">Quick suggestions and snippets</h3> <p>Quick suggestions mean that VS Code shows suggestions as you type, without having to press <span class="dynamic-keybinding" data-commandId="editor.action.triggerSuggest" data-osx="⌃Space" data-win="Ctrl+Space" data-linux="Ctrl+Space"><span class="keybinding">⌃Space</span> (Windows, Linux <span class="keybinding">Ctrl+Space</span>)</span>. This feature is widely popular, around 90% of all suggestion sessions are started by typing. A large number of suggestions are accepted via <code>Tab</code> (versus <code>Enter</code> and typing accept characters).</p> <p>When a snippet is being inserted, the <code>Tab</code> key is used to navigate between snippet placeholders. Now, when quick suggestion becomes active while a snippet is being inserted, the <code>Tab</code> key can accept a completion <strong>or</strong> navigate to the next snippet placeholder. To resolve this conflict, there is the <code>editor.suggest.snippetsPreventQuickSuggestions</code> setting to disable quick suggestions when a snippet is inserted. It defaulted to <code>true</code> and as long as this setting existed, we received feedback that it was confusing. So we have decided to change its default value to <code>false</code>, so that typing inside a snippet placeholder will trigger quick suggestions.</p> <p>You can then use the following keystrokes:</p> <ul> <li>Press <code>Tab</code> to accept a completion.</li> <li>Press <code>Escape</code> to hide quick suggestions.</li> <li>And <code>Tab</code> without suggestions navigates to the next snippet placeholder.</li> </ul> <h2 id="_terminal" data-needslink="_terminal">Terminal</h2> <h3 id="_automatic-shell-integration-for-fish-shell" data-needslink="_automatic-shell-integration-for-fish-shell">Automatic shell integration for fish shell</h3> <p><a href="https://code.visualstudio.com/docs/terminal/shell-integration">Shell integration</a> and its enhanced user experience will now automatically activate for fish shell. You may need to update fish for this to work.</p> <p><img src="/assets/updates/1_79/terminal-fish-si.png" alt="Shell integration in fish enables several features" loading="lazy"></p> <h3 id="_overline-support" data-needslink="_overline-support">Overline support</h3> <p>The overline escape sequences (<code>SGR 53</code>, <code>SGR 55</code>) specified in ECMA-48 are now supported in the terminal. The most common use of this sequence is to add a line above an app's "status bar" on the bottom row of the terminal.</p> <p><img src="/assets/updates/1_79/terminal-overline.png" alt="The overline feature is similar to underline but will draw a line on top of the text" loading="lazy"></p> <h2 id="_source-control" data-needslink="_source-control">Source Control</h2> <h3 id="_default-branch-name" data-needslink="_default-branch-name">Default branch name</h3> <p>Starting with this milestone, all new Git repositories created using VS Code set <code>main</code> as their default branch. If you prefer a different name for the default branch, you can change it with the <code>git.defaultBranchName</code> setting. When the setting is set to empty, VS Code defers to the default branch name configured in Git. Publishing a folder to GitHub also honors the default branch name configured on GitHub.</p> <h3 id="_branch-picker-integration-with-vscodedev-and-github" data-needslink="_branch-picker-integration-with-vscodedev-and-github">Branch picker integration with vscode.dev and GitHub</h3> <p>You can now checkout a branch in vscode.dev or open it on GitHub.com from the branch picker on VS Code desktop.</p> <p>In the short video below, each branch listed in the branch picker dropdown has buttons on the right to either <strong>Open on GitHub</strong> or <strong>Checkout on vscode.dev</strong>.</p> <p><video src="/assets/updates/1_79/git-branch-picker.mp4" autoplay loop controls muted title="Open a branch on GitHub.com from the branch picker"></video></p> <h3 id="_similarity-threshold" data-needslink="_similarity-threshold">Similarity threshold</h3> <p><a href="https://git-scm.com/docs/git-status#Documentation/git-status.txt---find-renamesltngt" class="external-link" target="_blank">Git status</a> uses a similarity index (number of additions/deletions compared to the file's size) to determine whether an add/delete pair is considered a rename. You can now configure the similarity threshold with the <code>git.similarityThreshold</code> setting, which takes a value between <code>0</code> and <code>100</code>. The default value is <code>50</code>.</p> <h2 id="_notebooks" data-needslink="_notebooks">Notebooks</h2> <h3 id="_rich-content-search" data-needslink="_rich-content-search">Rich content search</h3> <p>You can now search for rich content in open notebooks from the Search control. If your notebook is open, the Search control shows results based on how it appears in the notebook editor (rather than searching the content of the raw source file). This also allows for replacing text in the notebook inputs.</p> <p><video src="/assets/updates/1_79/rich-content-notebook-search.mp4" autoplay loop controls muted title="Rich content notebook search"></video></p> <p>Using the new notebook search toggle, you can also filter which types of cell content you would like to search in.</p> <p><video src="/assets/updates/1_79/rich-content-notebook-search-toggle.mp4" autoplay loop controls muted title="Rich content notebook toggle cell content"></video></p> <h3 id="_improved-cell-output-interaction" data-needslink="_improved-cell-output-interaction">Improved cell output interaction</h3> <p>The new context key <code>notebookOutputInputFocused</code> was added to determine if a text box within a cell output has focus, so that raw hotkeys a/b/j/k can safely be used while the output has focus. Focusing on an input box prevents those hotkeys from triggering.</p> <p><video src="/assets/updates/1_79/notebook-output-hotkeys.mp4" autoplay loop controls muted title="Use raw hotkeys while focused on the output"></video></p> <h3 id="_format-on-run" data-needslink="_format-on-run">Format on Run</h3> <p>Notebooks now can format cells upon cell execution. This will trigger using <strong>Run Cell</strong>, <strong>Run All</strong>, <strong>Run Above/Below</strong>, and combined kernel+run commands. This feature can be turned on via setting <code>"notebook.formatOnCellExecution": true</code>.</p> <p><video src="/assets/updates/1_79/formatOnRun.mp4" autoplay loop controls muted title="Format on cell execution"></video></p> <h3 id="_code-actions-on-save" data-needslink="_code-actions-on-save">Code Actions on save</h3> <p>Notebooks now support Code Actions being run upon save. Code Actions can be specified under the <code>notebook.codeActionsOnSave</code> setting. Extension authors can define providers using the standard typings for cell level Code Actions, or use the new <code>notebook.</code> prefix to define Code Actions that manage the entire notebook. You can review the <a href="https://github.com/Yoyokrazy/clean-nb-imports-ext" class="external-link" target="_blank">clean-nb-imports-ext</a> sample extension to learn how extensions can use this new setting.</p> <h2 id="_languages" data-needslink="_languages">Languages</h2> <h3 id="_typescript-51" data-needslink="_typescript-51">TypeScript 5.1</h3> <p>VS Code now ships with TypeScript 5.1.3. This major update brings new TypeScript language features, better performance, and many important improvements and bug fixes. You can read about TypeScript 5.1 on the <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-1" class="external-link" target="_blank">TypeScript blog</a>.</p> <h3 id="_linked-editing-for-jsx-tags" data-needslink="_linked-editing-for-jsx-tags">Linked editing for JSX tags</h3> <p>With linked editing, when you change an opening JSX tag VS Code will automatically update the corresponding closing tag. This can be a great time saver:</p> <p><video title="Linked editing some JSX tags" src="/assets/updates/1_79/ts-linked-editing.mp4" controls loop muted autoplay></video></p> <p>The feature is off by default but can be enabled by setting:</p> <pre class="shiki" style="background-color: #1e1e1e"><code><span class="line"><span style="color: #CE9178">"editor.linkedEditing"</span><span style="color: #BBBBBB">: </span><span style="color: #569CD6">true</span></span> <span class="line"></span></code></pre> <p>You can also explicitly start linked editing with the <strong>Start Linked Editing</strong> command.</p> <h3 id="_rename-matching-jsx-tags-using-f2" data-needslink="_rename-matching-jsx-tags-using-f2">Rename matching JSX tags using F2</h3> <p>When you trigger rename on a JSX tag, VS Code now renames just the matching tag instead of trying to update all references to the tag:</p> <p><video src="/assets/updates/1_79/ts-rename-jsx.mp4" autoplay loop controls muted title="Renaming a JSX tag using F2"></video></p> <p>This requires TypeScript 5.1+ and matches how rename works in HTML.</p> <p>You can disable this behavior using <code>javascript.preferences.renameMatchingJsxTags</code> and <code>typescript.preferences.renameMatchingJsxTags</code>.</p> <h3 id="_jsdoc-param-completions" data-needslink="_jsdoc-param-completions">JSDoc @param completions</h3> <p>When writing JSDoc comments, VS Code now shows suggestions for all missing parameters:</p> <p><img src="/assets/updates/1_79/js-param.png" alt="JS Doc @param completions in a TypeScript file" loading="lazy"></p> <p>This can help you quickly fill in the documentation.</p> <p>In JavaScript files, <code>@param</code> completions create placeholders for the parameter type description:</p> <p><video title="@param completions in a JavaScript file" src="/assets/updates/1_79/js-param-snippets.mp4" controls autoplay loop muted></video></p> <h3 id="_copy-external-media-files-into-workspace-on-drop-or-paste-for-markdown" data-needslink="_copy-external-media-files-into-workspace-on-drop-or-paste-for-markdown">Copy external media files into workspace on drop or paste for Markdown</h3> <p>Want to add an image or video into a Markdown document? Instead of wasting time first manually copying the file into your workspace and then adding a link to it, now you can just drop or paste the file into your Markdown. If the file currently isn't part of the workspace, VS Code will automatically copy the file into your workspace and insert a link to it:</p> <p><video title="Coping a file into the workspace by drag and dropping it" src="/assets/updates/1_79/markdown-copy.mp4" controls loop muted autoplay></video></p> <p>This also works great for image data in the clipboard. For example, if you take a screenshot with the Snipping tool on Windows, you can press <strong>Paste</strong> in a Markdown file and VS Code will create a new image file from the clipboard data and insert a Markdown image link to the new file. This also works on macOS if you <a href="https://support.apple.com/en-us/HT201361" class="external-link" target="_blank">hold the Ctrl key while taking a screenshot</a> to copy it to the clipboard.</p> <p>You can also customize the behavior of this feature using a few settings:</p> <h4 id="_markdowncopyfilesdestination" data-needslink="_markdowncopyfilesdestination">markdown.copyFiles.destination</h4> <p>The <code>markdown.copyFiles.destination</code> setting controls where new media files are created. This setting maps globs that match on the current Markdown document to image destinations. The image destinations can also use some simple variables. See the <code>markdown.copyFiles.destination</code> setting description for information about the available variables.</p> <p>For example, if we want every Markdown file under <code>/docs</code> in our workspace to put new media files into an <code>images</code> directory specific to the current file, we can write:</p> <pre class="shiki" style="background-color: #1e1e1e"><code><span class="line"><span style="color: #CE9178">"markdown.copyFiles.destination"</span><span style="color: #BBBBBB">: {</span></span> <span class="line"><span style="color: #BBBBBB"> </span><span style="color: #9CDCFE">"/docs/**/*"</span><span style="color: #BBBBBB">: </span><span style="color: #CE9178">"images/${documentBaseName}/"</span></span> <span class="line"><span style="color: #BBBBBB">}</span></span> <span class="line"></span></code></pre> <p>Now when a new file is pasted in <code>/docs/api/readme.md</code>, the image file is created at <code>/docs/api/images/readme/image.png</code>.</p> <p>You can even use simple regular expressions to transform variables in a <a href="https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variable-transforms">similar way to snippets</a>. For example, this transform uses only the first letter of the document file name when creating the media file</p> <pre class="shiki" style="background-color: #1e1e1e"><code><span class="line"><span style="color: #CE9178">"markdown.copyFiles.destination"</span><span style="color: #BBBBBB">: {</span></span> <span class="line"><span style="color: #BBBBBB"> </span><span style="color: #9CDCFE">"/docs/**/*"</span><span style="color: #BBBBBB">: </span><span style="color: #CE9178">"images/${documentBaseName/(.).*/$1/}/"</span></span> <span class="line"><span style="color: #BBBBBB">}</span></span> <span class="line"></span></code></pre> <p>When a new file is pasted into <code>/docs/api/readme.md</code>, the image is now created under <code>/docs/api/images/r/image.png</code>.</p> <h4 id="_markdowncopyfilesoverwritebehavior" data-needslink="_markdowncopyfilesoverwritebehavior">markdown.copyFiles.overwriteBehavior</h4> <p>The <code>markdown.copyFiles.overwriteBehavior</code> setting controls whether newly created media files overwrite existing files.</p> <p>By default, VS Code will never overwrite existing files. Instead if you have a file called <code>image.png</code> and try pasting it into a Markdown document in a workspace where an <code>image.png</code> already exists, VS Code will instead create a new file called <code>image-1.png</code>. If you then try pasting another file called <code>image.png</code>, it will instead be created as <code>image-2.png</code>.</p> <p>If you prefer having existing files be overwritten by new files, set <code>"markdown.copyFiles.overwriteBehavior": "overwrite"</code>. Now VS Code will always use the original file name, overwriting any existing files that that path.</p> <h4 id="_disabling-copying-files-into-the-workspace" data-needslink="_disabling-copying-files-into-the-workspace">Disabling copying files into the workspace</h4> <p>VS Code will only try copying files into your workspace if they are not already part of workspace. Additionally, we currently only copy media files (images, videos, audio) into the workspace.</p> <p>However if you find this new behavior too intrusive, you can disable it for both drop and paste by setting:</p> <pre class="shiki" style="background-color: #1e1e1e"><code><span class="line"><span style="color: #CE9178">"markdown.editor.drop.copyIntoWorkspace"</span><span style="color: #BBBBBB">: </span><span style="color: #CE9178">"never"</span></span> <span class="line"><span style="color: #CE9178">"markdown.editor.filePaste.copyIntoWorkspace"</span><span style="color: #BBBBBB">: </span><span style="color: #CE9178">"never"</span></span> <span class="line"></span></code></pre> <h3 id="_intellisense-for-html-paths-in-markdown-files" data-needslink="_intellisense-for-html-paths-in-markdown-files">IntelliSense for HTML paths in Markdown files</h3> <p>Many Markdown dialects allow raw HTML tags to be used in Markdown documents. In this update, we've extended most of VS Code's Markdown IntelliSense features to file paths used in these HTML tags. This includes support for:</p> <ul> <li><a href="https://code.visualstudio.com/docs/languages/markdown#_path-completions">Path completions</a>.</li> <li><a href="https://code.visualstudio.com/docs/languages/markdown#_find-all-references-to-headers-and-links">Finding all references</a> to a linked to file.</li> <li><a href="https://code.visualstudio.com/docs/languages/markdown#_automatic-link-updates-on-file-move-or-rename">Automatically updating file paths</a> when a file is renamed or moved.</li> <li><a href="https://code.visualstudio.com/docs/languages/markdown#_rename-headers-and-links">Safely renaming</a> files using F2.</li> <li><a href="https://code.visualstudio.com/docs/languages/markdown#_link-validation">Validating</a> that the linked to file exists in the workspace.</li> </ul> <p><img src="/assets/updates/1_79/md-html-support.png" alt="Finding all references to an image file used in an HTML tag" loading="lazy"></p> <h3 id="_insert-audio-into-markdown" data-needslink="_insert-audio-into-markdown">Insert audio into Markdown</h3> <p>When you drag and drop or copy and paste an audio file into a Markdown document, VS Code now inserts an <code><audio></code> element.</p> <h3 id="_syntax-highlighting-for-json-with-lines-jsonl-files" data-needslink="_syntax-highlighting-for-json-with-lines-jsonl-files">Syntax highlighting for JSON with Lines (JSONL) files</h3> <p><a href="https://jsonlines.org/" class="external-link" target="_blank">JSON with Lines</a> describe a sequence of JSON objects separated by newline characters. If the file extension <code>jsonl</code> is used, VS Code provides syntax highlighting.</p> <h2 id="_remote-development" data-needslink="_remote-development">Remote Development</h2> <p>The <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack" class="external-link" target="_blank">Remote Development extensions</a>, allow you to use a <a href="https://code.visualstudio.com/docs/devcontainers/containers">Dev Container</a>, remote machine via SSH or <a href="https://code.visualstudio.com/docs/remote/tunnels">Remote Tunnels</a>, or the <a href="https://learn.microsoft.com/windows/wsl" class="external-link" target="_blank">Windows Subsystem for Linux</a> (WSL) as a full-featured development environment.</p> <p>Highlights include:</p> <ul> <li>Open new Remote connections (via a Remote Tunnel, to a Dev Container) in either the current or a new VS Code window.</li> <li>Easier workflow to make a forwarded port public.</li> <li>Preliminary support for connecting to WSL from VS Code for the Web (vscode.dev).</li> </ul> <p>You can learn about new extension features and bug fixes in the <a href="https://github.com/microsoft/vscode-docs/blob/main/remote-release-notes/v1_79.md" class="external-link" target="_blank">Remote Development release notes</a>.</p> <h2 id="_contributions-to-extensions" data-needslink="_contributions-to-extensions">Contributions to extensions</h2> <h3 id="_github-copilot" data-needslink="_github-copilot">GitHub Copilot</h3> <h4 id="_use-copilot-chat-in-stable-vs-code" data-needslink="_use-copilot-chat-in-stable-vs-code">Use Copilot Chat in Stable VS Code</h4> <p>Previously, you had to use VS Code Insiders to use Copilot Chat. As of VS Code 1.79, you can use Copilot Chat in stable VS Code as well. You will still have to install the <a href="https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat" class="external-link" target="_blank">GitHub Copilot Chat</a> extension.</p> <h4 id="_editor-chat" data-needslink="_editor-chat">Editor chat</h4> <p>We have improved editor chat, most notably we have changed its default mode to be "livePreview". In this mode, changes are applied directly to the document and shown with an embedded diff view. Let's look at the example below:</p> <ul> <li>A new property was added to the <code>IUserFriendlyStatusItemEntry</code> type and</li> <li>Copilot updated the <code>isUserFriendlyStatusItemEntry</code> check accordingly.</li> <li>The reply is shown in the editor using an embedded diff view. Its right hand side is editable and checked by VS Code's language extensions.</li> <li>This lets you spot an error in the reply (below the <code>isMarkdownString</code> function doesn't exist) and you can fix it before accepting the suggestion.</li> </ul> <p><img src="/assets/updates/1_79/copilot-editor-chat.png" alt="Copilot inline chat suggestion with proposed code change displayed as a live preview" loading="lazy"></p> <h4 id="_notebook-improvements" data-needslink="_notebook-improvements">Notebook improvements</h4> <p>We have improved the chat experience in notebook editors this month. When using Copilot in a notebook document, Copilot can use the notebook context to provide more relevant suggestions. For example, the code suggestions use variables or modules defined in previous cells without recreating or re-importing them.</p> <p><video src="/assets/updates/1_79/copilot-notebook-context.mp4" autoplay loop controls muted title="Copilot uses notebook as context"></video></p> <p>When running notebook cells, Copilot now also provides suggestions for cell execution failures. You can display these by selecting the <strong>Fix using Copilot</strong> action on the cell status bar.</p> <p><video src="/assets/updates/1_79/copilot-notebook-fix.mp4" autoplay loop controls muted title="Copilot fix cell execution errors"></video></p> <p>The Copilot suggestions are also accepted automatically on cell execution, so you don't have to accept them manually.</p> <h4 id="_github-pull-request-and-issues-integration" data-needslink="_github-pull-request-and-issues-integration">GitHub Pull Request and Issues integration</h4> <p>When the <a href="https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github" class="external-link" target="_blank">GitHub Pull Requests and Issues</a> extension is installed and enabled and you are viewing a review thread, it is now possible to directly apply a review comment using Copilot. You can do this via the <strong>Apply Suggestion with AI</strong> button in the comment menu.</p> <p><video src="/assets/updates/1_79/copilot-ghpr-apply-suggestion.mp4" autoplay loop controls muted title="Apply review comment with Copilot"></video></p> <h4 id="_experimental-quick-question-experience" data-needslink="_experimental-quick-question-experience">Experimental Quick Question experience</h4> <p><video src="/assets/updates/1_79/quick-question.mp4" autoplay loop controls muted title="Ask a quick question with Copilot"></video></p> <p><em>Theme: <a href="https://marketplace.visualstudio.com/items?itemName=tinkertrain.theme-panda" class="external-link" target="_blank">Panda Theme</a> (preview on <a href="https://vscode.dev/editor/theme/tinkertrain.theme-panda" class="external-link" target="_blank">vscode.dev</a>)</em></p> <p>This iteration, we experimented with using chat to ask quick programming questions without leaving context. If you have access to the chat experience, you can enable this feature with the following setting:</p> <pre class="shiki" style="background-color: #1e1e1e"><code><span class="line"><span style="color: #CE9178">"chat.experimental.quickQuestion.enable"</span><span style="color: #BBBBBB">: </span><span style="color: #569CD6">true</span></span> <span class="line"></span></code></pre> <p>Feature overview:</p> <ul> <li>Ask Copilot a quick question.</li> <li>Toggle the experience with <span class="dynamic-keybinding" data-commandId="workbench.action.quickchat.toggle" data-osx="⇧⌥⌘L" data-win="Ctrl+Shift+Alt+L" data-linux="Ctrl+Shift+Alt+L"><span class="keybinding">⇧⌥⌘L</span> (Windows, Linux <span class="keybinding">Ctrl+Shift+Alt+L</span>)</span> (state is remembered for 30s so you can easily show, hide, and show again).</li> <li>An <strong>Open in chat</strong> button for continuing the conversation to a long form chat in the chat view.</li> </ul> <h4 id="_delete-chat-entry" data-needslink="_delete-chat-entry">Delete chat entry</h4> <p>You can now delete a chat request/response pair by clicking the X icon in the chat request.</p> <p><img src="/assets/updates/1_79/remove-chat.png" alt="A chat request with X icon" loading="lazy"></p> <p>Why would you want to do this? Sometimes, Copilot provides a response that is off topic or incorrect. You can ask your question again, but removing the bad response from your session's chat history may also help keep the conversation on track. There is also a limit to the amount of context that can be included with each chat request, so removing a long poor response might help save your context budget for more useful information.</p> <h4 id="_move-chat-session-from-sidebar-to-editor" data-needslink="_move-chat-session-from-sidebar-to-editor">Move chat session from sidebar to editor</h4> <p>It was already possible to open a chat session in an editor by running the <strong>Chat: Open Editor</strong> command, but now it is also possible to move chat sessions back and forth between the sidebar and editor. You can find the <strong>Open Session in Editor</strong> and <strong>Open Session in Sidebar</strong> commands under the "..." menu in the chat view title or the editor title menus.</p> <p><video src="/assets/updates/1_79/move-chat-sessions.mp4" autoplay loop controls muted title="Moving chat sessions from sidebar to editor"></video></p> <h4 id="_chat-session-history" data-needslink="_chat-session-history">Chat session history</h4> <p>Your chat sessions are now saved to history, which you can browse by selecting the <strong>Show History</strong> button in the chat view title menu. You can select a history entry to load that conversation into a chat editor, and then seamlessly continue where you left off. You can remove sessions from history by clicking the X button on each row.</p> <h4 id="_export-chat-sessions-to-json-file" data-needslink="_export-chat-sessions-to-json-file">Export chat sessions to JSON file</h4> <p>We've added a command, <strong>Chat: Export Session</strong>, which exports the current focused chat session to a JSON file. You can then run the <strong>Chat: Import Session</strong> command to import this session and continue your conversation. You can check this file into your repo, share it with others, or just save your conversation for reference later. Note that when you are continuing your conversation in an imported chat session, those new messages won't be saved unless you export the session again.</p> <h4 id="_codeblock-navigation-and-keybindings" data-needslink="_codeblock-navigation-and-keybindings">Codeblock navigation and keybindings</h4> <p>We've added some commands and keybindings that make it easier to work with codeblocks in chat responses. <strong>Chat: Next Codeblock</strong> (<span class="dynamic-keybinding" data-commandId="workbench.action.chat.nextCodeBlock" data-osx="⌥⌘PageDown" data-win="Ctrl+Alt+PageDown" data-linux="Ctrl+Alt+PageDown"><span class="keybinding">⌥⌘PageDown</span> (Windows, Linux <span class="keybinding">Ctrl+Alt+PageDown</span>)</span>) and <strong>Chat: Previous Codeblock</strong> (<span class="dynamic-keybinding" data-commandId="workbench.action.chat.previousCodeBlock" data-osx="⌥⌘PageUp" data-win="Ctrl+Alt+PageUp" data-linux="Ctrl+Alt+PageUp"><span class="keybinding">⌥⌘PageUp</span> (Windows, Linux <span class="keybinding">Ctrl+Alt+PageUp</span>)</span>) move the cursor to the next or previous codeblock in the current chat response. When a codeblock is focused, the commands in the codeblock toolbar can also be invoked from the Command Palette, or you can assign keybindings to them. <strong>Run in Terminal</strong> has a keybinding assigned by default, <span class="dynamic-keybinding" data-commandId="workbench.action.chat.runInTerminal" data-osx="⌃⌥Enter" data-win="Ctrl+Alt+Enter" data-linux="Ctrl+Alt+Enter"><span class="keybinding">⌃⌥Enter</span> (Windows, Linux <span class="keybinding">Ctrl+Alt+Enter</span>)</span>. And the <strong>Copy</strong> command will now be run when you press the normal copy keybinding in the codeblock without having a selection.</p> <p><video src="/assets/updates/1_79/codeblock-keybindings.mp4" autoplay loop controls muted title="Copilot Chat code block navigation"></video></p> <p>We've also added keybindings to focus the chat window (<span class="dynamic-keybinding" data-commandId="workbench.action.chat.open" data-osx="⌃⌘I" data-win="Ctrl+Alt+I" data-linux="Ctrl+Alt+I"><span class="keybinding">⌃⌘I</span> (Windows, Linux <span class="keybinding">Ctrl+Alt+I</span>)</span>) and to clear the chat session (<span class="dynamic-keybinding" data-commandId="workbench.action.chat.clear"></span>).</p> <h4 id="_copilot-youtube-playlist" data-needslink="_copilot-youtube-playlist">Copilot YouTube playlist</h4> <p>To learn more about GitHub Copilot as well as tips and tricks and best practices, have a look at the <a href="https://www.youtube.com/playlist?list=PLj6YeMhvp2S5_hvBl2SE-7YCHYlLQ0bPt" class="external-link" target="_blank">VS Code Copilot Series</a> on YouTube. There you'll find an <a href="https://www.youtube.com/watch?v=Fi3AJZZregI&list=PLj6YeMhvp2S5_hvBl2SE-7YCHYlLQ0bPt&index=1" class="external-link" target="_blank">introduction</a> to GitHub Copilot, <a href="https://www.youtube.com/watch?v=VsUQlSyQn1E&list=PLj6YeMhvp2S5_hvBl2SE-7YCHYlLQ0bPt&index=6" class="external-link" target="_blank">language-specific</a> usage, and guidance on <a href="https://www.youtube.com/watch?v=ImWfIDTxn7E&list=PLj6YeMhvp2S5_hvBl2SE-7YCHYlLQ0bPt&index=9" class="external-link" target="_blank">effective prompting</a> when using Copilot for development.</p> <h3 id="_python" data-needslink="_python">Python</h3> <h4 id="_run-python-file-in-dedicated-terminal" data-needslink="_run-python-file-in-dedicated-terminal">Run Python file in dedicated terminal</h4> <p>The <a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python" class="external-link" target="_blank">Python</a> extension will now create a new terminal for each file you run using the <strong>Run</strong> button on the top of the editor or the <strong>Python: Run Python File in Terminal</strong> command, and will keep using this file's "dedicated" terminal every time you re-run it.</p> <p><video src="/assets/updates/1_79/run-python-file-dedicated-terminal.mp4" autoplay loop controls muted title="Running a Python file creates a separate, dedicated terminal for that file."></video></p> <p>Any time you wish to run the same file in a separate terminal, you can run select <strong>Python: Run Python File in Dedicated Terminal</strong> under the <strong>Run</strong> button menu.</p> <p><img src="/assets/updates/1_79/run-python-file-dedicated-terminal-option.png" alt="Options under the run button menu" loading="lazy"></p> <h4 id="_test-discovery-and-run-rewrite" data-needslink="_test-discovery-and-run-rewrite">Test discovery and run rewrite</h4> <p>This month, we are beginning the roll out of our testing rewrite as an experiment. This rewrite redesigns the architecture behind test discovery and execution for both unittest and pytest in the extension. While it does not provide any additional functionality exposed to the user, it reduces buggy behavior and opens up new functional opportunities moving forward. The rewrite is being rolled out behind the experiment <code>pythonTestAdapter</code>, which you can opt in and out of using <code>python.experiments.optInto</code> in your <code>settings.json</code>. Eventually, we plan to remove this setting and adopt this new architecture. If you have any comments or suggestions regarding this experiment or rewrite, you can share them in the <a href="https://github.com/microsoft/vscode-python" class="external-link" target="_blank">vscode-python</a> repository.</p> <h4 id="_configurable-indexing-limits-with-pylance" data-needslink="_configurable-indexing-limits-with-pylance">Configurable indexing limits with Pylance</h4> <p>There's a new <a href="https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance" class="external-link" target="_blank">Pylance</a> setting that allows you to configure the file count limit for indexing: <code>"python.analysis.userFileIndexingLimit"</code>, which is set to 2000 by default. This setting can be helpful when working with very large projects and you're willing to compromise performance for an enhanced IntelliSense experience.</p> <h3 id="_jupyter" data-needslink="_jupyter">Jupyter</h3> <h4 id="_resume-execution-of-cells-against-remote-jupyter-kernels" data-needslink="_resume-execution-of-cells-against-remote-jupyter-kernels">Resume execution of cells against remote Jupyter kernels</h4> <p>The <a href="https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter" class="external-link" target="_blank">Jupyter</a> extension now supports resuming execution of cells against <a href="https://code.visualstudio.com/docs/datascience/jupyter-kernel-management#_existing-jupyter-server">remote Jupyter kernels</a>, if the cell is still busy executing, even when reopening the Notebook after having shutdown VS Code.</p> <p>For instance, assume you execute a long running section of code such as training of a model against a remote Jupyter kernel. This could take a few minutes or longer, so you might decide to shut down VS Code in the interim. A few minutes later VS Code is restarted with the same notebook opened and if the cell is still busy executing, this state is reflected in the Notebook cell and any new output is displayed in the cell output.</p> <p>If on the other hand, the cell completed execution while VS Code was shut down, the outputs generated in the interim would not be preserved in the notebook. Resuming executions in this manner and displaying new output is limited to simple output such as plain text, HTML, images, images, and the like. Restoring the state of widgets and other such complex outputs is not supported.</p> <p><img src="/assets/updates/1_79/resumeNBCellExec.gif" alt="Resuming notebook cell execution after closing and reopening VS Code" loading="lazy"></p> <h3 id="_github-pull-requests-and-issues" data-needslink="_github-pull-requests-and-issues">GitHub Pull Requests and Issues</h3> <p>There has been more progress on the <a href="https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github" class="external-link" target="_blank">GitHub Pull Requests and Issues</a> extension, which allows you to work on, create, and manage pull requests and issues. Highlights include:</p> <ul> <li>Two new actions for viewing diffs of checked out PRs: <strong>Compare Base With Pull Request Head (readonly)</strong> and <strong>Compare Pull Request Head with Local</strong>.</li> <li>The new setting <code>"githubPullRequests.pullPullRequestBranchBeforeCheckout"</code> can be used to turn off pulling a previously checked out PR branch when checking out that same branch again.</li> </ul> <p>Review the <a href="https://github.com/microsoft/vscode-pull-request-github/blob/main/CHANGELOG.md#0660" class="external-link" target="_blank">changelog for the 0.66.0</a> release of the extension to learn about the other highlights.</p> <h2 id="_preview-features" data-needslink="_preview-features">Preview features</h2> <h3 id="_project-wide-jsts-intellisense-on-insidersvscodedev" data-needslink="_project-wide-jsts-intellisense-on-insidersvscodedev">Project wide JS/TS IntelliSense on insiders.vscode.dev</h3> <p><a href="https://insiders.vscode.dev" class="external-link" target="_blank">vscode.dev</a> is a lightweight version of VS Code running fully in your browser. This iteration, we've significantly enriched vscode.dev's JavaScript and TypeScript support so that it can analyze all files in your workspace instead of being limited to currently opened files. This greatly improves navigation through code, letting you <strong>Go to Definition</strong> and <strong>Find All References</strong> to a symbol. It also improves IntelliSense by making sure settings from your <code>tsconfig.json</code> / <code>jsconfig.json</code> are respected. We even now support auto-imports while writing code.</p> <p>In the image below, the <strong>References</strong> view is displaying all references to <code>ITextDocument</code> in the workspace.</p> <p><img src="/assets/updates/1_79/vscode-dev-project-wide.png" alt="Find All References in a TypeScript project on vscode.dev" loading="lazy"></p> <p>These new IntelliSense features work for folders you open from your local machine and in GitHub repos you open using vscode.dev's built-in <a href="https://marketplace.visualstudio.com/items?itemName=GitHub.remotehub" class="external-link" target="_blank">GitHub Repositories</a> extension.</p> <p>Keep in mind that there are still a few limitations with JS/TS IntelliSense on vscode.dev:</p> <ul> <li>There is not currently IntelliSense support for third party libraries.</li> <li>There is not currently support for <a href="https://code.visualstudio.com/docs/nodejs/working-with-javascript#_typings-and-automatic-type-acquisition">automatic type acquisition</a> for JavaScript projects.</li> <li>Because of the above limitations, all typing errors are disabled on vscode.dev.</li> <li>Project wide IntelliSense is currently only enabled on the Insiders version of vscode.dev: <code>insiders.vscode.dev</code>. This feature is currently disabled on <code>github.dev</code>.</li> </ul> <p>We plan on addressing these limitations going forward, and are excited to continue enriching our JavaScript and TypeScript support on the web!</p> <h3 id="_images-in-the-terminal" data-needslink="_images-in-the-terminal">Images in the terminal</h3> <p>There is now experimental support for images in the terminal. Images in a terminal typically work by encoding the image pixel data as text, which is written to the terminal via a special escape sequence. The current protocols that are supported are <a href="https://en.wikipedia.org/wiki/Sixel" class="external-link" target="_blank">sixel</a> and the <a href="https://iterm2.com/documentation-images.html" class="external-link" target="_blank">inline images protocol pioneered by iTerm</a>.</p> <p>Enable this feature by setting:</p> <pre class="shiki" style="background-color: #1e1e1e"><code><span class="line"><span style="color: #CE9178">"terminal.integrated.experimentalImageSupport"</span><span style="color: #BBBBBB">: </span><span style="color: #569CD6">true</span></span> <span class="line"></span></code></pre> <p>Once enabled, to test it, you can download and <code>cat</code> a <code>.six</code> example file from <a href="https://github.com/saitoha/libsixel/tree/master/images" class="external-link" target="_blank">the libsixel repository</a>:</p> <p><img src="/assets/updates/1_79/terminal-image-six.png" alt="Running cat with a sixel file will print an image" loading="lazy"></p> <p>Or use the <a href="https://pypi.org/project/imgcat/" class="external-link" target="_blank">imgcat python package</a> or <a href="https://iterm2.com/documentation-images.html" class="external-link" target="_blank">imgcat script</a> with a png, gif or jpg file:</p> <p><img src="/assets/updates/1_79/terminal-image-png.png" alt="Running imgcat with a png file will print the image" loading="lazy"></p> <p>The current limitations of this feature are:</p> <ul> <li>Serialization does not work, so reloading a terminal will not retain any images (tracked in <a href="https://github.com/jerch/xterm-addon-image/issues/47" class="external-link" target="_blank">jerch/xterm-addon-image#47</a>).</li> <li>Copying the selection as HTML does not include the selected image (tracked in <a href="https://github.com/jerch/xterm-addon-image/issues/50" class="external-link" target="_blank">jerch/xterm-addon-image#50</a>).</li> <li>Animated gifs don't work (tracked in <a href="https://github.com/jerch/xterm-addon-image/issues/51" class="external-link" target="_blank">jerch/xterm-addon-image#51</a>).</li> <li>Images that are shorter than a cell will not work properly, this is a <a href="https://github.com/microsoft/vscode/issues/183840#issuecomment-1569345048" class="external-link" target="_blank">design flaw with the sequences and also occurs in XTerm</a>.</li> </ul> <h3 id="_typescript-52-support" data-needslink="_typescript-52-support">TypeScript 5.2 support</h3> <p>This update includes support for the upcoming TypeScript 5.2 release. Check out the <a href="https://github.com/microsoft/TypeScript/issues/54298" class="external-link" target="_blank">TypeScript 5.2 iteration plan</a> for more details about what the TypeScript team is currently working on. Some exciting upcoming tooling highlights include:</p> <ul> <li>A new <strong>Inline constant</strong> refactoring.</li> <li>A new <a href="#_move-to-file-refactoring-for-javascript-and-typescript">Move to file</a> refactoring that lets you move a symbol into an existing file.</li> </ul> <p>To start using the TypeScript 5.2 nightly builds, install the <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-next" class="external-link" target="_blank">TypeScript Nightly</a> extension.</p> <h3 id="_move-to-file-refactoring-for-javascript-and-typescript" data-needslink="_move-to-file-refactoring-for-javascript-and-typescript">Move to file refactoring for JavaScript and TypeScript</h3> <p>The <strong>Move to file</strong> refactoring in TypeScript 5.2 nightly lets you move a class, function, or constant into an existing file. This will also automatically update all references to the symbol and also update imports as needed:</p> <p><video src="/assets/updates/1_79/ts-move-to-file.mp4" autoplay loop controls muted title="Moving a symbol between Typescript files"></video></p> <p>When you select <strong>Move to file</strong>, VS Code shows you a list of all files in the current TypeScript or JavaScript project. You can start typings to quickly find the file you want.</p> <p>Alternatively, you can use <strong>Select existing file...</strong> to select a file using the normal file picker or <strong>Enter new file path...</strong> to specify a new file that should be created.</p> <p>This feature is still being actively developed, so give it a try and share your feedback!</p> <h2 id="_webassemblies-in-vs-code-for-the-web" data-needslink="_webassemblies-in-vs-code-for-the-web">WebAssemblies in VS Code for the Web</h2> <p>To add more programming language support to <a href="https://vscode.dev" class="external-link" target="_blank">vscode.dev</a>, the VS Code team has been investigating how to run general <a href="https://webassembly.org" class="external-link" target="_blank">WebAssembly</a> in VS Code for the Web. If you are interested in this approach and want to learn more, check out the recent <a href="https://code.visualstudio.com/blogs/2023/06/05/vscode-wasm-wasi">VS Code and WebAssemblies</a> blog post.</p> <h2 id="_extension-authoring" data-needslink="_extension-authoring">Extension authoring</h2> <h3 id="_improved-vscodefs-performance-for-local-files" data-needslink="_improved-vscodefs-performance-for-local-files">Improved vscode.fs performance for local files</h3> <p>When you are using <code>vscode.fs</code> API to work with files (you should!), operations to files that are local to the extension host will now resolve much faster.</p> <p>Previously the extension host would delegate these operations to the VS Code client for execution, but now they execute directly inside the extension host, saving round trips.</p> <h3 id="_stricter-status-bar-api" data-needslink="_stricter-status-bar-api">Stricter Status bar API</h3> <p>The API to create a Status bar item <code>createStatusBarItem</code> lets extensions pass an identifier. This identifier is used to control hiding and showing the Status bar item. The identifier should be unique for the extension but until now this wasn't enforced. With this release, we make this a little more strict and Status bar items that are created by the same extension with the same identifier will now be merged into one.</p> <h3 id="_tasks" data-needslink="_tasks">Tasks</h3> <p>The task presentation option to <a href="https://github.com/microsoft/vscode/blob/1899f626fdca44ff80c34ac0f0fe13fc0d3d0856/src/vscode-dts/vscode.d.ts#L7447-L7450" class="external-link" target="_blank">close</a> the terminal on task completion has been finalized.</p> <h2 id="_proposed-apis" data-needslink="_proposed-apis">Proposed APIs</h2> <p>Every milestone comes with new proposed APIs and extension authors can try them out. As always, we want your feedback. Here are the steps to try out a proposed API:</p> <ol> <li><a href="https://github.com/microsoft/vscode/tree/main/src/vscode-dts" class="external-link" target="_blank">Find a proposal that you want to try</a> and add its name to <code>package.json#enabledApiProposals</code>.</li> <li>Use the latest <a href="https://github.com/microsoft/vscode-dts" class="external-link" target="_blank">@vscode/dts</a> and run <code>npx @vscode/dts dev</code>. It will download the corresponding <code>d.ts</code> files into your workspace.</li> <li>You can now program against the proposal.</li> </ol> <p>You cannot publish an extension that uses a proposed API. There may be breaking changes in the next release and we never want to break existing extensions.</p> <h3 id="_environmentvariablecollectiondescription" data-needslink="_environmentvariablecollectiondescription">EnvironmentVariableCollection.description</h3> <p>This proposal allows specifying a description for <code>EnvironmentVariableCollection</code>, displayed to the user in the terminal tab hover, explaining what exactly the change is doing.</p> <pre class="shiki" style="background-color: #1e1e1e"><code><span class="line"><span style="color: #6A9955">// Example of what the Git extension could use</span></span> <span class="line"><span style="color: #9CDCFE">context</span><span style="color: #BBBBBB">.</span><span style="color: #9CDCFE">environmentVariableCollection</span><span style="color: #BBBBBB">.</span><span style="color: #9CDCFE">description</span><span style="color: #BBBBBB"> </span><span style="color: #D4D4D4">=</span><span style="color: #BBBBBB"> </span><span style="color: #CE9178">'Enables a Git authentication provider'</span><span style="color: #BBBBBB">;</span></span> <span class="line"></span></code></pre> <p><img src="/assets/updates/1_79/terminal-env-description.png" alt="Environment variable collection descriptions are explained in a terminal tab's hover" loading="lazy"></p> <h3 id="_environmentvariablemutatoroptions" data-needslink="_environmentvariablemutatoroptions">EnvironmentVariableMutator.options</h3> <p>This proposal adds options that can be provided to <code>EnvironmentVariableMutator</code>s, allowing you to specify exactly when the environment variable change is applied, either on process creation or in the shell integration script (after shell init scripts have run).</p> <pre class="shiki" style="background-color: #1e1e1e"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #BBBBBB"> </span><span style="color: #4FC1FF">collection</span><span style="color: #BBBBBB"> </span><span style="color: #D4D4D4">=</span><span style="color: #BBBBBB"> </span><span style="color: #9CDCFE">context</span><span style="color: #BBBBBB">.</span><span style="color: #9CDCFE">environmentVariableCollection</span><span style="color: #BBBBBB">;</span></span> <span class="line"><span style="color: #6A9955">// Apply only when the process is created</span></span> <span class="line"><span style="color: #9CDCFE">collection</span><span style="color: #BBBBBB">.</span><span style="color: #DCDCAA">replace</span><span style="color: #BBBBBB">(</span><span style="color: #CE9178">'FOO'</span><span style="color: #BBBBBB">, </span><span style="color: #CE9178">'bar'</span><span style="color: #BBBBBB">);</span></span> <span class="line"><span style="color: #6A9955">// Apply only during the shell integration script</span></span> <span class="line"><span style="color: #9CDCFE">collection</span><span style="color: #BBBBBB">.</span><span style="color: #DCDCAA">replace</span><span style="color: #BBBBBB">(</span><span style="color: #CE9178">'FOO'</span><span style="color: #BBBBBB">, </span><span style="color: #CE9178">'bar'</span><span style="color: #BBBBBB">, {</span></span> <span class="line"><span style="color: #BBBBBB"> </span><span style="color: #9CDCFE">applyAtProcessCreation:</span><span style="color: #BBBBBB"> </span><span style="color: #569CD6">false</span><span style="color: #BBBBBB">,</span></span> <span class="line"><span style="color: #BBBBBB"> </span><span style="color: #9CDCFE">applyAtShellIntegration:</span><span style="color: #BBBBBB"> </span><span style="color: #569CD6">true</span></span> <span class="line"><span style="color: #BBBBBB">});</span></span> <span class="line"><span style="color: #6A9955">// Apply twice, during process creation and the shell integration script</span></span> <span class="line"><span style="color: #9CDCFE">collection</span><span style="color: #BBBBBB">.</span><span style="color: #DCDCAA">replace</span><span style="color: #BBBBBB">(</span><span style="color: #CE9178">'FOO'</span><span style="color: #BBBBBB">, </span><span style="color: #CE9178">'bar'</span><span style="color: #BBBBBB">, {</span></span> <span class="line"><span style="color: #BBBBBB"> </span><span style="color: #9CDCFE">applyAtProcessCreation:</span><span style="color: #BBBBBB"> </span><span style="color: #569CD6">true</span><span style="color: #BBBBBB">,</span></span> <span class="line"><span style="color: #BBBBBB"> </span><span style="color: #9CDCFE">applyAtShellIntegration:</span><span style="color: #BBBBBB"> </span><span style="color: #569CD6">true</span></span> <span class="line"><span style="color: #BBBBBB">});</span></span> <span class="line"></span></code></pre> <h3 id="_share-provider" data-needslink="_share-provider">Share provider</h3> <p>The <a href="https://github.com/microsoft/vscode/blob/4137aa15f55c5ec3777daf6684908f64b439f6aa/src/vscode-dts/vscode.proposed.shareProvider.d.ts" class="external-link" target="_blank">Share API proposal</a> allows extensions to provide ways to share resources in VS Code.</p> <p>Share provider results are currently surfaced as a top-level <strong>Share...</strong> Command Palette action and as a new icon near the <a href="https://code.visualstudio.com/updates/v1_69#_command-center">Command Center</a>, provided you have opted in with <code>"workbench.experimental.share.enabled": true</code> and <code>"window.commandCenter": true</code>.</p> <p><video src="/assets/updates/1_79/share-provider.mp4" autoplay loop controls muted title="Share... icon next to the Command Center"></video></p> <p>You can leave feedback in the <a href="https://github.com/microsoft/vscode/issues/176316" class="external-link" target="_blank">API proposal issue #176316</a>.</p> <h3 id="_static-status-bar-items" data-needslink="_static-status-bar-items">Static Status bar items</h3> <p>Status bar items can now be contributed statically via <code>package.json#contributes/statusBarItems</code>. With this contribution point, an extension can delay its activation and only activate when the Status bar item is interacted with, for example, on the command. Once activated, extensions can access their static Status bar items via the <code>vscode.window.createStatusBarItem</code> API.</p> <h3 id="_workspacesave-and-workspacesaveas" data-needslink="_workspacesave-and-workspacesaveas">workspace.save and workspace.saveAs</h3> <p>The <a href="https://github.com/microsoft/vscode/blob/d823366750a14132c71ab9eea0696ea2bb64144f/src/vscode-dts/vscode.proposed.saveEditor.d.ts" class="external-link" target="_blank">Save Editor API proposal</a> allows extensions to trigger the flow of saving an editor either to its resource or by asking the user to provide a resource.</p> <p>All the methods for saving will return the resulting <code>Uri</code> or <code>undefined</code> if the operation was canceled. Untitled files will always ask the user for a destination unless a path is already associated.</p> <h3 id="_authentication-authgetsessions-proposed-api" data-needslink="_authentication-authgetsessions-proposed-api">Authentication authGetSessions proposed API</h3> <p>As we move closer to having <a href="https://github.com/microsoft/vscode/issues/127967" class="external-link" target="_blank">Multiple GitHub account support</a>, we have a new proposed authentication API that lets your extension get all accessible sessions for a specific set of scopes. <a href="https://github.com/microsoft/vscode/blob/main/src/vscode-dts/vscode.proposed.authGetSessions.d.ts" class="external-link" target="_blank">The proposal for these API additions</a> has several things to call out:</p> <ul> <li>The introduction of <code>vscode.authentication.getSessions</code> to get sessions for each account that your extension has access to. If you want to request an additional account, use <code>{ createIfNone: true, clearSessionPreference: true }</code> to ask the user to choose an account.</li> <li>The <code>forceNewSession</code> property now can take in a <code>{ sessionToRecreate: session }</code> object so that consuming extensions can specify the exact session they want to be recreated.</li> <li>The <code>createSession</code> function that an Auth Provider implements will now get passed in the session to recreate (using the extension's session preference if <code>true</code> is used for the value of <code>forceNewSession</code>).</li> </ul> <p>There is still more work involved to make this ready for adoption in the GitHub Authentication extension so if you're interested, you can follow along and <a href="https://github.com/microsoft/vscode/issues/152399" class="external-link" target="_blank">provide feedback in the issue that tracks this proposal</a>.</p> <h3 id="_window-activity-api" data-needslink="_window-activity-api">Window Activity API</h3> <p>A new API is available to notify extensions if the window becomes active or inactive. This can be used to dispose of or create persistent resources or processes that can be idled to save resources.</p> <p>This is implemented by the addition of a new <code>active</code> boolean to the existing <code>WindowState</code> type.</p> <pre class="shiki" style="background-color: #1e1e1e"><code><span class="line"><span style="color: #9CDCFE">vscode</span><span style="color: #BBBBBB">.</span><span style="color: #9CDCFE">window</span><span style="color: #BBBBBB">.</span><span style="color: #DCDCAA">onDidChangeWindowState</span><span style="color: #BBBBBB">(</span><span style="color: #9CDCFE">state</span><span style="color: #BBBBBB"> </span><span style="color: #569CD6">=></span><span style="color: #BBBBBB"> {</span></span> <span class="line"><span style="color: #BBBBBB"> </span><span style="color: #C586C0">if</span><span style="color: #BBBBBB"> (</span><span style="color: #9CDCFE">state</span><span style="color: #BBBBBB">.</span><span style="color: #9CDCFE">active</span><span style="color: #BBBBBB"> </span><span style="color: #D4D4D4">&&</span><span style="color: #BBBBBB"> </span><span style="color: #D4D4D4">!</span><span style="color: #9CDCFE">longRunningProcess</span><span style="color: #BBBBBB">) {</span></span> <span class="line"><span style="color: #BBBBBB"> </span><span style="color: #9CDCFE">longRunningProcess</span><span style="color: #BBBBBB"> </span><span style="color: #D4D4D4">=</span><span style="color: #BBBBBB"> </span><span style="color: #DCDCAA">startLongRunningProcess</span><span style="color: #BBBBBB">();</span></span> <span class="line"><span style="color: #BBBBBB"> } </span><span style="color: #C586C0">else</span><span style="color: #BBBBBB"> </span><span style="color: #C586C0">if</span><span style="color: #BBBBBB"> (</span><span style="color: #D4D4D4">!</span><span style="color: #9CDCFE">state</span><span style="color: #BBBBBB">.</span><span style="color: #9CDCFE">active</span><span style="color: #BBBBBB"> </span><span style="color: #D4D4D4">&&</span><span style="color: #BBBBBB"> </span><span style="color: #9CDCFE">longRunningProcess</span><span style="color: #BBBBBB">) {</span></span> <span class="line"><span style="color: #BBBBBB"> </span><span style="color: #9CDCFE">longRunningProcess</span><span style="color: #BBBBBB">.</span><span style="color: #DCDCAA">end</span><span style="color: #BBBBBB">();</span></span> <span class="line"><span style="color: #BBBBBB"> </span><span style="color: #9CDCFE">longRunningProcess</span><span style="color: #BBBBBB"> </span><span style="color: #D4D4D4">=</span><span style="color: #BBBBBB"> </span><span style="color: #569CD6">undefined</span><span style="color: #BBBBBB">;</span></span> <span class="line"><span style="color: #BBBBBB"> }</span></span> <span class="line"><span style="color: #BBBBBB">});</span></span> <span class="line"></span></code></pre> <h2 id="_engineering" data-needslink="_engineering">Engineering</h2> <h3 id="_electron-sandbox-enabled-for-all-users" data-needslink="_electron-sandbox-enabled-for-all-users">Electron sandbox enabled for all users</h3> <p>We are happy to announce that the Electron sandbox is rolling out to all of our users. This was a journey that started in early 2020 and now finally comes to an end. You can refer to the <a href="https://code.visualstudio.com/blogs/2022/11/28/vscode-sandbox">Migrating VS Code to Process Sandboxing</a> blog post for more details.</p> <h3 id="_extension-host-restart-participation" data-needslink="_extension-host-restart-participation">Extension host restart participation</h3> <p>Certain actions in the workbench can lead to the extension host restarting without reloading the current window. For example, when you switch profiles, VS Code restarts the extension host to handle running a different set of extensions for that profile.</p> <p>Some custom and notebook editors however may no longer be functional after having switched profiles because a required extension is not installed in that profile. If the editor has unsaved changes, this could cause data loss. As a fix, components in VS Code can now participate in extension host restarts and make sure any unsaved changes are saved before the extension host restarts.</p> <p><video src="/assets/updates/1_79/profile-switch.mp4" autoplay loop controls muted title="Switch profile with hex editor dirty"></video></p> <p>We plan to further develop this experience in the next milestone so stay tuned for more!</p> <h3 id="_windows-8-and-81-support-has-ended" data-needslink="_windows-8-and-81-support-has-ended">Windows 8 and 8.1 support has ended</h3> <p>As mentioned in our <a href="https://code.visualstudio.com/updates/v1_77#_eol-warning-for-windows-8-and-81">v1.77 release notes</a>, <code>v1.79</code> is the last release that supports Windows 8 / Windows Server 2012 and Windows 8.1 / Windows Server 2012 R2. Refer to our <a href="https://code.visualstudio.com/docs/supporting/faq#_can-i-run-vs-code-on-older-windows-versions">FAQ</a> for additional information.</p> <h3 id="_milestone-automation" data-needslink="_milestone-automation">Milestone automation</h3> <p>We have implemented automated milestone replication throughout all of our GitHub repositories. This means that the monthly milestones established in <code>microsoft/vscode</code> serve as the foundation for all other milestones that are created and maintained.</p> <h2 id="_vs-code-at-microsoft-build" data-needslink="_vs-code-at-microsoft-build">VS Code at Microsoft Build</h2> <p>If you didn't get a chance to watch <a href="https://news.microsoft.com/build-2023" class="external-link" target="_blank">Microsoft Build 2023</a> live, you can catch up on the keynotes and sessions on the <a href="https://www.youtube.com/@MicrosoftDeveloper/videos" class="external-link" target="_blank">Microsoft Developer</a> YouTube channel.</p> <p>Some sessions of particular interest to VS Code users include:</p> <ul> <li><a href="https://www.youtube.com/watch?v=KMOV1Zy8YeM" class="external-link" target="_blank">Next generation AI for developers with the Microsoft Cloud</a></li> <li><a href="https://www.youtube.com/watch?v=CYObXaSjj78" class="external-link" target="_blank">Develop from anywhere with Visual Studio Code</a></li> <li><a href="https://www.youtube.com/watch?v=CwAzIpc4AnA" class="external-link" target="_blank">Pragmatic techniques to get the most out of GitHub Copilot</a></li> <li><a href="https://www.youtube.com/watch?v=jl8-7AJb98g" class="external-link" target="_blank">Inject the power of the cloud and AI into your development workflow</a></li> </ul> <h2 id="_notable-fixes" data-needslink="_notable-fixes">Notable fixes</h2> <ul> <li><a href="https://github.com/microsoft/vscode/issues/165933" class="external-link" target="_blank">165933</a> [emmet] http-equiv="X-UA-Compatible" in 2023</li> <li><a href="https://github.com/microsoft/vscode/issues/181889" class="external-link" target="_blank">181889</a> treeView.reveal with expand: 3 only expands the first level 3 folder</li> </ul> <h2 id="_thank-you" data-needslink="_thank-you">Thank you</h2> <p>Last but certainly not least, a big <em><strong>Thank You</strong></em> to the contributors of VS Code.</p> <h3 id="_issue-tracking" data-needslink="_issue-tracking">Issue tracking</h3> <p>Contributions to our issue tracking:</p> <ul> <li><a href="https://github.com/gjsjohnmurray" class="external-link" target="_blank">@gjsjohnmurray (John Murray)</a></li> <li><a href="https://github.com/starball5" class="external-link" target="_blank">@starball5 (starball)</a></li> <li><a href="https://github.com/IllusionMH" class="external-link" target="_blank">@IllusionMH (Andrii Dieiev)</a></li> <li><a href="https://github.com/tamuratak" class="external-link" target="_blank">@tamuratak (Takashi Tamura)</a></li> </ul> <h3 id="_pull-requests" data-needslink="_pull-requests">Pull requests</h3> <p>Contributions to <code>vscode</code>:</p> <ul> <li><a href="https://github.com/akbyrd" class="external-link" target="_blank">@akbyrd (Adam Byrd)</a>: Fix issues with msCompile problem matcher <a href="https://github.com/microsoft/vscode/pull/182167" class="external-link" target="_blank">PR #182167</a></li> <li><a href="https://github.com/ashgti" class="external-link" target="_blank">@ashgti (John Harrison)</a>: Fixing an issue in debug output prompts to not show up as 'object Object' <a href="https://github.com/microsoft/vscode/pull/181964" class="external-link" target="_blank">PR #181964</a></li> <li><a href="https://github.com/benibenj" class="external-link" target="_blank">@benibenj (Benjamin Simmonds)</a>: TreeView Checkbox State set to 0 fixed <a href="https://github.com/microsoft/vscode/pull/183342" class="external-link" target="_blank">PR #183342</a></li> <li><a href="https://github.com/bitekas" class="external-link" target="_blank">@bitekas (Viktor Korsun)</a>: Fixing the Pseudoterminal onDidClose example <a href="https://github.com/microsoft/vscode/pull/180026" class="external-link" target="_blank">PR #180026</a></li> <li><a href="https://github.com/dan-petty" class="external-link" target="_blank">@dan-petty (Daniel Petty)</a>: Fix cannot specify custom path for built-in profiles on Windows <a href="https://github.com/microsoft/vscode/pull/175464" class="external-link" target="_blank">PR #175464</a></li> <li><a href="https://github.com/dcourv" class="external-link" target="_blank">@dcourv (Dylan)</a>: Fixes #181207 - Add padding to extension viewer bottom <a href="https://github.com/microsoft/vscode/pull/181723" class="external-link" target="_blank">PR #181723</a></li> <li><a href="https://github.com/DoctorKrolic" class="external-link" target="_blank">@DoctorKrolic</a>: Add <code>JSON Lines</code> language definition <a href="https://github.com/microsoft/vscode/pull/183035" class="external-link" target="_blank">PR #183035</a></li> <li><a href="https://github.com/dyedgreen" class="external-link" target="_blank">@dyedgreen (Tilman Roeder)</a>: Fix: Encode paths as URI components when opening a folder or workspace <a href="https://github.com/microsoft/vscode/pull/182398" class="external-link" target="_blank">PR #182398</a></li> <li><a href="https://github.com/ElectricRCAircraftGuy" class="external-link" target="_blank">@ElectricRCAircraftGuy (Gabriel Staples)</a>: all color themes: treat comment docstrings as comments too <a href="https://github.com/microsoft/vscode/pull/182162" class="external-link" target="_blank">PR #182162</a></li> <li><a href="https://github.com/gjsjohnmurray" class="external-link" target="_blank">@gjsjohnmurray (John Murray)</a> <ul> <li>Fix spelling in description of <code>security.restrictUNCAccess</code> setting <a href="https://github.com/microsoft/vscode/pull/182842" class="external-link" target="_blank">PR #182842</a></li> <li>Prevent duplicate text in workspace folder picker when path has no parent (fix #183418) <a href="https://github.com/microsoft/vscode/pull/183427" class="external-link" target="_blank">PR #183427</a></li> </ul> </li> <li><a href="https://github.com/hermannloose" class="external-link" target="_blank">@hermannloose (Hermann Loose)</a> <ul> <li>Add separate overview ruler colors for resolved & unresolved comments <a href="https://github.com/microsoft/vscode/pull/181520" class="external-link" target="_blank">PR #181520</a></li> <li>Fix color descriptions for comment icons <a href="https://github.com/microsoft/vscode/pull/181628" class="external-link" target="_blank">PR #181628</a></li> </ul> </li> <li><a href="https://github.com/iAnujParajuli" class="external-link" target="_blank">@iAnujParajuli (Anuj Parajuli)</a>: Adds #181652 html audio tag for audio file <a href="https://github.com/microsoft/vscode/pull/183328" class="external-link" target="_blank">PR #183328</a></li> <li><a href="https://github.com/jacekkopecky" class="external-link" target="_blank">@jacekkopecky (Jacek Kopecký)</a> <ul> <li>Add settings for fixed-width tabs <a href="https://github.com/microsoft/vscode/pull/181729" class="external-link" target="_blank">PR #181729</a></li> <li>fixed tab sizing: restore tab widths when the last tab is closed <a href="https://github.com/microsoft/vscode/pull/183188" class="external-link" target="_blank">PR #183188</a></li> </ul> </li> <li><a href="https://github.com/jackpunt" class="external-link" target="_blank">@jackpunt (Ganesh)</a> <ul> <li>Add a setting to mark file(s) readonly (nonEditable)<a href="https://github.com/microsoft/vscode/pull/161716" class="external-link" target="_blank">PR #161716</a></li> <li>precedence for isReadonly() for #181708 <a href="https://github.com/microsoft/vscode/pull/181955" class="external-link" target="_blank">PR #181955</a></li> </ul> </li> <li><a href="https://github.com/jairbubbles" class="external-link" target="_blank">@jairbubbles (Julien Richard)</a>: Fix context menu for deleted lines in diff inline mode <a href="https://github.com/microsoft/vscode/pull/182542" class="external-link" target="_blank">PR #182542</a></li> <li><a href="https://github.com/jeanp413" class="external-link" target="_blank">@jeanp413 (Jean Pierre)</a> <ul> <li>Fixes ITerminalService#getActiveOrCreateInstance returns a disposed terminal <a href="https://github.com/microsoft/vscode/pull/180451" class="external-link" target="_blank">PR #180451</a></li> <li>Fixes empty terminal editor after reload <a href="https://github.com/microsoft/vscode/pull/182121" class="external-link" target="_blank">PR #182121</a></li> <li>Fixes terminal doesn't take editor background color into account <a href="https://github.com/microsoft/vscode/pull/182557" class="external-link" target="_blank">PR #182557</a></li> <li>Fix Improve terminal find behavior when there are more than 1000 results <a href="https://github.com/microsoft/vscode/pull/182917" class="external-link" target="_blank">PR #182917</a></li> <li>Fix cannot hide terminal find widget when pressing <code>esc</code> <a href="https://github.com/microsoft/vscode/pull/183090" class="external-link" target="_blank">PR #183090</a></li> <li>Fix Terminals aren't persisting anymore <a href="https://github.com/microsoft/vscode/pull/183516" class="external-link" target="_blank">PR #183516</a></li> </ul> </li> <li><a href="https://github.com/Juneezee" class="external-link" target="_blank">@Juneezee (Eng Zer Jun)</a>: refactor(userDataSync): replace <code>indexOf</code> with <code>includes</code> <a href="https://github.com/microsoft/vscode/pull/182635" class="external-link" target="_blank">PR #182635</a></li> <li><a href="https://github.com/markw65" class="external-link" target="_blank">@markw65</a> <ul> <li>Fix a task startup race <a href="https://github.com/microsoft/vscode/pull/180546" class="external-link" target="_blank">PR #180546</a></li> <li>Make _activeTasks synchronous wrt _executeTask <a href="https://github.com/microsoft/vscode/pull/180617" class="external-link" target="_blank">PR #180617</a></li> </ul> </li> <li><a href="https://github.com/max06" class="external-link" target="_blank">@max06 (Flo)</a>: Fix: Changed bash-syntax to fish-syntax in shellIntegration <a href="https://github.com/microsoft/vscode/pull/181637" class="external-link" target="_blank">PR #181637</a></li> <li><a href="https://github.com/r3m0t" class="external-link" target="_blank">@r3m0t (Tomer Chachamu)</a> <ul> <li>Interactive window- don't leave space for insert toolbar <a href="https://github.com/microsoft/vscode/pull/181949" class="external-link" target="_blank">PR #181949</a></li> <li>Prevent ligatures between inlay hints and editor contents (Fix #170449) <a href="https://github.com/microsoft/vscode/pull/182379" class="external-link" target="_blank">PR #182379</a></li> </ul> </li> <li><a href="https://github.com/rehmsen" class="external-link" target="_blank">@rehmsen (Ole)</a>: Add F10 keybinding for debugger step, even on Web. <a href="https://github.com/microsoft/vscode/pull/183510" class="external-link" target="_blank">PR #183510</a></li> <li><a href="https://github.com/soulshined" class="external-link" target="_blank">@soulshined (David Freer)</a>: PHP Snippets Quality of Life and Continuity <a href="https://github.com/microsoft/vscode/pull/174889" class="external-link" target="_blank">PR #174889</a></li> <li><a href="https://github.com/TheSylvester" class="external-link" target="_blank">@TheSylvester (Sylvester Wong)</a>: Added use snippet body as a description when none is provided #181115 <a href="https://github.com/microsoft/vscode/pull/181381" class="external-link" target="_blank">PR #181381</a></li> <li><a href="https://github.com/tisilent" class="external-link" target="_blank">@tisilent (xie jialong 努力鸭)</a> <ul> <li>Modify innerWidth <a href="https://github.com/microsoft/vscode/pull/180480" class="external-link" target="_blank">PR #180480</a></li> <li>Fix contributed profile icons <a href="https://github.com/microsoft/vscode/pull/182615" class="external-link" target="_blank">PR #182615</a></li> <li>fix #182702 <a href="https://github.com/microsoft/vscode/pull/182705" class="external-link" target="_blank">PR #182705</a></li> </ul> </li> <li><a href="https://github.com/ugultopu" class="external-link" target="_blank">@ugultopu (Utku Gultopu)</a>: Add similarity threshold option to Git extension <a href="https://github.com/microsoft/vscode/pull/178266" class="external-link" target="_blank">PR #178266</a></li> <li><a href="https://github.com/vadimcn" class="external-link" target="_blank">@vadimcn</a>: Preserve breakpoint ids in workspace state <a href="https://github.com/microsoft/vscode/pull/182704" class="external-link" target="_blank">PR #182704</a></li> <li><a href="https://github.com/Viijay-Kr" class="external-link" target="_blank">@Viijay-Kr (Vijaya Krishna)</a>: fix: #169151 fallback to editor hover if no breakpoint <a href="https://github.com/microsoft/vscode/pull/181274" class="external-link" target="_blank">PR #181274</a></li> <li><a href="https://github.com/Yash-Singh1" class="external-link" target="_blank">@Yash-Singh1 (Yash Singh)</a>: feat: .vuerc as json file <a href="https://github.com/microsoft/vscode/pull/153017" class="external-link" target="_blank">PR #153017</a></li> <li><a href="https://github.com/yshaojun" class="external-link" target="_blank">@yshaojun</a>: fix: fix perl bracket pair by adding unbalancedBracketScopes(#_168110) <a href="https://github.com/microsoft/vscode/pull/181203" class="external-link" target="_blank">PR #181203</a></li> </ul> <p>Contributions to <code>vscode-css-languageservice</code>:</p> <ul> <li><a href="https://github.com/romainmenke" class="external-link" target="_blank">@romainmenke (Romain Menke)</a>: css nesting : increase support <a href="https://github.com/microsoft/vscode-css-languageservice/pull/345" class="external-link" target="_blank">PR #345</a></li> </ul> <p>Contributions to <code>vscode-js-debug</code>:</p> <ul> <li><a href="https://github.com/NotAndOr" class="external-link" target="_blank">@NotAndOr (notandor)</a>: Launch browser with argument user-data-dir specified without directory junction. <a href="https://github.com/microsoft/vscode-js-debug/pull/1656" class="external-link" target="_blank">PR #1656</a></li> </ul> <p>Contributions to <code>vscode-pull-request-github</code>:</p> <ul> <li><a href="https://github.com/kabel" class="external-link" target="_blank">@kabel (Kevin Abel)</a>: Simplify <code>AuthProvider</code> enum <a href="https://github.com/microsoft/vscode-pull-request-github/pull/4779" class="external-link" target="_blank">PR #4779</a></li> <li><a href="https://github.com/SKPG-Tech" class="external-link" target="_blank">@SKPG-Tech (Salvijus K.)</a>: Add missing index in template <a href="https://github.com/microsoft/vscode-pull-request-github/pull/4822" class="external-link" target="_blank">PR #4822</a></li> <li><a href="https://github.com/unknovvn" class="external-link" target="_blank">@unknovvn (Andzej Korovacki)</a>: Use git setting to fetch before checkout in checkoutExistingPullRequestBranch <a href="https://github.com/microsoft/vscode-pull-request-github/pull/4759" class="external-link" target="_blank">PR #4759</a></li> </ul> <p>Contributions to <code>monaco-editor</code>:</p> <ul> <li><a href="https://github.com/dlitsman" class="external-link" target="_blank">@dlitsman (Dmitry Litsman)</a>: Extend the "Rendering Glyphs In The Margin" example to include a transparent color note. <a href="https://github.com/microsoft/monaco-editor/pull/3945" class="external-link" target="_blank">PR #3945</a></li> <li><a href="https://github.com/dneto0" class="external-link" target="_blank">@dneto0 (David Neto)</a>: Avoid a hack in the WGSL lexer <a href="https://github.com/microsoft/monaco-editor/pull/3887" class="external-link" target="_blank">PR #3887</a></li> <li><a href="https://github.com/spahnke" class="external-link" target="_blank">@spahnke (Sebastian Pahnke)</a> <ul> <li>JS, TS Add Monarch support for private identifiers <a href="https://github.com/microsoft/monaco-editor/pull/3919" class="external-link" target="_blank">PR #3919</a></li> <li>JS Add static keyword <a href="https://github.com/microsoft/monaco-editor/pull/3922" class="external-link" target="_blank">PR #3922</a></li> </ul> </li> <li><a href="https://github.com/titouanmathis" class="external-link" target="_blank">@titouanmathis (Titouan Mathis)</a>: Webpack Plugin Fix CJS being injected in ESM files <a href="https://github.com/microsoft/monaco-editor/pull/3933" class="external-link" target="_blank">PR #3933</a></li> </ul> <p><a id="scroll-to-top" role="button" title="Scroll to top" aria-label="scroll to top" href="#"><span class="icon"></span></a></p> <div class="feedback"></div> </main> <!-- medium right nav --> <div class="col-sm-3 col-md-2 hidden-xs docs-subnavbar-container"> <nav id="docs-subnavbar" aria-label="On Page" data-spy="affix" data-offset-top="20"> <h4><span class="sr-only">In this update, there are 17 sections</span><span aria-hidden="true">In this update</span></h4> <ul class="nav"> <li><a href="#_accessibility">Accessibility</a></li> <li><a href="#_workbench">Workbench</a></li> <li><a href="#_editor">Editor</a></li> <li><a href="#_terminal">Terminal</a></li> <li><a href="#_source-control">Source Control</a></li> <li><a href="#_notebooks">Notebooks</a></li> <li><a href="#_languages">Languages</a></li> <li><a href="#_remote-development">Remote Development</a></li> <li><a href="#_contributions-to-extensions">Contributions to extensions</a></li> <li><a href="#_preview-features">Preview features</a></li> <li><a href="#_webassemblies-in-vs-code-for-the-web">WebAssemblies in VS Code for the Web</a></li> <li><a href="#_extension-authoring">Extension authoring</a></li> <li><a href="#_proposed-apis">Proposed APIs</a></li> <li><a href="#_engineering">Engineering</a></li> <li><a href="#_vs-code-at-microsoft-build">VS Code at Microsoft Build</a></li> <li><a href="#_notable-fixes">Notable fixes</a></li> <li><a href="#_thank-you">Thank you</a></li> </ul> <div class="connect-widget"></div> </nav> </div> <!-- end of page connect widget --> <div class="col-xs-12 visible-xs"> <div class="connect-widget"></div> </div> </div> </div> </div> </div> <footer role="contentinfo" class="container"> <div class="footer-container"> <div class="footer-row"> <div class="footer-social"> <ul class="links"> <li> <a href="https://go.microsoft.com/fwlink/?LinkID=533687"><img src="/assets/icons/x-icon.svg" class="x-icon" alt="Follow us on X"></a> </li> <li> <a href="https://github.com/microsoft/vscode"><img src="/assets/icons/github-icon.svg" alt="VS Code on Github"></a> </li> <li> <a href="https://www.youtube.com/@code"><img src="/assets/icons/youtube-icon.svg" alt="VS Code on YouTube"></a> </li> <script> function manageConsent() { if (siteConsent && siteConsent.isConsentRequired) { siteConsent.manageConsent(); } } </script> </ul> <a id="footer-microsoft-link" class="microsoft-logo" href="https://www.microsoft.com"> <img src="/assets/icons/microsoft.svg" alt="Microsoft homepage" /> </a> </div> </div> <div class="footer-row"> <ul class="links"> <li><a id="footer-support-link" href="https://support.serviceshub.microsoft.com/supportforbusiness/create?sapId=d66407ed-3967-b000-4cfb-2c318cad363d" target="_blank" rel="noopener">Support</a></li> <li><a id="footer-privacy-link" href="https://go.microsoft.com/fwlink/?LinkId=521839" target="_blank" rel="noopener">Privacy</a></li> <li style="display: none;"><a id="footer-cookie-link" style="cursor: pointer;" onclick="manageConsent()" target="_blank" rel="noopener">Manage Cookies</a></li> <li><a id="footer-terms-link" href="https://www.microsoft.com/legal/terms-of-use" target="_blank" rel="noopener">Terms of Use</a></li> <li><a id="footer-license-link" href="/License" target="_blank" rel="noopener">License</a></li> </ul> </div> </div> </footer> <script type="module"> document.addEventListener('DOMContentLoaded', () => { const copilotDeepLinks = document.querySelectorAll('.copilot-deep-link'); if (copilotDeepLinks.length === 0) { return; } if (window.innerWidth < 992) { for (const link of copilotDeepLinks) { link.href = 'https://aka.ms/vscode-activatecopilotfree'; } } }); </script> <script src="/dist/index.js"></script> <script type="application/ld+json"> { "@context" : "http://schema.org", "@type" : "SoftwareApplication", "name" : "Visual Studio Code", "softwareVersion": "1.97", "offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" }, "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Text Editor", "alternateName": "VS Code", "datePublished": "2021-11-03", "operatingSystem": "Mac, Linux, Windows", "logo": "https://code.visualstudio.com/assets/apple-touch-icon.png", "screenshot": "https://code.visualstudio.com/assets/home/home-screenshot-win.png", "releaseNotes": "https://code.visualstudio.com/updates", "downloadUrl": "https://code.visualstudio.com/download", "license": "https://code.visualstudio.com/license", "softwareRequirements": "https://code.visualstudio.com/docs/supporting/requirements", "url" : "https://code.visualstudio.com", "author": { "@type": "Organization", "name": "Microsoft" }, "publisher": { "@type": "Organization", "name": "Microsoft" }, "maintainer": { "@type": "Organization", "name": "Microsoft" }, "potentialAction": { "@type": "SearchAction", "target": "https://code.visualstudio.com/Search?q={search_term_string}", "query-input": "required name=search_term_string" }, "sameAs" : [ "https://en.wikipedia.org/wiki/Visual_Studio_Code", "https://twitter.com/code", "https://www.youtube.com/code", "https://www.tiktok.com/@vscode", "https://github.com/microsoft/vscode" ] } </script> </body> </html>