Add Nix/NixOS dev-shell (#13407)

killian and Niklas Korz created

This PR adds a Nix/NixOS development-shell (`shell.nix`), which is based
on the upstream
[nixpkgs](https://github.com/NixOS/nixpkgs/blob/c5d4d458115263ec3ee0efd974e6aeb2f787a0ed/pkgs/by-name/ze/zed-editor/package.nix),
as well as its corresponding `flake.nix` file.

To use it, run either the `nix-shell` command (uses the `shell.nix`
file), or the newer but experimental `nix develop` command (uses
`flake.nix`)

~~This has not been tested on macOS, tho preliminary code is there to
try and support it, feel free to report any issues.~~ Zed unfortunately
doesn't build on nix-darwin (see
https://github.com/NixOS/nixpkgs/issues/320084), so this PR doesn't aim
to add darwin support.

---

Release Notes:

- N/A

---------

Signed-off-by: xtrm <oss@xtrm.me>
Co-authored-by: Niklas Korz <niklas@niklaskorz.de>

Change summary

.gitignore |  1 +
flake.lock | 27 +++++++++++++++++++++++++++
flake.nix  | 31 +++++++++++++++++++++++++++++++
shell.nix  | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 115 insertions(+)

Detailed changes

.gitignore 🔗

@@ -1,3 +1,4 @@
+/.direnv
 .idea
 **/target
 **/cargo-target

flake.lock 🔗

@@ -0,0 +1,27 @@
+{
+  "nodes": {
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1719690277,
+        "narHash": "sha256-0xSej1g7eP2kaUF+JQp8jdyNmpmCJKRpO12mKl/36Kc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "2741b4b489b55df32afac57bc4bfd220e8bf617e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}

flake.nix 🔗

@@ -0,0 +1,31 @@
+{
+  description = "High-performance, multiplayer code editor from the creators of Atom and Tree-sitter";
+
+  inputs = {
+    nixpkgs.url = "github:NixOS/nixpkgs?ref=nixos-unstable";
+  };
+
+  outputs =
+    { self, nixpkgs }:
+    let
+      inherit (self) outputs;
+      systems = [
+        "aarch64-linux"
+        "x86_64-linux"
+        "aarch64-darwin"
+        "x86_64-darwin"
+      ];
+      forAllSystems = nixpkgs.lib.genAttrs systems;
+    in
+    {
+      devShells = forAllSystems (
+        system:
+        let
+          pkgs = import nixpkgs { inherit system; };
+        in
+        {
+          default = import ./shell.nix { inherit pkgs; };
+        }
+      );
+    };
+}

shell.nix 🔗

@@ -0,0 +1,56 @@
+{
+  pkgs ? import <nixpkgs> { },
+}:
+
+let
+  stdenv = pkgs.stdenvAdapters.useMoldLinker pkgs.llvmPackages_18.stdenv;
+in
+if pkgs.stdenv.isDarwin then
+  # See https://github.com/NixOS/nixpkgs/issues/320084
+  throw "zed: nix dev-shell isn't supported on darwin yet."
+else
+  (pkgs.mkShell.override { inherit stdenv; }) rec {
+    nativeBuildInputs = with pkgs; [
+      copyDesktopItems
+      curl
+      perl
+      pkg-config
+      protobuf
+      rustPlatform.bindgenHook
+    ];
+
+    buildInputs = with pkgs; [
+      curl
+      fontconfig
+      freetype
+      libgit2
+      openssl
+      sqlite
+      zlib
+      zstd
+
+      alsa-lib
+      libxkbcommon
+      wayland
+      xorg.libxcb
+    ];
+
+    env = {
+      LD_LIBRARY_PATH =
+        with pkgs;
+        lib.makeLibraryPath (
+          buildInputs
+          ++ [
+            stdenv.cc.cc.lib
+            vulkan-loader
+          ]
+        );
+      ZSTD_SYS_USE_PKG_CONFIG = true;
+      FONTCONFIG_FILE = pkgs.makeFontsConf {
+        fontDirectories = [
+          "assets/fonts/zed-mono"
+          "assets/fonts/zed-sans"
+        ];
+      };
+    };
+  }