Visual Studio Code: Difference between revisions

imported>Samuela
No edit summary
Kaya (talk | contribs)
Add infobox
 
(55 intermediate revisions by 30 users not shown)
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.}}{{Infobox application
| name = Visual Studio Code
| type = Text Editor
| image = Visual_Studio_Code_1.35_icon.svg
| developer = Microsoft
| website = https://code.visualstudio.com/
| documentation = https://code.visualstudio.com/docs
| bugTracker = https://github.com/microsoft/vscode/issues
| github = https://github.com/microsoft/vscode
| programmingLanguage = TypeScript, JavaScript, HTML, CSS
| os = Linux, macOS, Windows
| initialRelease = 29 April 2015
}}
'''Visual Studio Code''' is a cross-platform text editor developed by Microsoft, built on the Electron framework.


For the free distribution of the vscode codebase (without MS branding/telemetry) see [[VSCodium]].
For the free distribution of the VS Code codebase (without MS branding, telemetry, and [https://marketplace.visualstudio.com/ extension marketplace] replaced by [https://open-vsx.org/ Open VSX]) see [[VSCodium]].


== Installing Microsoft's Visual Studio Code ==
== Installation ==


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


<syntaxHighlight lang=console>
<syntaxHighlight lang=nix>
$ nix-env -iA nixos.vscode
environment.systemPackages = with pkgs; [ vscode ];
</syntaxHighlight>
</syntaxHighlight>


And to open or launch the IDE, do:
Extensions can be managed using {{Nixpkg|pkgs/applications/editors/vscode/with-extensions.nix|vscode-with-extensions}} :
 
<syntaxhighlight lang="nix">environment.systemPackages = with pkgs; [
  (vscode-with-extensions.override {
    vscodeExtensions = with vscode-extensions; [
      jnoortheen.nix-ide
      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";
      }
    ];
  })
];</syntaxhighlight>
 
Some examples here: [https://github.com/search?type=code&q=language:Nix+&#x22;extensionFromVscodeMarketplace&#x22; GitHub Search - type:code language:Nix "extensionFromVscodeMarketplace"]
 
{{Note|For fetching the sha256 string you can use [https://nix.dev/manual/nix/stable/command-ref/new-cli/nix3-store-prefetch-file <code>nix store prefetch-file</code>] like so:
 
<syntaxhighlight lang="console">nix store prefetch-file marketplace.visualstudio.com/_apis/public/gallery/publishers/<publisher>/vsextensions/<extension>/<version>/vspackage</syntaxhighlight>
 
Example:
 
<syntaxhighlight lang="console">nix store prefetch-file https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode-remote/vsextensions/remote-ssh-edit/0.47.2/vspackage</syntaxhighlight>}}
 
<code>extensionsFromVscodeMarketplace</code> is a manual way to fetch extensions. However, to keep updated from upstream, [https://github.com/nix-community/nix-vscode-extensions nix-community/nix-vscode-extensions] provides the Nix expressions for the majority of available extensions from Open VSX and VSCode Marketplace. A GitHub Action updates the extensions daily. Similarly, [https://github.com/nix-community/nix4vscode nix-community/nix4vscode] provides a Nix overlay for VSCode Marketplace and Open VSX extensions.
 
=== Home Manager ===
<syntaxhighlight lang="nix">programs.vscode = {
  enable = true;
  profiles.default.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.xhtml#opt-programs.vscode.enable Home Manager Manual: Options - programs.vscode]
* Search for extensions with configurations: [https://search.nixos.org/packages?type=packages&query=vscode-extensions NixOS Search: vscode-extensions]
 
=== Nix-env ===
{{Warning|Use of nix-env is unreproducible and thus discouraged and not recommended}}<syntaxhighlight lang="console">nix-env -iA nixos.vscode</syntaxhighlight>
 
== Use VS Code extensions without additional configuration ==
With {{Nixpkg|pkgs/applications/editors/vscode/generic.nix|vscode.fhs}}, the editor launches inside a [[wikipedia:Filesystem_Hierarchy_Standard|FHS]] compliant chroot environment using {{Manual|nixpkgs|sec-fhs-environments|<code>buildFHSEnv</code>}}. This reintroduces directories such as <code>/bin</code>, <code>/lib</code>, and <code>/usr</code>, which allows for extensions which ship pre-compiled binaries to work with little to no additional nixification.
 
{{note|{{Manual|nixpkgs|sec-fhs-environments|<code>buildFHSEnv</code>}} allows for ease-of-use at the cost of impurity, non-reproducibility, and denied root access (you cannot use <code>sudo</code> in <code>.fhs</code> packages, also see [https://discourse.nixos.org/t/sudo-does-not-work-from-within-vscode-fhs/14227])}}
 
=== NixOS ===
<syntaxHighlight lang=nix>
environment.systemPackages = with pkgs; [ vscode.fhs ];
</syntaxHighlight>


<syntaxHighlight lang=console>
=== Home Manager ===
$ code
<syntaxHighlight lang=nix>
programs.vscode = {
  enable = true;
  package = pkgs.vscode.fhs;
};
</syntaxHighlight>
</syntaxHighlight>


== Managing extensions ==
Adding extension-specific dependencies, these will be added to the FHS environment:
<syntaxhighlight lang="nix">
# needed for rust lang server and rust-analyzer extension
programs.vscode.package = pkgs.vscode.fhsWithPackages (
  ps: with ps; [
    rustup
    zlib
    openssl.dev
    pkg-config
  ]
);
</syntaxhighlight>


Extensions can be managed using the 'vscode-with-extensions' package:
== Insiders Build ==
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.
 
The following derivation builds a package with the latest insiders build (on NixOS in <code>environment.systemPackages</code>, or on Home Manager in <code>home.packages</code>) :


<syntaxHighlight lang=nix>
<syntaxHighlight lang=nix>
{ pkgs, ... }:
(pkgs.vscode.override { isInsiders = true; }).overrideAttrs (oldAttrs: rec {
  src = (builtins.fetchTarball {
    url = "https://code.visualstudio.com/sha/download?build=insider&os=linux-x64";
    sha256 = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
  });
  version = "latest";


let
   buildInputs = oldAttrs.buildInputs ++ [ pkgs.krb5 ];
   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>
</syntaxHighlight>


We can retrieve an updated set for manually installed / specified packages by cloning the 'nixpkgs' repo from github, and running: 'nixpkgs/pkgs/misc/vscode-extensions/update_installed_exts.sh'
''[https://discourse.nixos.org/t/how-to-install-latest-vscode-insiders/7895/4 credits: @jnoortheen]''
 
=== Updating insiders placeholder <code>sha256</code> ===
You will need to update the placeholder <code>sha256</code> value for each new Insiders build.
 
The new value will appear in a validation error when you try to build.
 
Put an arbitrary placeholder value in the <code>sha256</code> field, try to build and you'll get an error message regarding the sha256 value.
 
=== Resolving the "hash mismatch" error ===
 
==== For <code>sha256:</code> ====
Example:<pre>//-- ...
      error: hash mismatch in file downloaded from 'https://code.visualstudio.com/sha/download?build=insider&os=linux-x64':
        specified: sha256:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        got:      sha256:16fzxqs6ql4p2apq9aw7l10h4ag1r7jwlfvknk5rd2zmkscwhn6z
//-- ...</pre>
 
Copy the "got" value (while stripping out the prepended "<code>sha256:</code>"), and paste it in your placeholder <code>sha256</code> value
 
Resulting: "<code>16fzxqs6ql4p2apq9aw7l10h4ag1r7jwlfvknk5rd2zmkscwhn6z</code>"
 
===== For <code>sha256-</code>  =====
Example:<pre>//-- ...
        error: hash mismatch in fixed-output derivation '/nix/store/path':
        specified: sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
            got:    sha256-aQvTtZdPU2F1UjkFxiLs4A+60A4qc9bXKwKriNsCDPg=
//-- ...</pre>
 
Copy the "got" value (while stripping out the prepended "<code>sha256-</code>")
 
Then, run the following python script:
 
<syntaxhighlight lang="python">
import base64
text = b'aQvTtZdPU2F1UjkFxiLs4A+60A4qc9bXKwKriNsCDPg=' # Replace the string in between ' with the according hash
print(base64.decodebytes(text).hex())
</syntaxhighlight>
 
Its output should be pasted in your placeholder <code>sha256</code> value
 
== Creating development environments using nix-shell ==
Instead of using configuration.nix to add packages (e.g. Python or NodeJS) for developing code on VSCode, you can instead use nix-shell. This will allow you to seamlessly create development environments with the correct packages for your project, without rebuilding and restarting NixOS. See [[Development_environment_with_nix-shell | this page]] for further instructions in building nix-shell development environments.
 
=== Automatically switch nix shells when switching projects ===
You can do this by using [https://github.com/nix-community/nix-direnv nix-direnv] and [https://marketplace.visualstudio.com/items?itemName=mkhl.direnv the VSCode extension direnv] for integration. View the nix-direnv github page linked for a guide on setting it up.
 
=== Alternative for manually switching shells ===
The extension [https://marketplace.visualstudio.com/items?itemName=arrterian.nix-env-selector nix-env-selector] will make switching between different nix-shell environments within VSCode so you can switch between different coding projects easily and manually. It has a guide for setting up nix-shell environments for VSCode.
 
== Wayland ==
 
To make sure VSCode runs on Wayland native instead of Xwayland, you can make it use Ozone Wayland by setting the environment variable <code>NIXOS_OZONE_WL</code> with <code>NIXOS_OZONE_WL=1</code>
 
See [[Wayland#Electron and Chromium]]
 
== Updating extension versions ==
 
The Nixpkgs vscode extensions directory contains [https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vscode/extensions/update_installed_exts.sh a script] which use <code>code --list-extensions</code> and lookup the latest versions of those extensions to outputs a nix expression with a single <code>extensions</code> attribute of the same type as <code>extensionsFromVscodeMarketplace</code> inputs.
 
To run it in your current directory:<syntaxhighlight lang="console">curl -fsSL https://raw.githubusercontent.com/NixOS/nixpkgs/master/pkgs/applications/editors/vscode/extensions/update_installed_exts.sh | sh</syntaxhighlight>
 
=== Example output ===
<syntaxhighlight lang="console">curl -fsSL https://raw.githubusercontent.com/NixOS/nixpkgs/master/pkgs/applications/editors/vscode/extensions/update_installed_exts.sh | sh
{ extensions = [
  {
    name = "project-manager";
    publisher = "alefragnani";
    version = "12.4.0";
    sha256 = "0q6zkz7pqz2prmr01h17h9a5q6cn6bjgcxggy69c84j8h2w905wy";
  }
  {
    name = "githistory";
    publisher = "donjayamanne";
    version = "0.6.18";
    sha256 = "01lc9gpqdjy6himn7jsfjrfz8xrk728c20903lxkxy5fliv232gz";
  }
];
}</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 ===


'''tl;dr Use [https://github.com/msteen/nixos-vscode-server nix-vscode-server] on host machines.'''
'''tl;dr Use [https://github.com/msteen/nixos-vscode-server nix-vscode-server] or [https://github.com/Mic92/nix-ld nix-ld] on host machines.'''
 
==== nix-vscode-server ====


Note that nix-vscode-server is currently broken as of 5/28/21 (PRs to fix are https://github.com/msteen/nixos-vscode-server/pull/3, https://github.com/msteen/nixos-vscode-server/pull/4, https://github.com/msteen/nixos-vscode-server/pull/5). Here's a workaround: Install the <code>nodejs-14_x</code> package on the NixOS host, and then run the following nix-shell script:
Note that nix-vscode-server works as of 8/21/21 but is occasionally broken (See https://github.com/msteen/nixos-vscode-server/pull/3, https://github.com/msteen/nixos-vscode-server/pull/4, https://github.com/msteen/nixos-vscode-server/pull/5). Here's a workaround: Install the <code>nodejs-16_x</code> package on the NixOS host, and then run the following nix-shell script:
<syntaxHighlight lang=haskell>
<syntaxHighlight lang=haskell>
#! /usr/bin/env nix-shell
#! /usr/bin/env nix-shell
Line 80: Line 232:
</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-14_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 14 is needed as of 5/14/2021).
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-ld ====


=== Nix-sourced VSCode to NixOS host ===
Add the following settings to <code>configuration.nix</code> on the NixOS host
 
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
  programs.nix-ld.enable = true;
</nowiki>}}
 
Then run <code>nixos-rebuild switch</code> to enable <code>nix-ld</code>. Unlike the <code>nix-vscode-server</code> solution, the <code>nix-ld</code> solution also enables VSCode extensions even if they include non-Nix binaries.
 
=== 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 ==
== Remote WSL ==
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.
 
Similar to SSH hosts, both <code>nix-vscode-server</code> and <code>nix-ld</code> solution allows a VSCode Windows client to connect a [https://github.com/nix-community/NixOS-WSL NixOS-WSL] host. However, by default the VSCode Windows client uses <code>wsl.exe --exec</code> to start the code server, which bypasses NixOS environment variables required by <code>nix-ld</code>, resulting in failures.  
 


== Use VSCode extensions without additional configuration ==
As a workaround, search for the following text in all files under the directory <code>$HOME\.vscode\extensions\</code>


{{note| Only available in nixpkgs-unstable or 21.05 and after }}
{{file|wslDaemon.js|js|<nowiki>
.push("sh","-c"
</nowiki>}}


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.}}
Replace it with


Example usage:
{{file|wslDaemon.js|js|<nowiki>
<syntaxHighlight lang=console>
.push("sh","-l","-c"
$ nix-shell -p vscode-fhs --run code
</nowiki>}}
 
Then restart VS Code and your VS Code client should be able to connect to NixOS host
 
See https://github.com/nix-community/NixOS-WSL/issues/222 for the discussion about <code>wsl --exec</code> issue on NixOS-WSL.
See https://github.com/microsoft/vscode-remote-release/issues/8305#issuecomment-1661396267 about the workaround.
 
== Troubleshooting ==
 
=== Writing login information to the keychain failed ===
 
If you get an error similar to the following, enable a [[Secret Service]] provider.
 
<pre>Writing login information to the keychain failed with error 'The name org.freedesktop.secret was not provided by any .service files'.</pre>
 
=== Server did not start successfully ===
 
<blockquote>
Server did not start successfully. Full server log at /home/user/.vscode-server/.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.log<br>
<br>
server log:<br>
/home/user/.vscode-server/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/bin/code-server: line 12: /home/user/.vscode-server/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/node: No such file or directory
</blockquote>
 
"No such file or directory" means that libc is not found, see
 
<pre>
ldd ~/.vscode-server/bin/*/node
</pre>
 
try to run the node binary on the server
 
<pre>
~/.vscode-server/bin/*/node
</pre>
 
if this fails, install node version 16, and try to patch the node binary
 
<pre>
nix-env -iA nixos.nodejs-16_x
</pre>
 
<syntaxHighlight lang=bash>
#! /bin/sh
# fix-vscode-server-node.sh
# https://github.com/microsoft/vscode-remote-release/issues/648#issuecomment-503148523
cd ~/.vscode-server/bin/*
if ! ./node -e "require('process').exit(0)"
then
  echo patching node binary $(readlink -f node)
  rm node
  ln -s $(which node)
else
  echo node is working $(readlink -f node)
fi
</syntaxHighlight>
</syntaxHighlight>


Home-manager:
=== Timeout ===
<syntaxHighlight lang=nix>
 
  programs.vscode.enable = true;
If you're using fish or other shell, set this in the user settings JSON on the client machine:
  programs.vscode.package = pkgs.vscode-fhs;
 
<syntaxHighlight lang=bash>
"remote.SSH.useLocalServer": false
</syntaxHighlight>
</syntaxHighlight>


Adding extension-specific dependencies, these will be added to the FHS environment:
See https://github.com/microsoft/vscode-remote-release/issues/2509 and https://github.com/nix-community/nixos-vscode-server/issues/18
<syntaxHighlight lang=nix>
 
  # needed for rust lang server extension
[[Category:Applications]]
  programs.vscode.package = pkgs.vscode-fhsWithPackages (ps: with ps; [ rustup zlib ]);
 
</syntaxHighlight>
[[Category:IDE]]