April 2017 (version 1.12)

Update 1.12.2: Adds the 1.12 translations and addresses a handful of issues.

Update 1.12.1: Fixes an issue with .NET debugging.

Workaround for macOS flickering when running on high DPI external monitors.

Workaround for macOS blurry icons if certain environment variables are set.

Downloads: Windows | Mac | Linux 64-bit: .tar.gz .deb .rpm | Linux 32-bit: .tar.gz .deb .rpm

Welcome to the April 2017 release of Visual Studio Code. For this iteration, we shifted from our usual focus on new features to improving our processes and code base. We reviewed and triaged all our open issues, fixed bugs, and reduced engineering debt. We still think you'll find plenty to be excited about in this release.

During this milestone, we closed 2199 issues across all VS Code repositories. However, while we were busy closing issues, you were busy opening them. 1925 new issues, to be exact, and we decreased our total issue count by 274. By comparison, in March we closed 1719 issues while we gained 2221 issues, and our total issue count grew by 369. Overall, April looks pretty good.

And in case you are wondering, out of the 3775 issues that we currently track in github.com/microsoft/vscode, 2368 are feature requests. We won't run out of work anytime soon :-).

Having this out of the way, we promised the release notes would not be empty:

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

The release notes are arranged in the following sections related to VS Code focus areas. Here are some further updates:

  • Workbench - macOS native Tabs and swipe gestures, terminal link line and column support.
  • Languages - TypeScript 2.3, apply Markdown snippets on selections.
  • Debugging - Context menu to edit watch expressions, better column breakpoints.
  • Extension Authoring - Progress UI for long running operations, new completion item types.

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 theming

The workbench theming work started in the March release has been continued at full steam. Most gaps are now closed and we are happy to declare the currently available state as 'ready to use' for theme authors.

Theming support for list & trees (in particular the File Explorer and suggestions widget), diff editor, activity bar, notifications, scrollbar, splitview, buttons and more.

activity bar theming

All built-in themes have been updated to take advantage of the new colors. You can find the full list of all colors in the Theme Color Reference.

kimbie dark


tomorrow blue

The new user settings workbench.colorCustomization replaces the setting workbench.experimental.colorCustomization and lets users change colors on top of the active theme. If you have already used the experimental settings, use the color id mapping table to map the ids to the new format.

The Yeoman generator has been updated to create themes using the new color theme format. In addition, a new command Developer: Generate Color Theme From Current Settings is available in the Command Palette to help you turn your custom colors to a theme that you can share on the Marketplace.

We're also looking into ways to make theme creation easier in the vscode-theme-generator project on GitHub. The goal of the generator is to allow generation of good looking themes with as little effort as possible, hiding away the complexities of tweaking the individual workbench color keys and TextMate scopes.

With the vscode-theme-generator, you can create a theme that looks like this by defining only 6 colors:

Theme generator preview

Keyboard Shortcuts editor

Search in Keyboard Shortcuts editor is improved to support all possible terms for modifier keys in corresponding platforms.

  • meta, cmd, command, windows
  • ctrl, control
  • alt, option
  • shift

You can now also see the conflicts in the order of precedence.

Keyboard shortcuts editor

Source control

Since the SCM API was released, there has been good progress in source control extensions around the community. Here are some of the SCM extensions already published in the Marketplace:

We are very excited about the possibilities of this API and expect more extensions to come out in the near future!


There has been a lot of progress improving the Git extension inside VS Code. This Git integration goes through the same extension points as third-party SCM providers.

Note: Starting in June, the legacy git integration will be completely removed. Until then, you can still revert back to it using the SCM: Enable Legacy Git command.

macOS: Sierra Tabs

With the help of the Electron update, we can bring back basic support for native macOS Sierra tabs for window management. You can enable them via the window.nativeTabs setting after a restart. Once enabled, depending on your OS settings, new tabs will open when you open new windows. Make sure to show the tab bar (View > Show Tab Bar) to access tabs.

native tabs

Note: Native tabs cannot be used with a custom title. When you enable native tabs, the title bar will change to native styling too.

macOS: Mouse swipe to navigate

We added a new setting workbench.editor.swipeToNavigate that allows you to navigate between editors using 3-finger-swipe gesture with the trackpad on macOS. Swiping left or right will navigate across recently used editors in any editor group. This is similar to the Go > Back and Go > Forward commands we already had but will skip navigation from occurring within documents.

Note: The same commands that swiping triggers can also be executed via key bindings from the new commands workbench.action.openPreviousRecentlyUsedEditor and workbench.action.openNextRecentlyUsedEditor.

Note: We currently only support 3-finger-swipe gesture. Make sure that your trackpad settings for swiping are configured like the following to make this work:

  • Swipe between pages: Scroll left or right with three fingers.
  • Swipe between full-screen apps: Swipe left or right with four fingers.

Links to files with line and column ranges are now supported.

Terminal line column links


TypeScript 2.3

VS Code now ships with TypeScript 2.3.2. This update brings some new language features and fixes a number of important bugs.

Type checking for JavaScript files

TypeScript 2.3 also brings type checking to plain JavaScript files. This is a great way to catch common programming mistakes and these type checks also enable some exciting quick fixes for JavaScript.

Using type checking and quick fixes in a JavaScript file

TypeScript can infer types in .js files same as in .ts files. When types cannot be inferred, they can be specified using JSDoc comments. You can read more about how TypeScript uses JSDoc for JavaScript type checking here.

Type checking of JavaScript is optional and opt-in. Existing JavaScript validation tools such as ESLint can be used alongside the new built-in type checking functionality.

You can get started with type checking a few different ways depending on your needs.

Per file

The easiest way to enable type checking in a JavaScript file is by adding // @ts-check to the top of a file.

// @ts-check
let easy = 'abc';
easy = 123; // Error: Type '123' is not assignable to type 'string'

Using // @ts-check is a good approach if you just want to try type checking in a few files but not yet enable it for an entire codebase.

Using a Setting

To enable type checking for all JavaScript files without changing any code, just add "js/ts.implicitProjectConfig.checkJs": true to your workspace or user settings. This enables type checking for any JavaScript file that is not part of a jsconfig.json or tsconfig.json project.

You can opt individual files out of type checking with a // @ts-nocheck comment at the top of the file:

// @ts-nocheck
let easy = 'abc';
easy = 123; // No error

You can also disable individual errors in a JavaScript file using a // @ts-ignore comment on the line before the error:

let easy = 'abc';
// @ts-ignore
easy = 123; // No error

Using a JSConfig or TSConfig

To enable type checking for JavaScript files that are part of a jsconfig.json or tsconfig.json, simply add "checkJs": true to the project's compiler options:


  "compilerOptions": {
    "checkJs": true
  "exclude": ["node_modules"]


  "compilerOptions": {
    "allowJs": true,
    "checkJs": true
  "exclude": ["node_modules"]

This enables type checking for all JavaScript files in the project. You can use // @ts-nocheck to disable type checking per file.

JavaScript type checking requires TypeScript 2.3. If you are unsure what version of TypeScript is currently active in your workspace, simply run the TypeScript: Select TypeScript Version command to check.

Change TypeScript versions without reloading VS Code

Changing the active version of TypeScript no longer requires VS Code to be reloaded.

Markdown Preview and Zoom

With the update of the Electron shell, we fixed the issue with clipping of Markdown previews and the in-product release notes when using Zoom.

Surround snippets for Markdown

You can now more quickly bold or italicize text in a Markdown document using snippets. Simply select some text and run the insert snippet command. The bold, italic, and quote snippets for Markdown have all been updated to operate on selected text.

You can also setup a key binding to use these snippets:

  "key": "cmd+k 8",
  "command": "editor.action.insertSnippet",
  "when": "resourceLangId == 'markdown'",
  "args": {
    "name": "Insert bold text"


Dynamic IntelliSense sorting

The editor now re-sorts the completions list while you type. That ensures that the completions you need are always on top and easy to select.

Dynamic Sort


Grunt task auto-detection

Grunt auto-detection has been implemented for the new terminal task runner. With the new terminal runner, tasks are now detected for both Grunt and Gulp if both corresponding files (Gruntfile.js, gulpfile.js) are present in a workspace.

In addition, the proposed task API has been polished. If you had already started to use it, you might encounter some minor breaking changes.


Editing Watch expressions

It is now possible to edit Watch expressions using the context menu.

edit watch

Node Debugging

Just My Code improvements

Skipping files when stepping has been available for the inspector protocol of the Node.js debugger for three releases. With this release, it is now available for the legacy protocol as well. To control a file for skipping, use the context menu command Toggle skipping this file on a stack frame in the CALL STACK view.

toggle skip files

Column breakpoints improvements

Setting breakpoints on a particular column is now supported by the Debugger for Chrome extension, and by the inspector protocol of the Node.js debugger, when debugging (yet to be released) Node 8. A column breakpoint can be set using ⇧F9 (Windows, Linux Shift+F9) or via the context menu during a debug session.

column BPs

Extension Authoring

New APIs

We have added some new APIs:

  • More completion and symbol item kinds: Event, Operator, and TypeParameter.
  • You can now open a text document as a preview editor. This means its tab will be reused when opening another document. This can be done like so: vscode.window.showTextDocument(doc, { preview: true}).
  • We have added functions to show progress for a long running operation. For now, we have defined two locations for progress in the UI: the Source Control view and a window-global progress indication in the Status Bar.

Take a look at the following sample:

    location: vscode.ProgressLocation.Window,
    title: 'My long running operation'
  async progress => {
    // Progress is shown while this function runs.
    // It can also return a promise which is then awaited
    progress.report({ message: 'Doing this' });
    await step1();

    progress.report({ message: 'Doing that' });
    await step2();

Node.js update (6.x to 7.x)

With the update of Electron to 1.6.6, the Node.js version that is used to run all extensions updated from 6.4.0 to 7.4.0. There are some breaking changes coming with this major update of Node.js, though in general the impact should be minor. Please refer to this overview for a complete list of breaking changes from Node.js 6 to 7.

One consequence of the Electron update is that promise rejections are now treated as uncaught exceptions by the Node.js runtime even if the reject is caught later. Since this behavior is annoying when debugging an extension, we've introduced a new exception option to control promise rejections independent from regular exceptions:

new promise rejection option

Debugger extensions

evaluateName attribute will become mandatory for Add to Watch and Copy Value actions

VS Code tries to implement the Add to Watch and Copy Value actions by using the data from the VARIABLES view and a JavaScript-biased heuristic for building expressions that can be used with the evaluate request.

Since this approach does not work for all languages, we've introduced the evaluateName attribute for variables some time ago. If the evaluateName attribute is available for a variable VS Code will use it 'as is' for the evaluate request. If evaluateName is missing, VS Code falls back to the old approach.

Since we plan to remove the fallback completely in the May release, debug adapters must support the evaluateName attribute if they want to have the Add to Watch and Copy Value actions available in the future.

New argument terminateDebuggee for disconnect request

An optional argument, terminateDebuggee, has been added to the disconnect request. If a debug adapter has opted into this feature with the supportTerminateDebuggee capability, a client can use this to control whether the debuggee should be terminated when the debugger is disconnected.


Electron update

In this release, we updated from Electron 1.4.x to 1.6.6. This brings a Chrome update from version 53 to 56 and Node.js from 6.4 to 7.4. Among other things, this update enabled us to bring back native macOS Sierra tabs for window management (behind a setting window.nativeTabs) as well as better crash reporting for the processes we spawn. This update also avoids some graphic glitches we have seen on macOS (background artifacts) as well as improved scaling of all UI elements when running with scaling enabled on Windows.

Unfortunately, we are also seeing some regressions with this update and we ask for your patience until we can move forward to a newer Electron version that fix these issues.


  • 24981: Backspace can not erase the last character during Chinese/Japanese IME conversion (macOS)
  • 24633: Unconfirmed text of CJK IME collapse to one character in Integrated Terminal
  • 24643: Webview Flickering on Resize
  • 24707: 1.6.2 update (<1.5) Completely breaks Dragon menu/submenu voice control (updated)
  • 25700: Windows: dropdown selector empty after reload of window

Note: If you are an extension author, please review the impact of this Electron update under the Extension Authoring section.

China downloads

We've improved the install and update experience for Chinese users, who have always reported slow download speeds when fetching releases of VS Code. We now publish and distribute our releases to network servers located within China so you should start getting much faster speeds in that territory. Some of our test scenarios witnessed a speedup of 300x ⚡️!

These improvements are available when downloading VS Code directly from our website as well as when receiving automatic updates.

New Commands

Key Command Command id
Open Previous Recently Used Editor workbench.action.openPreviousRecentlyUsedEditor
Open Next Recently Used Editor workbench.action.openNextRecentlyUsedEditor
Open Keyboard Shortcuts File workbench.action.openGlobalKeybindingsFile

Notable Changes

  • 5745: Webview: apply window.zoomLevel too
  • 12473: macOS Sierra: background artifacts
  • 24482: New Uncaught Exception when starting an extension debugging session
  • 24979: Compound debug configurations not shown after first breakpoint is hit
  • 13306: stepping over breakpoint appears to resume execution fully, vs stepping
  • 24126: Quickly blinking cursor in terminal if you open and quit external app
  • 24302: Use ctrl key as the modifier to enable copy when drag and drop on Linux
  • 18351: Support navigation of problems by keyboard similar to search results.

These are the closed bugs and these are the closed feature requests for the 1.12 update.

Contributions to Extensions

Our team maintains or contributes to a number of VS Code extensions. Most notably:

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 vscode-css-languageservice

Thank you to our localization contributors

We opened community localization this release and there was a lot of excitement from international users. We now have more than 100 members in the Transifex VS Code project team. We appreciate your contributions, either by providing new translations, voting on translations, or suggesting process improvements.

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

  • French: Vincent Biret.
  • Italian: Piero Azi, Alessandro Burato, Giuliano Latini, Gianluca Bertelli.
  • German: Sascha Corti, Jens Suessmeyer, Christian Gräfe, Markus Weber.
  • Spanish: German Sak, Santiago Porras Rodríguez, José M. Aguilar, Alberto Poblacion.
  • Russian: Aleksey Nemiro, Kirill Moskvichev, Anton Afonin, Артем Мельниченко, Serge Rodionov, Andrei Pryymak.
  • Japanese: Yuichi Nukiyama, EbXpJ6bp.
  • Chinese (Simplified): Joel Yang, Ying Feng, YF.
  • Chinese (Traditional): Alan Tsai.

Although the languages below are not yet in VS Code, work is going on there as well. In the May iteration, we will review whether these languages meet the criteria for language integration into VS Code.

  • Portuguese (Brazil): Bruno Sonnino, Felipe Caputo, Rodrigo Crespi, Roberto Fonseca, Marcelo Fernandes, Roberto Nunes, Rodrigo Romano, Luan Moreno Medeiros Maciel, Ilton Sequeira, Douglas Eccker.
  • Dutch: Jeroen Hermans, Gerjan.
  • Polish: KarbonKitty, Lukasz Korowicki, Paweł Sołtysiak, Jakub Drozdek.
  • Swedish: Joakim Olsson.
  • Turkish: Adem Coşkuner, Serkan Inci, Sertac Ozercan.


macOS flickering

Some users are seeing VS Code flicker when running on high DPI external monitors #25934. The workaround is to set: "editor.disableTranslate3d": true in user settings (this produces a warning, but that is fine as VS Code still accepts the setting).

macOS blurry icons

This issue appears if certain environment variables are set when VS Code launches #24820. The workaround is to either launch VS Code from the macOS Dock or clear the LC_ALL environment variable (export LC_ALL=) before launching from the terminal. The Insiders build applies this workaround and clears LC_ALL.