Visual Studio Code for PowerShell 7

Sydney Smith

Sydney

We are excited to announce that we have released a major update to the PowerShell extension for Visual Studio Code. This release contains months of architectural work that first shipped in our PowerShell Preview extension in November of 2019, along with incremental bug fixes in the intervening months. If you are new to Visual Studio Code this article is helpful for getting started. If you already use Visual Studio Code with the PowerShell extension, read on to find out what is new.

What’s new

ISE Compatibility Module

We took the documentation from our “How to replicate the ISE experience in Visual Studio Code” doc and turned it into a switch to make the process of using Visual Studio code more familiar for Windows PowerShell ISE users.

This work can largely be seen in: vscode-PowerShell #2335 – Add editor command PowerShell: Enable/Disable ISE Mode for ISE emulation in VS Code. (Thanks @Corbob)

Syntax Highlighting, Multi-Line Editing and Back Search in the Integrated Console

PSReadLine, the module that provides the powerful command line-editing experience you are used to in the PowerShell console (including syntax highlighting, multi-line editing and, back search), is now available in the Visual Studio Code integrated console across all operating systems. Full PSReadLine support has long been at the top of our list for feature requests. It has also been among our most difficult problems to solve because at its core it also required architectural changes in how the PowerShell extension manages threading and runspaces. The additional challenge of trying to support both legacy versions of PowerShell and a range of platform distributions has caused this problem to continually be delayed. In January of 2019 we released a Preview version of the PowerShell extension which was built on .NET Standard thereby enabling us to support PSReadLine in the integrated console for Windows users on PowerShell Version 5.1 and above.

With PowerShell 7 delivering a fix in .NET Core 3.1 for the way POSIX terminal APIs are handled when starting new processes, we are finally able to move the PSReadLine support currently available in the PowerShell Preview extension into the stable PowerShell extension with support across platform distributions.

This work can largely be seen in: PowerShellEditorServices #672 – PSReadLine integration (Thanks @SeeminglyScience!)

Performance Improvements

Our number one user request for the PowerShell editing experience in Visual Studio Code is to improve the stability of the editor and debugger. Long-standing constraints in the original design of the PowerShell extension made it difficult to improve its robustness through incremental changes. Instead, over a period of six months we prioritized work to re-architect the extension with an emphasis on stability. Omnisharp’s architecture is more robust meaning that bugs that might once have been crashes will now be caught and logged. By leveraging this library we were able to greatly simplify our code and are now more compliant with language server protocol. Ultimately, we believe that these changes will significantly reduce the number crashes of the extension and improve the performance overall. Other features of the Omnisharp port include asynchronous message handling for increase in performance, CodeLens requests no longer depending on running PowerShell (greatly improving Intellisense responsiveness), and formatting handled directly by the language server.

This work can be seen in: PowerShellEditorServices #1056 – Re-architect PowerShell Editor Services to use the Omnisharp LSP platform.

Other features

A number of other features have been available in the PowerShell Preview extension that are now available in the PowerShell extension.

For a full list of changes see our detailed changelog.

Breaking Changes

Support for PSReadLine in the PowerShell extension Integrated Console depends on changes made in PSReadLine 2.0, which does not support PowerShell versions 3 and 4. In turn, we also made the difficult decision to no longer support PowerShell 3 and 4 in future updates of the extension. In making this decision we analyzed the use of these PowerShell versions and found that approximately 1% of PowerShell session in VSCode use one of these versions. In order to accommodate these use cases we will shipped a final stable version of the extension with PowerShell version 3 and 4 support which can continue to be used (2020.01). To use this version of the extension the user will still install the PowerShell extension through the VSCode marketplace. They will then need to use the extension settings to select their desired version.

This breaking change can be seen in: PowerShellEditorServices #741 – Migrate to netstandard2.0 and PSStandard

We also made the decision to close over a number of APIs that were not designed for public exposure. For more detailed information on this decision check out PowerShellEditorServices #1183.

What’s going to happen to the Preview Extension?

Going forward we will use preview as a vNext of our stable extension, so a preview release will take bugfixes and become the next stable release. After this release we plan to continue to address other outstanding issues in the extension, and use the PowerShell Preview extension as a means of increasing our release cadence.

Feedback and Support

Once we make these releases we will continue to make investments in the PowerShell editing experience. If you encounter any issues with the PowerShell extension in Visual Studio Code or have feature requests, the best place to get support is through our GitHub repository.

Sydney Smith, Robert Holt, Tyler Leonhardt PowerShell Team

3 comments

Comments are closed.

  • Avatar
    Luc FULLENWARTH

    Hello,

    First, thank you very much to all those people working hard to make PowerShell better 🙂

    Same for those working on VSCode, which has become such a powerful and pleasant tool. As soon as I need to write scripts and modules, I automatically switch to VSCode 🙂

    Concerning the ISE compatibility module, I wish to add some constructive comments you may take into consideration for further improvement.
    This information may probably not seem relevant for developers, but it is really relevant for sysadmins.
    I am a sysadmin (there are still many out here…), and as such, I have to multitask the whole day. Also since I have discovered PowerShell I do 95% of my work in PS remote sessions. To achieve this I use a single ISE console to connect multiple servers and execute a few lines of code I write on the fly in the linked editor above.
    Unfortunately and until now, in VSCode all editor panes are linked to the same terminal (this is the blocking keypoint). If I want to execute code from different editors in different terminals, I have to open as many VSCode consoles than remote sessions.
    I am not searching for an ISE look (the VSCode dark mode is great by the way), but rather for the same functionality of ISE which allows us to execute simultaneously several pieces of code from different editor panes on several distinct remote sessions (meaning in different terminals).
    As soon as this functionality is available in VSCode, I can finally and will immediately quit ISE for a full VSCode adoption 🙂
    Until then I am still “chained” to ISE because of its multitasking capabilities which makes me so efficient and powerful…

    I wish a wonderful day to every developer working on the PowerShell / VSCode project and please keep going on with your great work 🙂

  • Avatar
    Daniel Westerdale

    I am using Visual Studio Code with the PowerShell preview extension and although it is early days, it is looking much more stable.

    1) Does the support for PowerShell 7 require some changes to the settings.json? This is what I ended up doing ( see comments) : Configuring VSCode to use PowerShell 7 and PowerShell 5.1

    2) Is there any docs to show which settings are only valid for the preview extension and what is valid for both versions of the PowerShell extension?
    e.g. I’m still using “powershell.developer.featureFlags”: [ “PSReadLine” ],