Jump to content

Visual Studio Code: Difference between revisions

Reorder and cleanup
imported>Edrex
(Add instructions for installing insiders build)
imported>SuperSamus
(Reorder and cleanup)
Line 1: Line 1:
{{note|Visual Studio Code is [[FAQ/unfree|unfree]], its license prohibits distribution. See the [[FAQ/unfree]] page to install unfree software.}}
{{note|Visual Studio Code is [[FAQ/unfree|unfree]], its license prohibits distribution. See the [[FAQ/unfree]] page to install unfree software.}}


For the free distribution of the vscode codebase (without MS branding/telemetry) see [[VSCodium]].
Visual Studio Code is a cross-platform text editor developed by Microsoft, built on the Electron framework.


== Installing Microsoft's Visual Studio Code ==
For the free distribution of the VS Code codebase (without MS branding/telemetry) see [[VSCodium]].


=== With Home Manager ===
== Installation ==


If you are using [[Home Manager]], you will want to modify your <code>home.nix</code> (or a file inherited by it). Example:
=== NixOS ===


{{file|~/home.nix|nix|<nowiki>
<syntaxHighlight lang=nix>
{ config, pkgs, ... }:
environment.systemPackages = with pkgs; [ vscode ];
{
</syntaxHighlight>
  programs.home-manager.enable = true;
  ...    # More of your home-manager config


  programs = {
Extensions can be managed using the 'vscode-with-extensions' package:
    ...    # Start of your programs config


    vscode = {
<syntaxHighlight lang=nix>
      enable = true;
environment.systemPackages = with pkgs; [
      package = pkgs.vscodium;    # You can skip this if you want to use the unfree version
  vscode-with-extensions.override {
      extensions = with pkgs.vscode-extensions; [
    vscodeExtensions = with vscode-extensions; [
        # Some example extensions...
      bbenoist.nix
        dracula-theme.theme-dracula
      ms-python.python
        vscodevim.vim
      ms-azuretools.vscode-docker
         yzhang.markdown-all-in-one
      ms-vscode-remote.remote-ssh
       ];
    ] ++ pkgs.vscode-utils.extensionsFromVscodeMarketplace [
    }
      {
         name = "remote-ssh-edit";
        publisher = "ms-vscode-remote";
        version = "0.47.2";
        sha256 = "1hp6gjh4xp2m1xlm1jsdzxw9d8frkiidhph6nvl24d0h8z34w49g";
       }
    ];
  }
];
</syntaxHighlight>
 
Some examples here: [https://github.com/search?q=extensionFromVscodeMarketplace&type=code GitHub search for "extensionFromVscodeMarketplace"]


    ...    # Rest of your programs config
It's also possible to install VS Code via [[Home Manager]]:
  }


   ...   # Rest of your home-manager config
<syntaxhighlight lang="nix">
}
programs.vscode = {
</nowiki>}}
  enable = true;
   extensions = with pkgs.vscode-extensions; [
    dracula-theme.theme-dracula
    vscodevim.vim
    yzhang.markdown-all-in-one
  ];
};
</syntaxhighlight>


* See for more options: [https://nix-community.github.io/home-manager/options.html#opt-programs.vscode.enable Home Manager Manual: Options - programs.vscode]
* See for more options: [https://nix-community.github.io/home-manager/options.html#opt-programs.vscode.enable Home Manager Manual: Options - programs.vscode]
* Search for extensions with configurations: [https://search.nixos.org/packages?channel=unstable&from=0&size=30&sort=relevance&type=packages&query=vscode-extensions NixOS Search: vscode-extensions]
* Search for extensions with configurations: [https://search.nixos.org/packages?type=packages&query=vscode-extensions NixOS Search: vscode-extensions]


=== Insiders Build ===
=== Non-NixOS ===
 
<syntaxHighlight lang="console">
$ nix-env -iA nixos.vscode
</syntaxHighlight>
 
=== Use VS Code extensions without additional configuration ===  


If you need to test a recent code change, you can run the insiders build. It is designed to run alongside the main build, with a separate <code>code-insiders</code> command and a different config path, so you can leave your main VSCode instance installed/running.
With the package vscode-fhs, the editor launches inside a [https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard FHS] compliant chroot environment using buildFHSUserEnv. This reintroduces directories such as /bin, /lib, and /usr, which allows for extensions which ship pre-compiled binaries to work with little to no additional nixification.


The following derivation [https://discourse.nixos.org/t/how-to-install-latest-vscode-insiders/7895/4 thanks to @jnoortheen], which you can add to <code>home.packages</code> (HM), <code>environment.systemPackages</code> (NixOS), etc, builds a package with the latest insiders.
{{note|From a philosophical view, use of buildFHSUserEnv allows for ease-of-use at the cost of some impurity and non-reproducibility. If you prioritize purely-declarative configurations, please stay with the above guidance.}}


Example usage:
<syntaxHighlight lang=nix>
<syntaxHighlight lang=nix>
    (pkgs.vscode.override{ isInsiders = true; }).overrideAttrs (oldAttrs: rec {
environment.systemPackages = with pkgs; [ vscode-fhs ];
      src = (builtins.fetchTarball {
        url = "https://update.code.visualstudio.com/latest/linux-x64/insider";
        sha256 = "1dajhfsdr55mfnj12clf5apy1d4swr71d3rfwlq2hvvmpxvxsa59";
      });
      version = "latest";
    });
</syntaxHighlight>
</syntaxHighlight>


You will need to update the <code>sha256</code> value for each new insiders build. The new value will appear in a validation error when you try to build.
Home-manager:
<syntaxHighlight lang=nix>
programs.vscode = {
  enable = true;
  package = pkgs.vscode-fhs;
};
</syntaxHighlight>


=== With nix-env ===
Adding extension-specific dependencies, these will be added to the FHS environment:
<syntaxHighlight lang=nix>
# needed for rust lang server extension
programs.vscode.package = pkgs.vscode-fhsWithPackages (ps: with ps; [ rustup zlib ]);
</syntaxHighlight>


Because it is NixOS, you don't have to be root in order to be able to install stuff. As a normal user, do:
=== Insiders Build ===


<syntaxHighlight lang=console>
If you need to test a recent code change, you can run the insiders build. It is designed to run alongside the main build, with a separate <code>code-insiders</code> command and a different config path, so you can leave your main VS Code instance installed/running.
$ nix-env -iA nixos.vscode
</syntaxHighlight>


And to open or launch the IDE, do:
The following derivation [https://discourse.nixos.org/t/how-to-install-latest-vscode-insiders/7895/4 thanks to @jnoortheen], which you can add to <code>home.packages</code> (HM), <code>environment.systemPackages</code> (NixOS), etc., builds a package with the latest insiders.


<syntaxHighlight lang=console>
<syntaxHighlight lang=nix>
$ code
(pkgs.vscode.override { isInsiders = true; }).overrideAttrs (oldAttrs: rec {
  src = (builtins.fetchTarball {
    url = "https://update.code.visualstudio.com/latest/linux-x64/insider";
    sha256 = "1dajhfsdr55mfnj12clf5apy1d4swr71d3rfwlq2hvvmpxvxsa59";
  });
  version = "latest";
});
</syntaxHighlight>
</syntaxHighlight>
You will need to update the <code>sha256</code> value for each new Insiders build. The new value will appear in a validation error when you try to build.


== Wayland ==
== Wayland ==


If you are running Wayland, you may see a blank screen when starting vscode.
To use VS Code under Wayland, set the environment variable <code>NIXOS_OZONE_WL=1</code>:
 
To fix this, set the environment variable <code>NIXOS_OZONE_WL=1</code>:


* temporary fix: run via the terminal:  
* temporary fix: run via the terminal:  
Line 84: Line 113:
[https://github.com/NixOS/nixpkgs/commit/b2eb5f62a7fd94ab58acafec9f64e54f97c508a6 Source]
[https://github.com/NixOS/nixpkgs/commit/b2eb5f62a7fd94ab58acafec9f64e54f97c508a6 Source]


== Managing extensions ==
== Updating extension versions ==
 
Extensions can be managed using the 'vscode-with-extensions' package:
 
<syntaxHighlight lang=nix>
{ pkgs, ... }:
 
let
  extensions = (with pkgs.vscode-extensions; [
      bbenoist.nix
      ms-python.python
      ms-azuretools.vscode-docker
      ms-vscode-remote.remote-ssh
    ]) ++ pkgs.vscode-utils.extensionsFromVscodeMarketplace [{
      name = "remote-ssh-edit";
      publisher = "ms-vscode-remote";
      version = "0.47.2";
      sha256 = "1hp6gjh4xp2m1xlm1jsdzxw9d8frkiidhph6nvl24d0h8z34w49g";
  }];
  vscode-with-extensions = pkgs.vscode-with-extensions.override {
      vscodeExtensions = extensions;
    };
in {
  config = {
    environment.systemPackages = [
      vscode-with-extensions
    ];
  };
}
</syntaxHighlight>
 
Some useful examples here: [https://github.com/search?q=extensionFromVscodeMarketplace&type=code GitHub search for "extensionFromVscodeMarketplace"]
 
=== Updating extension versions ===


Nixpkgs contains a script which will run <code>code --list-extensions</code>, then look for the latest available versions of those extensions, and output a list which you can add to your Nix config in a format similar to the above. To use it, clone the [https://github.com/NixOS/nixpkgs nixpkgs repo from github], and run: [https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vscode/extensions/update_installed_exts.sh nixpkgs/pkgs/applications/editors/vscode/extensions/update_installed_exts.sh]
Nixpkgs contains a script which will run <code>code --list-extensions</code>, then look for the latest available versions of those extensions, and output a list which you can add to your Nix config in a format similar to the above. To use it, clone the [https://github.com/NixOS/nixpkgs nixpkgs repo from GitHub], and run: [https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vscode/extensions/update_installed_exts.sh nixpkgs/pkgs/applications/editors/vscode/extensions/update_installed_exts.sh]


Example output:
Example output:
Line 139: Line 135:
     sha256 = "01lc9gpqdjy6himn7jsfjrfz8xrk728c20903lxkxy5fliv232gz";
     sha256 = "01lc9gpqdjy6himn7jsfjrfz8xrk728c20903lxkxy5fliv232gz";
   }
   }
... # the output for the rest of your extensions
];
];
}%
}
</syntaxHighlight>
</syntaxHighlight>


== Remote SSH ==
== Remote SSH ==


The remote-ssh extension works by connecting to a remote host and downloading scripts and pre-built binaries to {{ic|$HOME/.vscode-server}}. When first launching remote-ssh for a NixOS host the connection will fail due to the provided node.js not having been built for a NixOS system (the dynamic libraries aren't in the same place).
The remote-ssh extension works by connecting to a remote host and downloading scripts and pre-built binaries to {{ic|$HOME/.vscode-server}}. When first launching remote-ssh for a NixOS host, the connection will fail due to the provided node.js not having been built for a NixOS system (the dynamic libraries aren't in the same place).


=== Any client to NixOS host ===
=== Any client to NixOS host ===
Line 174: Line 169:
</syntaxHighlight>
</syntaxHighlight>


If instead you'd prefer to fix the binaries manually and have to do so every time that you upgrade your VSCode version, then you can install the <code>nodejs-16_x</code> package on the NixOS host and replace the VSCode provided version. This workaround is described here: https://github.com/microsoft/vscode-remote-release/issues/648#issuecomment-503148523. Note that nodejs needs to be updated according to VSCode upstream requirements (nodejs 16 required from 4/2022).
If instead you'd prefer to fix the binaries manually and have to do so every time that you upgrade your VS Code version, then you can install the <code>nodejs-16_x</code> package on the NixOS host and replace the VS Code provided version. This workaround is described here: https://github.com/microsoft/vscode-remote-release/issues/648#issuecomment-503148523. Note that NodeJS needs to be updated according to VS Code upstream requirements (NodeJS 16 required from 4/2022).


=== Nix-sourced VSCode to NixOS host ===
=== Nix-sourced VS Code to NixOS host ===


If vscode-remote is installed from nix (vscode-extensions.ms-vscode-remote as above) on the client machine, everything should "just work".
If vscode-remote is installed from nix (vscode-extensions.ms-vscode-remote as above) on the client machine, everything should "just work".


== Using nix-shell ==
== Using nix-shell ==
Some features of VSCode, like the Python package, require linters or other dependencies. The package [https://marketplace.visualstudio.com/items?itemName=arrterian.nix-env-selector nix-env-selector] makes this easy and does not require overrides on vscode itself to add dependencies.
Some features of VS Code, like the Python package, require linters or other dependencies. The package [https://marketplace.visualstudio.com/items?itemName=arrterian.nix-env-selector nix-env-selector] makes this easy and does not require overrides on VS Code itself to add dependencies.
 
== Use VSCode extensions without additional configuration ==
 
{{note| Only available in nixpkgs-unstable or 21.05 and after }}
 
In [https://github.com/NixOS/nixpkgs/pull/99968 #99968], vscode-fhs and vscodium-fhs packages were added in which the editors launch inside of a [https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard FHS] compliant chroot environment using buildFHSUserEnv. This reintroduces directories such as /bin, /lib/, and /usr, which allows for extensions which ship pre-compiled binaries to work with little to no additional nixification.
 
{{note| From a philosophical view, use of buildFHSUserEnv allows for ease-of-use at the cost of some impurity and non-reproducibility. If you prioritize purely-declarative configurations, please stay with the above guidance.}}
 
Example usage:
<syntaxHighlight lang=console>
$ nix-shell -p vscode-fhs --run code
</syntaxHighlight>
 
Home-manager:
<syntaxHighlight lang=nix>
  programs.vscode.enable = true;
  programs.vscode.package = pkgs.vscode-fhs;
</syntaxHighlight>
 
Adding extension-specific dependencies, these will be added to the FHS environment:
<syntaxHighlight lang=nix>
  # needed for rust lang server extension
  programs.vscode.package = pkgs.vscode-fhsWithPackages (ps: with ps; [ rustup zlib ]);
</syntaxHighlight>
 


== Troubleshooting ==
== Troubleshooting ==
Line 219: Line 188:
</pre>
</pre>


Try to add the following setting in you system configuration (even if you don't use Gnome as desktop environment):
Try to add the following setting in your system configuration (even if you don't use Gnome as desktop environment):


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
  # needed for store VSCode auth token  
# needed for store VS Code auth token  
  services.gnome.gnome-keyring.enable = true;
services.gnome.gnome-keyring.enable = true;
</nowiki>}}
</nowiki>}}


''Optional:'' add <code>gnome.seahorse</code> to <code>environment.systemPackages</code> to install GUI for GNOME Keyring.
''Optional'': add <code>gnome.seahorse</code> to <code>environment.systemPackages</code> to install GUI for GNOME Keyring.


Don't forget perform <code>nixos-rebuild switch</code> and reboot system.
Don't forget to perform <code>nixos-rebuild switch</code> and reboot the system.
Anonymous user