September 2018 (version 1.28)

Update 1.28.2: The update addresses these issues.

Update 1.28.1: The update addresses these issues.

Downloads: Windows: User System | Mac | Linux 64-bit: deb rpm tarball | 32-bit: deb rpm tarball

Welcome to the September 2018 release of Visual Studio Code. As announced in the September iteration plan, we focused on housekeeping our GitHub issues and pull requests. Across all of our VS Code repositories, we closed (either triaged or fixed) 3918 issues. While we closed issues, you created 2187 new issues. This resulted in a net reduction of 1731 issues. The main vscode repository now has 2472 open feature requests and 625 open bugs. In addition, we closed 212 pull requests.

It was great to see how much you care about our progress. Benjamin Lannon published a personal site with a live tracker of the issue numbers in our main repository. It nicely shows the progress we made since September 11:

It also shows what happens as soon as we stop paying attention to reducing issues. Below are the last three days of last week while we were getting ready for this release. As you can see, there will be more issue grooming iterations in our future.

During this housekeeping milestone, we addressed several feature requests and community pull requests also resulted in new features. Here are some of the release highlights:

If you'd like to read these release notes online, go to Updates on code.visualstudio.com.

You can also check out this 1.28 release highlights video from Cloud Developer Advocate Brian Clark.

Insiders: Want to see new features as soon as possible? You can download the nightly Insiders build and try the latest updates as soon as they are available.

Workbench

Custom title and menu bar on Windows by default

The custom title bar and themable menus described in previous release notes are now enabled by default on Windows. The setting "window.titleBarStyle" was defaulted to "custom" for the entire last month on Windows in Insiders, and we are now ready to make this the default experience.

File icons per file type

On macOS and Windows, VS Code registers as the default editor for well-known file types. VS Code now ships custom icons for the some of the common VS Code file types. These icons will show up in the OS explorer when the size of the icons is configured to be medium to large. For small icon sizes, we decided to preserve the VS Code logo as the icon.

Project level snippets

Snippets can now be scoped to a project and shared with your team. Simply use the Preferences: Configure User Snippets command or create *.code-snippets file in the .vscode folder. Project snippets work just like other snippets, they show up in IntelliSense and in the Insert Snippet action where they now have their own category.

Snippets also now support multiple prefixes. If you cannot decide if your copyright header snippet should be prefixed as header , stub , or copyright , you can have them all. Simply use a string array as the prefix property.

{ "prefix" : [ "header" , "stub" , "copyright" ], "body" : "Copyright. Foo Corp 2028" , "description" : "Adds copyright..." , "scope" : "javascript,typescript" }

For a long time, VS Code has been resolving the symbolic link to a folder when opening. This meant that even though the symbolic link was there for a reason, VS Code was ignoring it and always opened the resolved link path. We have decided to change this behavior and preserve the symbolic link.

Note: Certain features will work with reduced functionality when opening a folder as a symbolic link (for example debugging and Git integration).

Record and search keyboard shortcuts

In the Keyboard Shortcuts editor (⌘K ⌘S (Windows, Linux Ctrl+K Ctrl+S)), you can now search for keybindings just by typing keystrokes instead of typing out the key name (example 'shift'). Turn on the Recording Keys mode and type the keystrokes you want to search for.

You can also enter into the Recording Keys mode using ⌥⌘K (Windows, Linux Alt+K). Press the Esc key to exit from Recording Keys mode.

Toggle panel changes

We decided to revisit the behavior of our commands for toggling panels (Terminal, Output, Problems, Debug Console). You can follow issue 19400 for the background on the change.

The old behavior was:

Panel shows if not visible.

Panel hides if visible.

The new behavior is:

Panel shows if not visible.

Panel hides if having keyboard focus.

Panel gets focused when visible but not focused.

To get back the previous behavior, you can configure a keybinding to close the panel when the related panel is active.

For example, for Output panel:

{ "key" : "cmd+shift+u" , "command" : "workbench.action.closePanel" , "when" : "activePanel==workbench.panel.output" }

The list of panel identifiers is:

workbench.panel.terminal

workbench.panel.markers

workbench.panel.output

workbench.panel.repl

Copy Relative Path

The command to copy a file path as relative path is now more prominently exposed in the context menus of the File Explorer as well as editor tabs.

Exclude recently opened files from Quick Open

A new setting search.quickOpen.includeHistory allows you to control if files that were recently opened should be part of the Quick Open file picker. By default, files that were recently opened will appear to the top of the search and other files from the workspace below. If you would prefer to not see recently opened files on top, you can change this setting to false .

Disable trash when deleting files

If you are seeing issues when deleting files from the Explorer when they move to the OS trash, you can now set files.enableTrash to false to never use the OS trash when deleting. Doing so will change the Delete action and keybinding on the File Explorer to bypass the OS trash and delete permanently. You will still see a prompt before the delete happens.

Prompt to open workspace file if detected

When opening a folder that contains one or more .code-workspace files in the root, VS Code now shows a notification to ask if you'd like to open the workspace file instead. Opening a workspace file will usually provide a better experience than just opening the folder. You can learn more about multi-root workspaces in our documentation.

Do not restore view state when reopening a file

VS Code has always remembered the view state (cursor location, folded sections, etc.) of a file even after the file was closed. There is now a new setting workbench.editor.restoreViewState to drop this view state when a file is closed. This allows you to always start at the top of the file after reopening it.

Close a file across all editor groups

A new command Close Editor in all Groups ( workbench.action.closeEditorInAllGroups ) allows you to close the currently active file across all editor groups.

Problems panel

Show error codes

The Problems panel now shows the error code of a problem if it has any.

Improved keyboard navigation

The Problems panel has become more keyboard friendly:

You can start typing to filter when the panel has focus.

You can use ⌘F (Windows, Linux Ctrl+F ) to give focus to the filter box and ⌘↓ (Windows, Linux Ctrl+Down ) to give focus to the problem list from the filter box.

Output channel for telemetry events

In the July release, we added a feature where all telemetry events sent by VS Code also get logged to a local file when you set the log level to Trace using the Developer: Set Log Level... command. You can now view the contents of this file in the Log (Telemetry) channel of the Output panel. As before, you can view the file directly, using the Developer: Open Log File... command.

Give focus to a custom view

You can now use a command to give focus to a custom view. There is a separate command provided for each custom view.

Linux URL handling

Once a feature limited to Windows and macOS, now you can also open VS Code URLs on Linux! These URLs are useful for many different features such as automatically installing extensions, for example vscode-insiders:extension/vscodevim.vim .

Editor

Tab completion

Editor Tab completion can now complete all kind of suggestions. After setting "editor.tabCompletion": "on" , pressing Tab will complete any prefix, not just snippets. Also, pressing Tab will insert the next suggestion and ⇧Tab (Windows, Linux Shift+Tab) will insert the previous suggestion.

Navigate to last edit location

A new command Go to Last Edit Location ( workbench.action.navigateToLastEditLocation ) was added to quickly navigate to the last location in a file that was edited. The default keybinding is ⌘K ⌘Q (Windows, Linux Ctrl+K Ctrl+Q).

Save without formatters

The new command Save without Formatting ( workbench.action.files.saveWithoutFormatting ) can be used to save a file without triggering any of the save participants (for example, formatters, remove trailing whitespace, final newline). The default keybinding is ⌘K S (Windows Ctrl+K Ctrl+Shift+S, Linux Ctrl+K S). This is useful when editing files outside your normal projects, which may have different formatting conventions.

IntelliSense locality bonus

Suggestions can now be sorted based on their distance to the cursor. Set "editor.suggest.localityBonus": true and you'll see, for example, function parameters showing up at the top of the IntelliSense list.

Emmet

We have made a few improvements to the Emmet features this iteration:

If you have enabled Emmet in JavaScript files, then you can now have Emmet abbreviation expansion inside the <script> tags in an HTML file.

tags in an HTML file. The Emmet: Wrap with Abbreviation feature is no longer restricted to files with the .html extension.

feature is no longer restricted to files with the extension. The Emmet: Balance (inward) feature now works on current node even if there is no selection.

feature now works on current node even if there is no selection. The bug of wrongfully considering CSS selectors with a # in SCSS files as valid abbreviations is now fixed.

Source Control

Change SCM commit keybinding

You can now change the default keybinding to accept a commit message in the SCM view, using the scm.acceptInput command.

SCM status bar tracks active file

The SCM Status Bar contribution in the bottom left now tracks whichever repository the currently active file belongs to. This reduces confusion when editing files across your multi-folder workspace.

Git integration

Better handling of deletion conflicts

Deletion conflicts have always been detected by VS Code. Now there is a better UI flow for handling them, you will see the undeleted version when opening the change and you get to decide what happens to the file when staging it: keep it or delete it.

Configure long commit message warning threshold

The git.inputValidationLength setting now lets you configure how long a commit message must be before a warning appears as you edit it.

Add folder to workspace after 'git init'

After initializing a Git repository, VS Code will now ask you whether you'd like to add it to the current workspace.

Configure branch validation rules

You can now control how branch name validation works with the powerful git.branchValidationRegex and git.branchWhitespaceChar settings. See issue 50241 for more details.

Always rebase when running Sync

The git.rebaseWhenSync setting will let you configure the Sync command to always use rebase instead of merge when running.

Disable progress reporting

With the git.showProgress setting, you can now disable showing progress during Git operations.

Push --force

There are times in your development day-to-day in which you just feel like taking a risk. Running git push --force is a great example! VS Code now lets you forcefully push commits to a remote without the need to go into a terminal. Use the git.allowForcePush , git.useForcePushWithLease and git.confirmForcePush settings to control this behavior. See issue 53286 for more details.

Stash apply

The following git stash apply commands are now featured in the global Command Palette: Git: Apply Stash..., Git: Apply Latest Stash.

Always visible Staged Changes section

You can now always keep the Staged Changes section visible in the SCM view, even when empty, using the git.alwaysShowStagedChangesResourceGroup setting:

Terminal

Define keybindings to send custom sequences

The new command workbench.action.terminal.sendSequence has been added which lets you send custom sequences directly to the active terminal. This allows things like sending arrow keys, enter, etc. using the \u format for sending Unicode characters.

{ "key" : "ctrl+u" , "command" : "workbench.action.terminal.sendSequence" , "args" : { "text" : " \u001b [1;5D \u007f " } }

You can read more about this on the website.

Find improvements

Find in the terminal has been improved and now behaves more like find in the editor:

Support for regex, case sensitivity and match word.

The standard find next/previous keybindings (F3, shift+F3) now work.

Find results that are wrapped across lines are returned.

Languages

TypeScript 3.1

VS Code 1.28 ships with TypeScript 3.1.1. This release brings new language features such mappable tuple and array types, along with a number of tooling improvements, and bug fixes.

Rename import path

Realize that an imported file could use a better name? Now can you rename the referenced file just by renaming the import:

Convert to async function

The new Convert to async function suggestion for JavaScript and TypeScript rewrites functions that use .then Promise chaining to use async and await :

Note that this feature requires that the setting javascript.validate.enable is set to true.

New settings for JS/TS suggestions

We've cleaned up the settings names for JavaScript and TypeScript suggestions, and added a few additional settings that provide finer grained control:

All suggestion related settings are now under javascript.suggest.* and typescript.suggest.* .

and . typescript.useCodeSnippetOnMethodSuggest has be renamed to javascript.suggest.completeFunctionCalls and typescript.suggest.completeFunctionCalls .

has be renamed to and . javascript.nameSuggestions has been renamed to javascript.suggest.names .

has been renamed to . typescript.autoImportSuggestions.enabled has been renamed to javascript.suggest.autoImports and typescriptscript.suggest.autoImports .

has been renamed to and . The new javascript.suggest.enabled and typescript.suggest.enabled let you completely disable JS or TS suggestions.

Semicolon as a commit character for JS/TS

Semicolon is now a commit character for JavaScript and TypeScript suggestions. This means that you can accept that current suggestion just by typing ; . Existing commit characters also include . and ( .

You can disable commit characters by setting "editor.acceptSuggestionOnCommitCharacter": false .

HTML and CSS path completion excludes dot files

Files that start with . are now excluded from path completion results.

Better Markdown folding

Multiline lists, fenced code blocks, and raw HTML are now foldable in Markdown files:

In the Markdown preview, clicking on a link to a local file will now open that file's preview:

This makes browsing documentation easier. Use the markdown.preview.openMarkdownLinks setting to configure how links are handled. Valid settings values are:

inEditor - Open local Markdown links in an editor.

- Open local Markdown links in an editor. inPreview - Open local Markdown links in the current preview. This is new default behavior.

Extensions

Search filtering improvements

You can now use the @category filter along with other filters for installed extensions like @installed , @enabled , @disabled and @outdated to compose your extension search query. For example, you could search for installed themes, using the query @installed @category:themes or installed extensions that contribute snippets, using @installed @category:snippets .

The badge on the Activity Bar for the Extensions view that shows the count of outdated extensions will now exclude disabled extensions. The intention of this badge was to let you know that there are outdated extensions that you may want to update. Since disabled extensions aren't currently being used, including them in the count would only be a distraction.

Extension Host unresponsive

VS Code executes extensions in a separate process called the Extension Host. This process communicates with the renderer/UI process using message passing. We have added better tracking of the messages to the Extension Host and if a message is not acknowledged within 10 seconds, we will show the following notification:

What does it mean: Most likely an extension is doing CPU intensive operations that end up blocking the Extension Host process for more than 10 seconds.

What to do: One option is to wait for the completion of the operation and simply ignore the notification. Another option is to investigate which extension is causing the high CPU usage by going to the Running Extensions view and start profiling the Extension Host. You can then create an issue directly against the problematic extension. Finally, if you believe the extension has entered an infinite loop, and it does not appear that it will recover, you can restart the Extension Host.

Engineering

Extensions and webpack

We have continued our webpack effort and now most of the bundled extensions are webpack'ed. As a re-fresher: this helps to reduce the startup time for extensions because there are fewer files to load and less source code to parse. It also helps to reduce the install time because fewer files need to be extracted and written to disk.

This milestone we have trimmed the bundle by another 2803 files. In July we started with 9000 files, by August we were down to 4650, and in September we have 1847!

Preview Features

Preview features are not ready for release but are functional enough to use. We welcome your early feedback while they are under development.

Continued Electron 3.0 exploration

During this milestone, we continued to explore bundling Electron 3.0.0 into VS Code. This is a major Electron release and comes with Chrome 66 and Node.js 10.x (a major leap forward compared to our current version that has Chrome 61 and Node.js 8.x). We plan to push out the update to our Insiders users in the near future to gather additional feedback. If you are interested in helping out, make sure to install VS Code Insiders.

Miscellaneous

Blurriness on macOS Mojave

If you have updated to macOS 10.14 (Mojave), you might have noticed that fonts in VS Code look blurry if you are not using a high-DPI monitor.

A workaround for this is to run:

defaults write com.microsoft.VSCode.helper CGFontRenderingFontSmoothingDisabled -bool NO

from a terminal followed by restarting your computer.

Note that this change is global for every application and not specific to VS Code. See issue 51132 for the related discussion.

In this release, we updated from Electron 2.0.7 to 2.0.9. Most notably, this allows VS Code to run again on ArchLinux (issue 55934).

Extension Authoring

Handling URLs for uninstalled extensions

Back in July, we released the URI Handler API for extensions to handle system-wide URIs. With the latest release, VS Code can even handle URIs for extensions which are not yet installed. Once a user opens such a URI, VS Code will search for the extension in the Marketplace, propose the user to install it, and launch VS Code passing in the URI. This allows extensions to have a smooth startup flow which takes users from a webpage to running the extension with certain state.

Diagnostic error codes

Since diagnostic error codes are now surfaced in Problems panel, it is no longer necessary for extensions to add error codes to the Diagnostic.message property.

Better configuration when clauses

When authoring keybindings or menu visibility, when clauses are used. In a when clause, you can reference a configuration (setting) value by prefixing it with config. , for example config.editor.tabCompletion . Only boolean configuration properties had been supported but with this release, you can also use string and number values.

Change the language of a text document

There is a new API function to change the language mode of a document, vscode.languages.setTextDocumentLanguage . The API takes a document and the language identifier you want to use. To know what language ids are available, use vscode.languages.getLanguages .

workspaceContains activation

Extensions can use the workspaceContains activation event to be activated when a workspace is opened that contains a file matching some pattern. For example, a PHP extension might ask to be activated when a workspace with a file matching **/*.php is opened. This isn't new, but users have pointed out that the search process can run for a long time and use a lot of CPU when a large workspace is opened.

We made a couple changes to make these searches less impactful. The first is that these searches will now respect the users' files.exclude , search.exclude , and search.useIgnoreFiles settings. In other words, if the user is not able to find a file in a normal text search or file search via Quick Open, a workspaceContains pattern won't match on that file. This greatly reduces the number of files that we have to search for workspaceContains , and reduces incorrect activations when it matches a file that isn't really part of the project, for example, some file buried in node_modules/ .

The second change is to impose a 7 second limit on these searches. If the search has not completed after 7 seconds, we kill the search process and activate the extension anyway.

Overall, this should reduce cases of your laptop mysteriously heating up after opening a large workspace in VS Code.

New theme colors

There are new theme colors:

menu.separatorBackground : Color of a separator menu item in menus.

: Color of a separator menu item in menus. sideBarSectionHeader.border : Side bar section header border color.

: Side bar section header border color. inputValidation.infoForeground : Input validation foreground color for information severity.

: Input validation foreground color for information severity. inputValidation.warningForeground : Input validation foreground color for warning severity.

: Input validation foreground color for warning severity. inputValidation.errorForeground : Input validation foreground color for error severity.

: Input validation foreground color for error severity. editor.snippetTabstopHighlightBackground : Highlight background color of a snippet tabstop.

: Highlight background color of a snippet tabstop. editor.snippetTabstopHighlightBorder : Highlight border color of a snippet tabstop.

: Highlight border color of a snippet tabstop. editor.snippetFinalTabstopHighlightBackground : Highlight background color of the final tabstop of a snippet.

: Highlight background color of the final tabstop of a snippet. editor.snippetFinalTabstopHighlightBorder : Highlight border color of the final tabstop of a snippet.

: Highlight border color of the final tabstop of a snippet. activityBar.inactiveForeground : Activity bar item foreground color when it is inactive.

Debug API

resolveDebugConfiguration needs to explicitly return null to open launch.json

Previously, if resolveDebugConfiguration returned a launch configuration that did not have a type attribute, VS Code would automatically open an underlying launch.json file. After feedback from extension authors, we decided to give extensions more control over this scenario.

Now resolveDebugConfiguration has to explicitly return the value null to prevent the debug session from starting and open launch.json instead. Returning the value undefined simply prevents the debug session from starting. As before, returning a configuration with a type attribute will start a debug session.

Proposed Extension APIs

Every milestone comes with new proposed APIs and extension authors can try them out. As always we are keen on your feedback. This is what you have to do to try out a proposed API:

You must use Insiders because proposed APIs change frequently.

You must have this line in the package.json file of your extension: "enableProposedApi": true .

file of your extension: . Copy the latest version of the vscode.proposed.d.ts file into your project.

Note that you cannot publish an extension that uses a proposed API. We may likely make breaking changes in the next release and we never want to break existing extensions.

Debug API

new DebugConfigurationProvider.provideDebugAdapter replaces DebugConfigurationProvider.debugAdapterExecutable commands

Previously we added the proposed API DebugConfigurationProvider.debugAdapterExecutable so that an extension can return a dynamically calculated path (and corresponding program arguments) for the debug adapter about to be launched by VS Code. In this milestone, we are revising the initial design based on the feedback received (for example #45220, #56646, #57706, #54465).

The new API method is called provideDebugAdapter and now we pass in the debug session, the workspace folder, the executable information from the package.json , and the resolved launch config. With this information, an extension has the "full picture" when being asked to create the debug adapter.

In addition, we now support more ways for starting and connecting to the debug adapter implementation. For this, a descriptor object can be returned from the provideDebugAdapter method:

A DebugAdapterExecutable descriptor can be used to launch the debug adapter as an external process per session and communicates with it via stdin/stdout. With the new API, it is now possible to specify the working directory and environment variables for the debug adapter.

descriptor can be used to launch the debug adapter as an external process per session and communicates with it via stdin/stdout. With the new API, it is now possible to specify the working directory and environment variables for the debug adapter. A DebugAdapterServer describes a server process that handles multiple sessions and communicates via a socket.

describes a server process that handles multiple sessions and communicates via a socket. A DebugAdapterImplementation can be used for an in-place implementation that has no communication overhead. This option relies on a small modification to the Node.js based client library for DAP and is planned for October.

Please note that this is proposed API and cannot be used in extensions published on the Marketplace. However, we'd appreciate your feedback for DebugConfigurationProvider.provideDebugAdapter on issue 45220.

In the last iteration, we introduced the DocumentCommentProvider to allow extensions to create and manage comments within the editor. We have added new methods to this provider to support the editing and deletions of comments. Comments themselves now also have flags that indicate if they support edit or delete. If the extension sets one of these flag and provides an appropriate edit or delete method, actions to edit or delete the comment will be shown when hovering or focusing on a comment within the editor:

New Commands

Key Command Command id ⌘K ⌘Q (Windows, Linux Ctrl+K Ctrl+Q ) Navigate to the last location edited workbench.action.navigateToLastEditLocation ⌘K S (Windows Ctrl+K Ctrl+Shift+S , Linux Ctrl+K S ) Save file without running save participants (formatters, etc.) workbench.action.files.saveWithoutFormatting Close the active file across all editor groups workbench.action.closeEditorInAllGroups Toggle diff editor inline and side-by-side mode (deprecates toggle.diff.editorMode ) toggle.diff.renderSideBySide

New Documentation

GitHub Pull Request extension blog post

You can read Kenneth's recent blog post announcing the new GitHub Pull Request extension and discussing the collaboration between VS Code and the GitHub Editor team.

Using Azure Pipelines blog post

In Visual Studio Code using Azure Pipelines, VS Code engineer João Moreno describes how VS Code is now using Azure Pipelines for its build and continuous integration (CI) infrastructure.

New PowerShell topic

PowerShell in Visual Studio Code shows the PowerShell integration through the Microsoft PowerShell extension. The extension supports powerful language features such as IntelliSense, Go to Definition, and Find All References as well as debugging and code snippets.

New Python Django tutorial

There is a new Use Django in Visual Studio Code tutorial showing how you can quickly create, edit, and debug a Python Django web application in VS Code.

Notable Fixes

48051: After formatting you need to scroll left

31619: Must tab through deleted tab stops in snippets

58327: Debug toolbar buttons disabled

35935: "Clear Recently Opened" should also clear editor quick pick history

58799: Reveal untitled file when saving

29553: Preserve quick open input on Escape

58222: UriDisplayService is missing remote share path name

54213: Mechanism to abort the debug launch without showing launch.json

52511: Debug Hover Widget - Enable the widget resizing for long items whose overflow is hidden

50569: Conditional breakpoint prompt should offer to enable breakpoints if breakpoint is already disabled

42737: Extensions: allow to right click to bring up gear menu

58434: Use --force arg to prevent prompts while installing extensions from CLI.

Thank You

Last but certainly not least, a big Thank You! to the following folks that helped to make VS Code even better:

Contributions to vscode :

Contributions to language-server-protocol :

Contributions to vscode-languageserver-node :

Contributions to debug-adapter-protocol :

Contributions to vscode-recipes :

Contributions to vscode-chrome-debug :

Sasha (@stristr): Use nullable targetTypes property for advanced debugging. PR #727

Contributions to vscode-chrome-debug-core :

@digeff Update logging mechanism to not log sources PR #355 Fix first line bp chrome 69 PR #352 Fix break-on-load to make breakpoints on attach work PR #332



Contributions to localization :

There are almost 1200 members in the Transifex VS Code project team with about 100 active contributors every month. We appreciate your contributions, either by providing new translations, voting on translations, or suggesting process improvements.

Here is a snapshot of contributors for this release. For details about the project including the contributor name list, visit the project site at https://aka.ms/vscodeloc.