Extension Authoring · code.visualstudio.com

Update 1.96.1: The update addresses these issues and enables the GitHub Copilot Free plan.

Update 1.96.2: The update addresses these issues.

Update 1.96.3: The update addresses these issues.

Update 1.96.4: The update addresses these issues.

Downloads: Windows: x64 Arm64 | Mac: Universal Intel silicon | Linux: deb rpm tarball Arm snap


Welcome to the November 2024 release of Visual Studio Code. There are many updates in this version that we hope you'll like, some of the key highlights include:

If you'd like to read these release notes online, go to Updates on code.visualstudio.com. Insiders: Want to try new features as soon as possible? You can download the nightly Insiders build and try the latest updates as soon as they are available.

GitHub Copilot

GitHub Copilot Free plan

We're excited to announce an all new free tier for GitHub Copilot. Sign up for the GitHub Copilot Free plan, and all you need is a GitHub account. You are entitled to a number of completions and chat interactions per month, which reset each month.

You can sign up directly from within VS Code. Follow the steps in the Copilot Setup guide.

Chat view shows the Copilot message and a button that enables you to sign in to use Copilot.

Learn more about the Copilot Free plan details and conditions.

Copilot Edits

Last milestone, we introduced Copilot Edits (currently in preview), which allows you to quickly edit multiple files at once using natural language. Since then, we've continued to iterate on the experience. You can try out Copilot Edits by opening the Copilot menu in the Command Center, and then selecting Open Copilot Edits, or by triggering .

Progress and editor controls

Copilot Edits can make multiple changes across different files. You can now more clearly see its progress as edits stream in. And with the editor overlay controls, you can easily cycle through all changes and accept or discard them.

Move chat session to Copilot Edits

You might use the Chat view to explore some ideas for making changes to your code. Instead of applying individual code blocks, you can now move the chat session to Copilot Edits to apply all code suggestions from the session.

Edit with Copilot showing for a chat exchange.

Working set suggested files

In Copilot Edits, the working set determines the files that Copilot Edits can suggest changes for. To help you add relevant files to the working set, for a Git repo, Copilot Edits can now suggest additional files based on the files you've already added. For example, Copilot Edits will suggest files that are often changed together with the files you've already added.

Copilot shows suggested files alongside the Add Files button in the working set. You can also select Add Files and then select Related Files to choose from a list of suggested files.

Restore Edit sessions after restart

Edit sessions are now fully restored after restarting VS Code. This includes the working set, acceptance state, as well as the file state of all past edit steps.

Add to working set from Explorer, Search, and editor

You can add files to your Copilot Edits working set with the new Add File to Copilot Edits context menu action for search results in the Search view and for files in the Explorer view. Additionally, you can also attach a text selection to Copilot Edits from the editor context menu.

Add a file from the explorer view to Copilot Edits

Debugging with Copilot

Configuring debugging can be tricky, especially when you're working with a new project or language. This milestone, we're introducing a new copilot-debug terminal command to help you debug your programs using VS Code. You can use it by prefixing the command that you would normally run with copilot-debug. For example, if you normally run your program using the command python foo.py, you can now run copilot-debug python foo.py to start a debugging session.

After your program exits, you are given options to rerun your program or to view, save, or regenerate the VS Code launch configuration that was used to debug your program.

The terminal shows options to rerun, regenerate, save, or the launch config after a debugging session. Theme: Codesong (preview on vscode.dev)

Tasks Support

Copilot's debugging features, including copilot-debug and the /startDebugging intent, now generate preLaunchTasks as needed for code that needs a compilation step before debugging. This is often the case for compiled languages, such as Rust and C++.

Add Context

We’ve added new ways to include symbols and folders as context in Copilot Chat and Copilot Edits, making it easier to reference relevant information during your workflow.

Symbols

Symbols can now easily be added to Copilot Chat and Copilot Edits by dragging and dropping them from the Outline View or Breadcrumbs into the Chat view.

We’ve also introduced symbol completion in the chat input. By typing # followed by the symbol name, you’ll see suggestions for symbols from files you've recently worked on.

To reference symbols across your entire project, you can use #sym to open a global symbols picker.

Folders

Folders can now be added as context by dragging them from the Explorer, Breadcrumbs, or other views into Copilot Chat.

When a folder is dragged into Copilot Edits, all files within the folder are included in the working set.

Copilot usage graph

VS Code extensions can use the VS Code API to build on the capabilities of Copilot. You can now see a graph of an extension's Copilot usage in the Runtime Status view. This graph shows the number of chat requests that were made by the extension over the last 30 days.

Copilot usage graph in the Runtime Status view

Custom instructions for commit message generation

Copilot can help you generate commit messages based on the changes you've made. This milestone, we added support for custom instructions when generating a commit message. For example, if your commit messages need to follow a specific format, you can describe this in the custom instructions.

You can use the github.copilot.chat.commitMessageGeneration.instructions setting to either specify the custom instructions or specify a file from your workspace that contains the custom instructions. These instructions are appended to the prompt that is used to generate the commit message. Get more information on how to use custom instructions.

Inline Chat

This milestone, we have further improved the user experience of Inline Chat: we made the progress reporting more subtle, while streaming in changes squiggles are disabled, and detected commands are rendered more nicely.

Also, we have continued to improve our pseudo-code detection and now show a hint that you can continue with Inline Chat when a line is mostly natural language. This functionality lets you type pseudo code in the editor, which is then used as a prompt for Inline Chat. You can also trigger this flow by pressing .

Inline Chat hint for a line that is dominated by natural language.

Additionally, there is a new, experimental, setting to make an Inline Chat hint appear on empty lines. This setting can be enabled via inlineChat.lineEmptyHint . By default, this setting is disabled.

Terminal Chat

Terminal Inline Chat has a fresh coat of paint that brings the look and feel much closer to editor Inline Chat:

Terminal inline chat looks a lot like editor chat now

Here are some other improvements of note that were made:

  • The layout and positioning of the widget is improved and generally behaves better
  • There's a model picker
  • The buttons on the bottom are now more consistent

Performance improvements for @workspace

When you use @workspace to ask Copilot about your currently opened workspace, we first need to narrow the workspace down into a set of relevant code snippets that we can hand off to Copilot as context. If your workspaces is backed by a GitHub repo, we can find these relevant snippets quickly by using Github code search. However, as the code search index tracks the main branch of your repository, we couldn't rely on it for local changes or when on a branch.

This milestone, we've worked bring the speed benefits of Github search to branches and pull requests. This means that we now search both the remote index based on your repo's main branch, along with searching any locally changed files. We then merge these results together, giving Copilot a fast and up to date set of snippets to work with. You can read more about Github code search and how to enable it.

Accessibility

Code Action accessibility signals

Some code actions can take a long time to complete, for example a quick fix that calls an external service to generate image alt text. It might not be obvious when they were triggered or when they're fully applied. Therefore, we added accessibility signals to indicate that a code action was triggered or applied.

You can enable these signals with the accessibility.signals.codeActionTriggered and accessibility.signals.codeActionApplied settings.

Automatic focus management in the REPL

We introduced a new setting to improve accessibility when working in the REPL. With accessibility.replEditor.autoFocusReplExecution , you can now specify whether focus remains unchanged (none), moves to the input box (input), or shifts to the most recently executed cell (lastExecution) whenever code is executed. By default, the focus moves to the input box.

Workbench

Improved extension search results

When you search for extensions using free-form text in the Extensions view, installed extensions now appear at the top of the search results. This makes it easier to find and manage your installed extensions when searching through the Marketplace.

Installed extensions shown at top of search results.

Download extensions from the Extensions view

You can now download extensions directly from VS Code by using the download action in the context menu of an extension in the Extensions view. This can be useful if you want to download an extension without installing it.

Context menu option to download an extension from the Extensions view.

Extension disk space

You can now see the memory usage of an extension on disk in the Extensions editor. This can help you understand how much disk space an extension is using.

Extension memory usage on disk shown in the Extensions view.

Find in Explorer improvements

In the September release, we introduced the ability to find files in the Explorer across the entire project, a capability that was previously unavailable. However, this update temporarily removed highlight mode and limited certain actions.

In this release, we’re bringing back highlight mode. This feature allows you to easily locate files and folders across your workspace, with matching results highlighted for better visibility. Additionally, we’ve introduced a new visual indicator on collapsed folders, showing if matches are hidden within them.

The filter toggle remains available, enabling you to focus only on files and folders that match your query by hiding non-matching items. We also reenabled all context menu actions we had to disable in a previous release.

We’ve also improved the user experience when using the find control. When scrolled to the top of the file explorer, additional space is created at the top, ensuring the control doesn’t obstruct your search results.

The find control is rendered above the first file or folder in the explorer when scrolled to the top.

Move views between Primary and Secondary Side Bar

You could already move a view container to another location by using drag and drop or by using the Move View command. You can now directly use the Move To context menu action on a view container to move it between the Primary Side Bar, Secondary Side Bar, or Panel area.

Hide navigation controls in the title area

Some people prefer to keep the title area as clean as possible. We added a new setting workbench.navigationControl.enabled that enables you to hide the back/forward buttons in the title area.

You can also access this setting by right-clicking in the title area, and selecting Navigation Controls.

Navigation Controls context menu when right-clicking the VS Code title area.

Editor

Configure paste and drop behavior

When you drag and drop or copy and paste a file into a text editor, VS Code provides multiple ways to insert it into that file. By default, VS Code tries to insert the file's workspace relative path. Now you can use the drop/paste control to switch how the resource is inserted. Extensions can also provide customized edits, such as in Markdown, which provides edits that insert Markdown links.

With the new editor.pasteAs.preferences and editor.dropIntoEditor.preferences settings, you can now specify a preference for which edit type will be used by default. For example, if you'd like copy/paste to always insert the absolute path of pasted files, just set:

"editor.pasteAs.preferences": [
    "text.updateImports"
]

Now, VS Code automatically tries to paste with imports when possible, falling back to pasting plain text if no paste with imports edit is available. Right now, this only works for JavaScript and TypeScript, but we hope additional languages will adopt support over time.

Finally, you can now also specify a preferred paste style when setting up a editor.action.pasteAs keybinding. The keybinding below will always try pasting and updating imports:

{
  "git.blame.editorDecoration.template": "${subject}, ${authorName} (${authorDateAgo})"
}

If you would like to adjust the color of the editor decoration, use the git.blame.editorDecorationForeground theme color.

Give this experimental feature a try and let us know what you think.

Source Control Graph title actions

Based on user feedback, we have brought back the Pull, and Push actions to the Source Control Graph view title bar. These actions are enabled if the current history item reference is shown in the Source Control Graph.

If you do not want to use these actions, or any other actions from the Source Control Graph view title bar, you can right-click on the title bar and hide them.

Source Control Graph title actions and context menu to hide specific items.

Notebooks

Selection highlight across cells

Selection highlighting is now supported within notebooks, allowing for textual selection based highlights across multiple cells. This is controlled with the preexisting setting editor.selectionHighlight .

Multi Cursor: Select All Occurrences of Find Match

Notebooks now support the keyboard shortcut for Select All Occurrences of Find Match. This can be found with the command id notebook.selectAllFindMatches and can be used by default with the keystroke ⇧⌘L (Windows, Linux Ctrl+Shift+L).

Run Cells in Section for Markdown

Notebooks now have the Run Cells in Section action exposed to the cell toolbar of Markdown cells. If the Markdown cell has a header, all cells contained within the section and children sections are executed. If there is no header, this executes all cells in the surrounding section, if possible.

Cell execution time verbosity

The execution time information within the cell status bar now has an option for increased verbosity. This can be turned on with the setting notebook.cellExecutionTimeVerbosity and is able to display the execution timestamp in addition to the duration.

Verbose cell execution time within cell status bar.

Terminal

Ligature support

Ligatures are now supported in the terminal, regardless of whether GPU acceleration is being used. This feature can be turned on with the setting terminal.integrated.fontLigatures :

Fonts that support ligatures like ->, ==>, and so on will now visually look like single characters

In order to use this feature, make sure you also use a font that supports ligatures terminal.integrated.fontFamily .

New variables for customizing terminal tabs

What text appears in terminal tabs is determines by the terminal.integrated.tabs.title and terminal.integrated.tabs.description settings which allow the use of a collection of variables. We now support the following new variables:

  • ${shellType} - The detected type of shell that is being used in the terminal. This is similar the default value, but it will not change to git for example when running a git command.

  • ${shellCommand} - The command that is being run in the terminal. This requires shell integration.

    alt text

  • ${shellPromptInput} - The command that is being run in the terminal or the current detected prompt input. This requires shell integration.

    Typing "echo hello" in the terminal will show "echo hello|" in the tab when configured

Run recent command now shows the history source file

The run recent command shell integration feature now includes full size headers for the source of the command, including the history file where relevant and a convenient button to open it.

alt text

The default keybinding for this command is Ctrl+Alt+R.

New supported link format

Links with the format /path/to/file.ext, <line> should now be detected as links in the terminal.

Testing

Attributable coverage

This milestone, we finalized an API that enables extensions to provide coverage on a per-test basis, so you can see exactly what code any given test executed. When attributable coverage is available, a filter button is available in the Test Coverage view, in editor actions, in the Test Coverage toolbar when toggled on (via the Test: Test Coverage Toolbar command), or simply by using the Test: Filter Coverage by Test command.

Theme: Codesong (preview on vscode.dev)

Reworked inline failure messages

We reworked test failure messages to be both more eye-catching and less obtrusive. This is particularly useful for busy scenarios, such as in diffs from SCM or Copilot Edits. Selecting the failure message still opens a peek control to show the complete details of the failure.

Image of new test error messages in the editor.

Improvements to the continuous run UI

Previously, the global state of continuous test runs, togglable via the "eye" icon in the Test Explorer view, would toggle on or off continuous running with the default set of run profiles.

We reworked the continuous run UI to include a drop-down menu to turn continuous run on or off individually per-profile. Selecting the indicator toggles the last used set of run profiles on or off.

Languages

TypeScript 5.7

Our JavaScript and TypeScript support now uses TypeScript 5.7. This major update includes a number of language and tooling improvements, along with important bug fixes and performance optimizations.

You can read all about the TypeScript 5.7 release on the TypeScript blog. We've also included a few tooling highlights in the following sections.

Paste with imports for JavaScript and TypeScript

Tired of having to add imports after moving code between files? Try the Paste with imports feature for TypeScript 5.7+. Now whenever you copy and paste code between JavaScript or TypeScript, VS Code can add imports for the pasted code.

Notice how not only imports are added, even a new export was added for a local variable that was used in the pasted code!

While we think this feature is a huge time saver, we also are sensitive to disrupting your existing workflow. That's why, by default, we've kept it so copy and paste always inserts just the pasted text. If a paste with imports edit is available, you then see the paste control, which lets you select the paste with imports edit.

Paste control that shows options to insert plain text or paste with imports.

If you prefer always pasting with imports, you can use the new editor.pasteAs.preferences setting:

{
  "key": "ctrl+shift+v",
  "command": "editor.action.pasteAs",
  "args": {
    "preferences": ["text.updateImports"]
  }
}

If you prefer, you can even do the reverse and make paste with imports the default and add a keybinding to paste as plain text:

{
  "key": "ctrl+shift+v",
  "command": "editor.action.pasteAs",
  "args": {
    "preferences": ["text.plain"]
  }
}

Finally, if you want to fully disable paste with imports, you can use typescript.updateImportsOnPaste.enabled and javascript.updateImportsOnPaste.enabled .

Remote Development

The Remote Development extensions, allow you to use a Dev Container, remote machine via SSH or Remote Tunnels, or the Windows Subsystem for Linux (WSL) as a full-featured development environment.

Highlights include:

  • remote-ssh Copilot chat participant
  • Enhanced session logging

You can learn more about these features in the Remote Development release notes.

Enterprise support

Configure allowed extensions

You can now control which extensions can be installed in VS Code using the extensions.allowed setting. This setting allows you to specify allowed or blocked extensions by publisher, specific extensions and versions. If an extension or version is blocked, it will be disabled if already installed. You can specify the following types of extension selectors:

  • Allow or block all extensions from a publisher
  • Allow or block specific extensions
  • Allow specific extension versions
  • Allow specific extension versions and platforms
  • Allow only stable versions of an extension
  • Allow only stable extension versions from a publisher

The following JSON snippet shows examples of the different setting values:

"editor.pasteAs.preferences": [
    "chat.attach.text"
]

Attaching code as context in Copilot Chat using the paste control.

Terminal completions for more shells

We added experimental support for terminal completions in pwsh in prior iterations. This release, we have started working on expanding this to other shells. Specifically targeting bash and zsh for now, but since this new approach is powered by an extension host API, we plan on having general support for most shells.

You can try out the current work in progress by setting terminal.integrated.suggest.enabled and terminal.integrated.suggest.enableExtensionCompletions . Currently only cd, code, and code-insiders arguments are supported.

The command  is typed on the terminal, which shows suggestions. Then  is typed and options are provided,  is selected. Completions are requested with ctrl+space and all locales are shown.  is typed and the list is filtered to  and .

Proposed APIs

Proposed Value Selection API on Quick Pick

For InputBox you have been able to set the "value selection", which enables you to programmatically select part or all of the input. This milestone, we added a proposed API for value selection in a QuickPick.

Here's an example of what that might look like:

adoption of MSAL, so that we could pass the native handle down to the OS so it could render an auth dialog overtop VS Code.

If you have a use case or feedback for the nativeWindowHandle proposal, let us know what you think in this GitHub issue!

Engineering

Optimized extension updates with vscode-unpkg service

To reduce the load on the Marketplace infrastructure, VS Code now uses the newly added endpoint from the vscode-unpkg service to check for extension updates. The service implements server-side caching with a 10-minute TTL, which significantly reduces the number direct requests to the Marketplace. The optimization is controlled via the extensions.gallery.useUnpkgResourceApi setting (enabled by default).

If you notice issues with extension updates, you can disable this functionality with extensions.gallery.useUnpkgResourceApi , and revert back to direct Marketplace version checks.

Ground work for GPU acceleration in the editor

We are excited to announce that we have started work on enabling GPU acceleration in the editor, similar to the terminal. The goals of this effort are to improve the overall coding experience primarily by reducing input latency and improving scrolling performance.

This is still early and not ready to test out, but we wanted to share some details about the progress that has been made:

  • The GPU renderer is using WebGPU behind the scenes.
  • We're focusing currently on feature parity and correctness over performance.
  • There's a fallback mechanism when GPU acceleration is enabled that allows lines to "fallback" to DOM rendering when it's not fully supported. This means that we can self-host early on and currently incompatible lines will show using the DOM approach instead. Some examples of lines that currently fallback: lines over 200 characters, lines with certain Monaco decorations (e.g. fading unused variables), lines that wrap, and so on.
  • Monaco's inline decorations which allow styling the actual elements containing the characters posed a big challenge for this feature as they are styled using CSS. The approach we're using to support most inline decorations without breaking or changing API is to detect the CSS attached to these decorations and then support a subset of common CSS properties, falling back if not all styles are supported.

Here's a screenshot of the feature in action. Note the yellow line in the gutter tells us what lines are using fallback rendering. This particular case uses fallback rendering due to the dontShow parameter having an inline decoration as it's unused:

GPU rendering looks mostly the same as DOM rendering currently, a yellow line appears for lines rendered via the DOM

The issue tracking this work is #221145 which has frequent updates and more details on progress as it's made.

EOL warning for macOS 10.15

VS Code desktop will be updating to Electron 33 in the next couple of milestones. With the Electron 33 update, VS Code desktop will no longer run on macOS Catalina. In this milestone, we have added deprecation notices for the users on this affected platform to prepare them for migration. If you are a user of the aforementioned OS version, please take a look at our FAQ for additional information.

Notable fixes

  • 233915 Share an extension with others by using the Copy Link action in the context menu of an extension in the Extensions view.
  • 231542 Frequently unable to save file or file data gets erased with error EBUSY
  • 233304 onDidChangeCheckboxState broken in 1.95
  • 232263 Optimize tree view such that cross process calls are batched
  • 156723 Drag and drop support fixed when running with wayland

Thank you

Last but certainly not least, a big Thank You to the contributors of VS Code.

Issue tracking

Contributions to our issue tracking:

Pull requests

Contributions to vscode:

Contributions to vscode-emmet-helper:

Contributions to vscode-eslint:

Contributions to vscode-extension-samples:

Contributions to vscode-extension-telemetry:

Contributions to vscode-hexeditor:

Contributions to vscode-json-languageservice:

Contributions to vscode-jupyter:

Contributions to vscode-mypy:

Contributions to vscode-python-debugger:

Contributions to vscode-python-tools-extension-template:

Contributions to vscode-test-web:

Contributions to inno-updater:

Contributions to language-server-protocol:

Read the original on code.visualstudio.com ↗