···11+{ stdenv, lib, fetchurl, runCommand, buildEnv, vscode, which, writeScript
22+, vscodeExtensions ? [] }:
33+44+/*
55+ `vsixExtensions`
66+ : A set of vscode extensions to be installed alongside the editor. Here's a an
77+ example:
88+99+ ~~~
1010+ vscode-with-extensions.override {
1111+1212+ # When the extension is already available in the default extensions set.
1313+ vscodeExtensions = with vscodeExtensions; [
1414+ nix
1515+ ]
1616+1717+ # Concise version from the vscode market place when not available in the default set.
1818+ ++ vscodeUtils.extensionsFromVscodeMarketplace [
1919+ {
2020+ name = "code-runner";
2121+ publisher = "formulahendry";
2222+ version = "0.6.33";
2323+ sha256 = "166ia73vrcl5c9hm4q1a73qdn56m0jc7flfsk5p5q41na9f10lb0";
2424+ }
2525+ ];
2626+ }
2727+ ~~~
2828+2929+ This expression should fetch
3030+ - the *nix* vscode extension from whatever source defined in the
3131+ default nixpkgs extensions set `vscodeExtensions`.
3232+3333+ - the *code-runner* vscode extension from the marketplace using the
3434+ following url:
3535+3636+ ~~~
3737+ https://bbenoist.gallery.vsassets.io/_apis/public/gallery/publisher/bbenoist/extension/nix/1.0.1/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage
3838+ ~~~
3939+4040+ The original `code` executable will be wrapped so that it uses the set of pre-installed / unpacked
4141+ extensions as its `--extensions-dir`.
4242+*/
4343+4444+let
4545+4646+ wrappedPkgVersion = lib.getVersion vscode;
4747+ wrappedPkgName = lib.removeSuffix "-${wrappedPkgVersion}" vscode.name;
4848+4949+ combinedExtensionsDrv = buildEnv {
5050+ name = "${wrappedPkgName}-extensions-${wrappedPkgVersion}";
5151+ paths = vscodeExtensions;
5252+ };
5353+5454+ wrappedExeName = "code";
5555+ exeName = wrappedExeName;
5656+5757+ wrapperExeFile = writeScript "${exeName}" ''
5858+ #!${stdenv.shell}
5959+ exec ${vscode}/bin/${wrappedExeName} \
6060+ --extensions-dir "${combinedExtensionsDrv}/share/${wrappedPkgName}/extensions" \
6161+ "$@"
6262+ '';
6363+6464+in
6565+6666+# When no extensions are requested, we simply redirect to the original
6767+# non-wrapped vscode executable.
6868+runCommand "${wrappedPkgName}-with-extensions-${wrappedPkgVersion}" {
6969+ buildInputs = [ vscode which ];
7070+ dontPatchELF = true;
7171+ dontStrip = true;
7272+ meta = vscode.meta;
7373+} ''
7474+ mkdir -p "$out/bin"
7575+ ${if [] == vscodeExtensions
7676+ then ''
7777+ ln -sT "${vscode}/bin/${wrappedExeName}" "$out/bin/${exeName}"
7878+ ''
7979+ else ''
8080+ ln -sT "${wrapperExeFile}" "$out/bin/${exeName}"
8181+ ''}
8282+''