about summary refs log tree commit diff
path: root/nixpkgs/pkgs/shells
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/shells')
-rw-r--r--nixpkgs/pkgs/shells/any-nix-shell/default.nix30
-rw-r--r--nixpkgs/pkgs/shells/bash/5.nix150
-rw-r--r--nixpkgs/pkgs/shells/bash/bash-5.2-patches.nix19
-rw-r--r--nixpkgs/pkgs/shells/bash/bash-completion/default.nix74
-rw-r--r--nixpkgs/pkgs/shells/bash/blesh/default.nix61
-rw-r--r--nixpkgs/pkgs/shells/bash/fzf-obc/default.nix30
-rw-r--r--nixpkgs/pkgs/shells/bash/nix-bash-completions/default.nix48
-rw-r--r--nixpkgs/pkgs/shells/bash/parallel.patch12
-rw-r--r--nixpkgs/pkgs/shells/bash/pgrp-pipe-5.patch15
-rw-r--r--nixpkgs/pkgs/shells/bash/undistract-me/default.nix81
-rwxr-xr-xnixpkgs/pkgs/shells/bash/update-patch-set.sh52
-rw-r--r--nixpkgs/pkgs/shells/bash/yarn-completion/default.nix35
-rw-r--r--nixpkgs/pkgs/shells/carapace/default.nix39
-rw-r--r--nixpkgs/pkgs/shells/dash/default.nix53
-rw-r--r--nixpkgs/pkgs/shells/dgsh/default.nix48
-rw-r--r--nixpkgs/pkgs/shells/dgsh/glibc-2.26.patch12
-rw-r--r--nixpkgs/pkgs/shells/es/default.nix44
-rw-r--r--nixpkgs/pkgs/shells/fish/babelfish.nix21
-rw-r--r--nixpkgs/pkgs/shells/fish/default.nix345
-rw-r--r--nixpkgs/pkgs/shells/fish/oh-my-fish/default.nix62
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/async-prompt.nix20
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/autopair.nix20
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/bass.nix30
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/bobthefish.nix23
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/bobthefisher.nix23
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/build-fish-plugin.nix75
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/clownfish.nix20
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/colored-man-pages.nix20
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/default.nix62
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/done.nix25
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/fishtape.nix32
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/fishtape_3.nix25
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/foreign-env/default.nix29
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/foreign-env/suppress-harmless-warnings.patch23
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/forgit.nix24
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/fzf-fish.nix45
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/fzf.nix23
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/github-copilot-cli-fish.nix20
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/grc.nix24
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/humantime-fish.nix29
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/hydro.nix20
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/pisces.nix20
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/plugin-git.nix20
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/puffer.nix20
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/pure.nix29
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/sdkman-for-fish.nix20
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/sponge.nix20
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/tide.nix28
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/wakatime-fish.nix30
-rw-r--r--nixpkgs/pkgs/shells/fish/plugins/z.nix23
-rw-r--r--nixpkgs/pkgs/shells/fish/wrapper.nix52
-rw-r--r--nixpkgs/pkgs/shells/fzf-git-sh/default.nix64
-rw-r--r--nixpkgs/pkgs/shells/hilbish/default.nix41
-rw-r--r--nixpkgs/pkgs/shells/hishtory/default.nix37
-rw-r--r--nixpkgs/pkgs/shells/ion/Cargo.lock2976
-rw-r--r--nixpkgs/pkgs/shells/ion/build-script.patch17
-rw-r--r--nixpkgs/pkgs/shells/ion/default.nix56
-rw-r--r--nixpkgs/pkgs/shells/jush/default.nix28
-rw-r--r--nixpkgs/pkgs/shells/ksh/default.nix45
-rw-r--r--nixpkgs/pkgs/shells/liquidprompt/default.nix33
-rw-r--r--nixpkgs/pkgs/shells/loksh/default.nix60
-rw-r--r--nixpkgs/pkgs/shells/mrsh/default.nix31
-rw-r--r--nixpkgs/pkgs/shells/murex/default.nix27
-rw-r--r--nixpkgs/pkgs/shells/nix-your-shell/default.nix28
-rw-r--r--nixpkgs/pkgs/shells/nsh/default.nix29
-rw-r--r--nixpkgs/pkgs/shells/nushell/default.nix77
-rw-r--r--nixpkgs/pkgs/shells/nushell/nu_scripts/default.nix37
-rw-r--r--nixpkgs/pkgs/shells/nushell/plugins/default.nix9
-rw-r--r--nixpkgs/pkgs/shells/nushell/plugins/formats.nix36
-rw-r--r--nixpkgs/pkgs/shells/nushell/plugins/gstat.nix36
-rw-r--r--nixpkgs/pkgs/shells/nushell/plugins/net.nix41
-rw-r--r--nixpkgs/pkgs/shells/nushell/plugins/query.nix34
-rw-r--r--nixpkgs/pkgs/shells/nushell/plugins/regex.nix35
-rw-r--r--nixpkgs/pkgs/shells/oh/default.nix25
-rw-r--r--nixpkgs/pkgs/shells/oil/default.nix54
-rw-r--r--nixpkgs/pkgs/shells/oksh/default.nix33
-rw-r--r--nixpkgs/pkgs/shells/powershell/default.nix139
-rw-r--r--nixpkgs/pkgs/shells/rc-9front/default.nix52
-rw-r--r--nixpkgs/pkgs/shells/rc-9front/path.patch13
-rw-r--r--nixpkgs/pkgs/shells/rush/default.nix50
-rw-r--r--nixpkgs/pkgs/shells/scponly/default.nix40
-rw-r--r--nixpkgs/pkgs/shells/scponly/scponly-fix-make.patch21
-rw-r--r--nixpkgs/pkgs/shells/xonsh/default.nix88
-rw-r--r--nixpkgs/pkgs/shells/xonsh/wrapper.nix24
-rw-r--r--nixpkgs/pkgs/shells/yash/default.nix27
-rw-r--r--nixpkgs/pkgs/shells/zsh/agdsn-zsh-config/default.nix34
-rw-r--r--nixpkgs/pkgs/shells/zsh/agkozak-zsh-prompt/default.nix32
-rw-r--r--nixpkgs/pkgs/shells/zsh/antibody/default.nix34
-rw-r--r--nixpkgs/pkgs/shells/zsh/antidote/default.nix33
-rw-r--r--nixpkgs/pkgs/shells/zsh/antigen/default.nix26
-rw-r--r--nixpkgs/pkgs/shells/zsh/default.nix152
-rw-r--r--nixpkgs/pkgs/shells/zsh/fzf-zsh/default.nix38
-rw-r--r--nixpkgs/pkgs/shells/zsh/gradle-completion/default.nix37
-rw-r--r--nixpkgs/pkgs/shells/zsh/grml-zsh-config/default.nix38
-rw-r--r--nixpkgs/pkgs/shells/zsh/lambda-mod-zsh-theme/default.nix26
-rw-r--r--nixpkgs/pkgs/shells/zsh/nix-zsh-completions/default.nix28
-rw-r--r--nixpkgs/pkgs/shells/zsh/oh-my-zsh/default.nix126
-rw-r--r--nixpkgs/pkgs/shells/zsh/pure-prompt/default.nix31
-rw-r--r--nixpkgs/pkgs/shells/zsh/spaceship-prompt/default.nix40
-rw-r--r--nixpkgs/pkgs/shells/zsh/tz_completion.patch14
-rw-r--r--nixpkgs/pkgs/shells/zsh/zi/default.nix30
-rw-r--r--nixpkgs/pkgs/shells/zsh/zimfw/default.nix46
-rw-r--r--nixpkgs/pkgs/shells/zsh/zinit/default.nix43
-rw-r--r--nixpkgs/pkgs/shells/zsh/zplug/default.nix34
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-abbr/default.nix30
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-autocomplete/default.nix28
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-autopair/default.nix27
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-autosuggestions/default.nix31
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-bd/default.nix32
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-better-npm-completion/default.nix26
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-clipboard/clipboard.plugin.zsh40
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-clipboard/default.nix27
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-command-time/default.nix35
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-completions/default.nix30
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-deer/default.nix35
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-deer/realpath.patch28
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-defer/default.nix29
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-edit/default.nix33
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-f-sy-h/default.nix32
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-fast-syntax-highlighting/default.nix31
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-forgit/default.nix56
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-fzf-history-search/default.nix36
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-fzf-tab/default.nix46
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-git-prompt/default.nix70
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-history-search-multi-word/default.nix31
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-history-substring-search/default.nix27
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-history/default.nix37
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-nix-shell/default.nix31
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-powerlevel10k/default.nix59
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-powerlevel10k/gitstatusd.patch13
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-powerlevel9k/default.nix31
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-prezto/default.nix42
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-syntax-highlighting/default.nix28
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-system-clipboard/default.nix26
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-vi-mode/default.nix28
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-you-should-use/default.nix27
-rw-r--r--nixpkgs/pkgs/shells/zsh/zsh-z/default.nix29
137 files changed, 8401 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/shells/any-nix-shell/default.nix b/nixpkgs/pkgs/shells/any-nix-shell/default.nix
new file mode 100644
index 000000000000..fd4807e6d675
--- /dev/null
+++ b/nixpkgs/pkgs/shells/any-nix-shell/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, bash }:
+
+stdenv.mkDerivation rec {
+  pname = "any-nix-shell";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "haslersn";
+    repo = "any-nix-shell";
+    rev = "v${version}";
+    sha256 = "0q27rhjhh7k0qgcdcfm8ly5za6wm4rckh633d0sjz87faffkp90k";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ bash ];
+  installPhase = ''
+    mkdir -p $out/bin
+    cp -r bin $out
+    wrapProgram $out/bin/any-nix-shell --prefix PATH ":" $out/bin
+  '';
+
+  meta = with lib; {
+    description = "fish and zsh support for nix-shell";
+    license = licenses.mit;
+    homepage = "https://github.com/haslersn/any-nix-shell";
+    maintainers = with maintainers; [ haslersn ];
+    mainProgram = "any-nix-shell";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/bash/5.nix b/nixpkgs/pkgs/shells/bash/5.nix
new file mode 100644
index 000000000000..3c4fb83e3e4e
--- /dev/null
+++ b/nixpkgs/pkgs/shells/bash/5.nix
@@ -0,0 +1,150 @@
+{ lib
+, stdenv
+, buildPackages
+, fetchurl
+, bison
+, util-linux
+
+  # patch for cygwin requires readline support
+, interactive ? stdenv.isCygwin
+, readline
+, withDocs ? false
+, texinfo
+, forFHSEnv ? false
+
+, pkgsStatic
+}:
+
+let
+  upstreamPatches = import ./bash-5.2-patches.nix (nr: sha256: fetchurl {
+    url = "mirror://gnu/bash/bash-5.2-patches/bash52-${nr}";
+    inherit sha256;
+  });
+in
+stdenv.mkDerivation rec {
+  name = "bash-${lib.optionalString interactive "interactive-"}${version}-p${toString (builtins.length upstreamPatches)}";
+  version = "5.2";
+
+  src = fetchurl {
+    url = "mirror://gnu/bash/bash-${version}.tar.gz";
+    sha256 = "sha256-oTnBZt9/9EccXgczBRZC7lVWwcyKSnjxRVg8XIGrMvs=";
+  };
+
+  hardeningDisable = [ "format" ]
+    # bionic libc is super weird and has issues with fortify outside of its own libc, check this comment:
+    # https://github.com/NixOS/nixpkgs/pull/192630#discussion_r978985593
+    # or you can check libc/include/sys/cdefs.h in bionic source code
+    ++ lib.optional (stdenv.hostPlatform.libc == "bionic") "fortify";
+
+  outputs = [ "out" "dev" "man" "doc" "info" ];
+
+  separateDebugInfo = true;
+
+  env.NIX_CFLAGS_COMPILE = ''
+    -DSYS_BASHRC="/etc/bashrc"
+    -DSYS_BASH_LOGOUT="/etc/bash_logout"
+  '' + lib.optionalString (!forFHSEnv) ''
+    -DDEFAULT_PATH_VALUE="/no-such-path"
+    -DSTANDARD_UTILS_PATH="/no-such-path"
+  '' + ''
+    -DNON_INTERACTIVE_LOGIN_SHELLS
+    -DSSH_SOURCE_BASHRC
+  '';
+
+  patchFlags = [ "-p0" ];
+
+  patches = upstreamPatches ++ [
+    ./pgrp-pipe-5.patch
+    (fetchurl {
+      name = "fix-static.patch";
+      url = "https://cgit.freebsd.org/ports/plain/shells/bash/files/patch-configure?id=3e147a1f594751a68fea00a28090d0792bee0b51";
+      sha256 = "XHFMQ6eXTReNoywdETyrfQEv1rKF8+XFbQZP4YoVKFk=";
+    })
+    # Apply parallel build fix pending upstream inclusion:
+    #   https://savannah.gnu.org/patch/index.php?10373
+    # Had to fetch manually to workaround -p0 default.
+    ./parallel.patch
+  ];
+
+  configureFlags = [
+    # At least on Linux bash memory allocator has pathological performance
+    # in scenarios involving use of larger memory:
+    #   https://lists.gnu.org/archive/html/bug-bash/2023-08/msg00052.html
+    # Various distributions default to system allocator. Let's nixpkgs
+    # do the same.
+    "--without-bash-malloc"
+    (if interactive then "--with-installed-readline" else "--disable-readline")
+  ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+    "bash_cv_job_control_missing=nomissing"
+    "bash_cv_sys_named_pipes=nomissing"
+    "bash_cv_getcwd_malloc=yes"
+  ] ++ lib.optionals stdenv.hostPlatform.isCygwin [
+    "--without-libintl-prefix"
+    "--without-libiconv-prefix"
+    "--with-installed-readline"
+    "bash_cv_dev_stdin=present"
+    "bash_cv_dev_fd=standard"
+    "bash_cv_termcap_lib=libncurses"
+  ] ++ lib.optionals (stdenv.hostPlatform.libc == "musl") [
+    "--disable-nls"
+  ];
+
+  strictDeps = true;
+  # Note: Bison is needed because the patches above modify parse.y.
+  depsBuildBuild = [ buildPackages.stdenv.cc ];
+  nativeBuildInputs = [ bison ]
+    ++ lib.optional withDocs texinfo
+    ++ lib.optional stdenv.hostPlatform.isDarwin stdenv.cc.bintools;
+
+  buildInputs = lib.optional interactive readline;
+
+  enableParallelBuilding = true;
+
+  makeFlags = lib.optionals stdenv.hostPlatform.isCygwin [
+    "LOCAL_LDFLAGS=-Wl,--export-all,--out-implib,libbash.dll.a"
+    "SHOBJ_LIBS=-lbash"
+  ];
+
+  nativeCheckInputs = [ util-linux ];
+  doCheck = false; # dependency cycle, needs to be interactive
+
+  postInstall = ''
+    ln -s bash "$out/bin/sh"
+    rm -f $out/lib/bash/Makefile.inc
+  '';
+
+  postFixup =
+    if interactive
+    then ''
+      substituteInPlace "$out/bin/bashbug" \
+        --replace '#!/bin/sh' "#!$out/bin/bash"
+    ''
+    # most space is taken by locale data
+    else ''
+      rm -rf "$out/share" "$out/bin/bashbug"
+    '';
+
+  passthru = {
+    shellPath = "/bin/bash";
+    tests.static = pkgsStatic.bash;
+  };
+
+  meta = with lib; {
+    homepage = "https://www.gnu.org/software/bash/";
+    description = "GNU Bourne-Again Shell, the de facto standard shell on Linux" + lib.optionalString interactive " (for interactive use)";
+    longDescription = ''
+      Bash is the shell, or command language interpreter, that will
+      appear in the GNU operating system.  Bash is an sh-compatible
+      shell that incorporates useful features from the Korn shell
+      (ksh) and C shell (csh).  It is intended to conform to the IEEE
+      POSIX P1003.2/ISO 9945.2 Shell and Tools standard.  It offers
+      functional improvements over sh for both programming and
+      interactive use.  In addition, most sh scripts can be run by
+      Bash without modification.
+    '';
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ dtzWill ];
+    mainProgram = "bash";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/bash/bash-5.2-patches.nix b/nixpkgs/pkgs/shells/bash/bash-5.2-patches.nix
new file mode 100644
index 000000000000..e118f03e0300
--- /dev/null
+++ b/nixpkgs/pkgs/shells/bash/bash-5.2-patches.nix
@@ -0,0 +1,19 @@
+# Automatically generated by `update-patch-set.sh'; do not edit.
+
+patch: [
+(patch "001" "02iibpd3jq8p1bhdzgik8ps6gi1145vr463a82gj1hivjbp2ybzl")
+(patch "002" "1f6p1z85qh1lavdp3xikgp0bfv0vqhvgpgwmdzlywl35hwdmxk25")
+(patch "003" "1zxsi869jd90hksx3nyypgyqwrxhw2ws3r6hmk76yc1lsgdhq2ba")
+(patch "004" "04i5liw5cg6dqkdxfgazqc2jrw40bmclx3dx45bwy259pcj7g0iq")
+(patch "005" "0mykflv9qnbx3jz71l4f7isadiw9knm4qimqkwsv9cv88dafpq7c")
+(patch "006" "13265akl8w6zyrg0l7f0x6arjgqjhllcwl6lk46rl53x4mm5dq6i")
+(patch "007" "146lrwkn5wgxzs6vx34wl47g69zsxdy032k40qzi626b47ya6015")
+(patch "008" "1s5i8hcayrv25lc8fxcr431v634yx5sii53b8fmip789s0pxjjvb")
+(patch "009" "1kfk25151ka9wkmk1myf12irgcmvhsd8b0nfifvhrszah9w82npr")
+(patch "010" "1kf1jrwm30js0v3d1r2rk4x09s1pyjp70wnd1qqhf9bmkw15ww67")
+(patch "011" "1x5nkvbj6hci7gx42q7qa72hg2a9wwxh85dk79gn521ypwjmy6w3")
+(patch "012" "0b6lcwzm7v5bzjiwaz2c8n5aj77w8ckhp2vwk4v3zsdq3z70gc9g")
+(patch "013" "1rkwpibd6j2ghppfhqsva2jm4kdni6b7jpdsxdps52643gc4yjq9")
+(patch "014" "09766vqqw4ffnmysm725v35qkhp1g9j4qgqag941xvq655pj9y9y")
+(patch "015" "12im449abnq5gaqjmdxr5i38kmp02fa8l8wffad3jryvd58r0wzg")
+]
diff --git a/nixpkgs/pkgs/shells/bash/bash-completion/default.nix b/nixpkgs/pkgs/shells/bash/bash-completion/default.nix
new file mode 100644
index 000000000000..a909d9461e74
--- /dev/null
+++ b/nixpkgs/pkgs/shells/bash/bash-completion/default.nix
@@ -0,0 +1,74 @@
+{ lib, stdenv, fetchurl
+, fetchpatch
+, autoreconfHook
+, perl
+, ps
+, python3Packages
+, bashInteractive
+}:
+
+stdenv.mkDerivation rec {
+  pname = "bash-completion";
+  version = "2.11";
+
+  # Using fetchurl because fetchGithub or fetchzip will have trouble on
+  # e.g. APFS filesystems (macOS) because of non UTF-8 characters in some of the
+  # test fixtures that are part of the repository.
+  # See discussion in https://github.com/NixOS/nixpkgs/issues/107768
+  src = fetchurl {
+    url = "https://github.com/scop/${pname}/releases/download/${version}/${pname}-${version}.tar.xz";
+    sha256 = "1b0iz7da1sgifx1a5wdyx1kxbzys53v0kyk8nhxfipllmm5qka3k";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ autoreconfHook ];
+
+  # tests are super flaky unfortunately, and regularly break.
+  # let's disable them for now.
+  doCheck = false;
+  nativeCheckInputs = [
+    # perl is assumed by perldoc completion
+    perl
+    # ps assumed to exist by gdb, killall, pgrep, pidof,
+    # pkill, pwdx, renice, and reptyr completions
+    ps
+    python3Packages.pexpect
+    python3Packages.pytest
+    bashInteractive
+  ];
+
+  # - ignore test_gcc on ARM because it assumes -march=native
+  # - ignore test_chsh because it assumes /etc/shells exists
+  # - ignore test_ether_wake, test_ifdown, test_ifstat, test_ifup,
+  #   test_iperf, test_iperf3, test_nethogs and ip_addresses
+  #   because they try to touch network
+  # - ignore test_ls because impure logic
+  # - ignore test_screen because it assumes vt terminals exist
+  checkPhase = ''
+    pytest . \
+      ${lib.optionalString stdenv.hostPlatform.isAarch "--ignore=test/t/test_gcc.py"} \
+      --ignore=test/t/test_chsh.py \
+      --ignore=test/t/test_ether_wake.py \
+      --ignore=test/t/test_ifdown.py \
+      --ignore=test/t/test_ifstat.py \
+      --ignore=test/t/test_ifup.py \
+      --ignore=test/t/test_iperf.py \
+      --ignore=test/t/test_iperf3.py \
+      --ignore=test/t/test_nethogs.py \
+      --ignore=test/t/unit/test_unit_ip_addresses.py \
+      --ignore=test/t/test_ls.py \
+      --ignore=test/t/test_screen.py
+  '';
+
+  prePatch = lib.optionalString stdenv.isDarwin ''
+    sed -i -e 's/readlink -f/readlink/g' bash_completion completions/*
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/scop/bash-completion";
+    description = "Programmable completion for the bash shell";
+    license = licenses.gpl2Plus;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/bash/blesh/default.nix b/nixpkgs/pkgs/shells/bash/blesh/default.nix
new file mode 100644
index 000000000000..9428703e7a2d
--- /dev/null
+++ b/nixpkgs/pkgs/shells/bash/blesh/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, stdenvNoCC
+, fetchzip
+, runtimeShell
+, bashInteractive
+, glibcLocales
+}:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "blesh";
+  version = "0.4.0-devel3";
+
+  src = fetchzip {
+    url = "https://github.com/akinomyoga/ble.sh/releases/download/v${version}/ble-${version}.tar.xz";
+    sha256 = "sha256-kGLp8RaInYSrJEi3h5kWEOMAbZV/gEPFUjOLgBuMhCI=";
+  };
+
+  dontBuild = true;
+
+  doCheck = true;
+  nativeCheckInputs = [ bashInteractive glibcLocales ];
+  preCheck = "export LC_ALL=en_US.UTF-8";
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p "$out/share/blesh/lib"
+
+    cat <<EOF >"$out/share/blesh/lib/_package.sh"
+    _ble_base_package_type=nix
+
+    function ble/base/package:nix/update {
+      echo "Ble.sh is installed by Nix. You can update it there." >&2
+      return 1
+    }
+    EOF
+
+    cp -rv $src/* $out/share/blesh
+
+    runHook postInstall
+  '';
+
+  postInstall = ''
+    mkdir -p "$out/bin"
+    cat <<EOF >"$out/bin/blesh-share"
+    #!${runtimeShell}
+    # Run this script to find the ble.sh shared folder
+    # where all the shell scripts are living.
+    echo "$out/share/blesh"
+    EOF
+    chmod +x "$out/bin/blesh-share"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/akinomyoga/ble.sh";
+    description = "Bash Line Editor -- a full-featured line editor written in pure Bash";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ aiotter ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/bash/fzf-obc/default.nix b/nixpkgs/pkgs/shells/bash/fzf-obc/default.nix
new file mode 100644
index 000000000000..7621ae8c73c0
--- /dev/null
+++ b/nixpkgs/pkgs/shells/bash/fzf-obc/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "fzf-obc";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "rockandska";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-KIAlDpt1Udl+RLp3728utgQ9FCjZz/OyoG92MOJmgPI=";
+  };
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/share/fzf-obc/{bin,lib/fzf-obc,plugins/{kill,gradle}}
+    install -m644 bin/* $out/share/fzf-obc/bin
+    install -m644 lib/fzf-obc/* $out/share/fzf-obc/lib/fzf-obc
+    install -m644 plugins/kill/* $out/share/fzf-obc/plugins/kill
+    install -m644 plugins/gradle/* $out/share/fzf-obc/plugins/gradle
+  '';
+
+  meta = with lib; {
+    homepage = "https://fzf-obc.readthedocs.io";
+    description = "Completion script adding fzf over all know bash completion functions";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ loicreynier ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/bash/nix-bash-completions/default.nix b/nixpkgs/pkgs/shells/bash/nix-bash-completions/default.nix
new file mode 100644
index 000000000000..af516a1bcaa5
--- /dev/null
+++ b/nixpkgs/pkgs/shells/bash/nix-bash-completions/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  version = "0.6.8";
+  pname = "nix-bash-completions";
+
+  src = fetchFromGitHub {
+    owner = "hedning";
+    repo = "nix-bash-completions";
+    rev = "v${version}";
+    sha256 = "1n5zs6xcnv4bv1hdaypmz7fv4j7dsr4a0ifah99iyj4p5j85i1bc";
+  };
+
+  postPatch = ''
+    # Nix 2.4+ provides its own completion for the nix command, see https://github.com/hedning/nix-bash-completions/issues/20
+    substituteInPlace _nix --replace 'nix nixos-option' 'nixos-option'
+  '';
+
+  strictDeps = true;
+  # To enable lazy loading via bash-completion we need a symlink to the script
+  # from every command name.
+  installPhase = ''
+    runHook preInstall
+
+    commands=$(
+      function complete() { shift 2; echo "$@"; }
+      shopt -s extglob
+      source _nix
+    )
+    install -Dm444 -t $out/share/bash-completion/completions _nix
+    cd $out/share/bash-completion/completions
+    for c in $commands; do
+      ln -s _nix $c
+    done
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/hedning/nix-bash-completions";
+    description = "Bash completions for Nix, NixOS, and NixOps";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ hedning ncfavier ];
+    # Set a lower priority such that Nix wins in case of conflicts.
+    priority = 10;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/bash/parallel.patch b/nixpkgs/pkgs/shells/bash/parallel.patch
new file mode 100644
index 000000000000..d9a0cc28ce04
--- /dev/null
+++ b/nixpkgs/pkgs/shells/bash/parallel.patch
@@ -0,0 +1,12 @@
+From https://savannah.gnu.org/patch/index.php?10373
+  https://savannah.gnu.org/patch/download.php?file_id=54964
+--- Makefile.in
++++ Makefile.in
+@@ -1432,6 +1432,7 @@ siglist.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
+ subst.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
+ test.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
+ trap.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
++unwind_prot.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
+ variables.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
+ version.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
+ xmalloc.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
diff --git a/nixpkgs/pkgs/shells/bash/pgrp-pipe-5.patch b/nixpkgs/pkgs/shells/bash/pgrp-pipe-5.patch
new file mode 100644
index 000000000000..71b397901cb0
--- /dev/null
+++ b/nixpkgs/pkgs/shells/bash/pgrp-pipe-5.patch
@@ -0,0 +1,15 @@
+--- ./configure	2022-12-20 17:13:17.804045620 +0100
++++ ./configure-fixed	2022-12-20 17:16:00.444114824 +0100
+@@ -21723,11 +21723,7 @@
+ solaris2*)	LOCAL_CFLAGS=-DSOLARIS ;;
+ lynxos*)	LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
+ linux*)		LOCAL_LDFLAGS=-rdynamic		 # allow dynamic loading
+-		case "`uname -r`" in
+-		1.*|2.[0123]*)	: ;;
+-		*)	printf "%s\n" "#define PGRP_PIPE 1" >>confdefs.h
+- ;;
+-		esac ;;
++		printf "%s\n" "#define PGRP_PIPE 1" >>confdefs.h ;;
+ netbsd*|openbsd*)	LOCAL_CFLAGS="-DDEV_FD_STAT_BROKEN" ;;
+ freebsd*|midnightbsd*)	LOCAL_CFLAGS='-DHEREDOC_PIPESIZE=4096' ;;
+ *qnx[67]*)	LOCAL_LIBS="-lncurses" ;;
diff --git a/nixpkgs/pkgs/shells/bash/undistract-me/default.nix b/nixpkgs/pkgs/shells/bash/undistract-me/default.nix
new file mode 100644
index 000000000000..b15903e779ea
--- /dev/null
+++ b/nixpkgs/pkgs/shells/bash/undistract-me/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, stdenvNoCC
+, fetchFromGitHub
+, fetchpatch
+, coreutils
+, gnused
+, libnotify
+, pulseaudio
+, sound-theme-freedesktop
+, xprop
+}:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "undistract-me";
+  version = "unstable-2020-08-09";
+
+  src = fetchFromGitHub {
+    owner = "jml";
+    repo = pname;
+    rev = "2f8ac25c6ad8efcf160d2b480825b1cbb6772aab";
+    hash = "sha256-Qw7Cu9q0ZgK/RTvyDdHM5N3eBaKjtYqYH0J+hKMUZX8=";
+  };
+
+  patches = [
+    # Don't block the terminal when notification sound is played
+    #
+    # See https://github.com/jml/undistract-me/pull/69
+    (fetchpatch {
+      url = "https://github.com/jml/undistract-me/commit/2356ebbe8bf2bcb4b95af1ae2bcdc786ce7cc6e8.patch";
+      sha256 = "sha256-Ij3OXTOnIQsYhKVmqjChhN1q4ASZ7waOkfQTTp5XfPo=";
+    })
+
+    # Fix showing notifications when using Wayland apps with XWayland
+    # running, or connection to X server fails.
+    #
+    # NOTE: Without a real X server, notifications will not be
+    # suppressed when the window running the command is focused.
+    #
+    # See https://github.com/jml/undistract-me/pull/71
+    (fetchpatch {
+      url = "https://github.com/jml/undistract-me/commit/3f4ceaf5a4eba8e3cb02236c48247f87e3d1124f.patch";
+      sha256 = "sha256-9AK9Jp3TXJ75Y+jwZXlwQ6j54FW1rOBddoktrm0VX68=";
+    })
+  ];
+
+  strictDeps = true;
+
+  # Patch in dependencies. Can't use makeWrapper because the bash
+  # functions will be sourced and invoked in a different environment
+  # for each command invocation.
+  postPatch = ''
+    for script in *.bash *.sh; do
+      substituteInPlace "$script" \
+        --replace /usr/share/undistract-me "$out/share/undistract-me" \
+        --replace basename ${coreutils}/bin/basename \
+        --replace 'cut ' '${coreutils}/bin/cut ' \
+        --replace date ${coreutils}/bin/date \
+        --replace dirname ${coreutils}/bin/dirname \
+        --replace sed ${gnused}/bin/sed \
+        --replace notify-send ${libnotify}/bin/notify-send \
+        --replace paplay ${pulseaudio}/bin/paplay \
+        --replace /usr/share/sounds/freedesktop ${sound-theme-freedesktop}/share/sounds/freedesktop \
+        --replace xprop ${xprop}/bin/xprop
+    done
+  '';
+
+  installPhase = ''
+    mkdir -p "$out/share/undistract-me" "$out/etc/profile.d" "$out/share/licenses/undistract-me"
+    cp long-running.bash "$out/share/undistract-me"
+    cp preexec.bash "$out/share/undistract-me"
+    cp undistract-me.sh "$out/etc/profile.d"
+    cp LICENSE "$out/share/licenses/undistract-me"
+  '';
+
+  meta = with lib; {
+    description = "Notifies you when long-running terminal commands complete";
+    homepage = "https://github.com/jml/undistract-me";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kira-bruneau ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/bash/update-patch-set.sh b/nixpkgs/pkgs/shells/bash/update-patch-set.sh
new file mode 100755
index 000000000000..ee785cc83123
--- /dev/null
+++ b/nixpkgs/pkgs/shells/bash/update-patch-set.sh
@@ -0,0 +1,52 @@
+#!/usr/bin/env nix-shell
+#!nix-shell --pure -i bash -p wget -p gnupg -p cacert -p nix
+
+# Update patch set for GNU Bash or Readline.
+
+if [ $# -ne 2 ]
+then
+    echo "Usage: $(basename "$0") PROJECT VERSION"
+    echo ""
+    echo "Update the patch set for PROJECT (one of \`bash' or \`readline') for"
+    echo "the given version (e.g., \`4.0').  Produce \`PROJECT-patches.nix'."
+    exit 1
+fi
+
+PROJECT="$1"
+VERSION="$2"
+DIR=$(dirname "$0")
+VERSION_CONDENSED="$(echo "$VERSION" | sed -es/\\.//g)"
+PATCH_LIST="$DIR/$PROJECT-$VERSION-patches.nix"
+
+set -e
+
+rm -vf "$PATCH_LIST"
+
+wget "https://tiswww.case.edu/php/chet/gpgkey.asc"
+echo "4ef5051ce7200241e65d29c11eb57df8  gpgkey.asc" > gpgkey.asc.md5
+md5sum -c gpgkey.asc.md5
+gpg --import ./gpgkey.asc
+rm gpgkey.asc{,.md5}
+
+( echo "# Automatically generated by \`$(basename "$0")'; do not edit." ;	\
+  echo "" ;								\
+  echo "patch: [" )							\
+>> "$PATCH_LIST"
+
+for i in {001..100}
+do
+    wget -P "$DIR" "ftp.gnu.org/gnu/$PROJECT/$PROJECT-$VERSION-patches/$PROJECT$VERSION_CONDENSED-$i" || break
+    wget -P "$DIR" "ftp.gnu.org/gnu/$PROJECT/$PROJECT-$VERSION-patches/$PROJECT$VERSION_CONDENSED-$i.sig"
+    gpg --verify "$DIR/$PROJECT$VERSION_CONDENSED-$i.sig"
+    hash=$(nix-hash --flat --type sha256 --base32 "$DIR/$PROJECT$VERSION_CONDENSED-$i")
+    echo "(patch \"$i\" \"$hash\")"	\
+    >> "$PATCH_LIST"
+
+    rm -f "$DIR/$PROJECT$VERSION_CONDENSED-$i"{,.sig}
+done
+
+echo "]" >> "$PATCH_LIST"
+
+# bash interprets numbers starting with 0 as octals
+echo "Got $((10#$i - 1)) patches."
+echo "Patch list has been written to \`$PATCH_LIST'."
diff --git a/nixpkgs/pkgs/shells/bash/yarn-completion/default.nix b/nixpkgs/pkgs/shells/bash/yarn-completion/default.nix
new file mode 100644
index 000000000000..48d1f42b5ced
--- /dev/null
+++ b/nixpkgs/pkgs/shells/bash/yarn-completion/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, installShellFiles
+}:
+
+stdenv.mkDerivation rec {
+  pname = "yarn-bash-completion";
+  version = "0.17.0";
+
+  src = fetchFromGitHub {
+    owner = "dsifford";
+    repo = "yarn-completion";
+    rev = "v${version}";
+    sha256 = "0xflbrbwskjqv3knvc8jqygpvfxh5ak66q7w22d1ng8gwrfqzcng";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ installShellFiles ];
+
+  installPhase = ''
+    runHook preInstall
+
+    installShellCompletion --cmd yarn ./yarn-completion.bash
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/dsifford/yarn-completion/";
+    description = "Bash completion for Yarn";
+    license = licenses.mit;
+    maintainers = with maintainers; [ DamienCassou ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/carapace/default.nix b/nixpkgs/pkgs/shells/carapace/default.nix
new file mode 100644
index 000000000000..0d50270dafdc
--- /dev/null
+++ b/nixpkgs/pkgs/shells/carapace/default.nix
@@ -0,0 +1,39 @@
+{ lib, buildGoModule, fetchFromGitHub, testers, carapace }:
+
+buildGoModule rec {
+  pname = "carapace";
+  version = "0.28.2";
+
+  src = fetchFromGitHub {
+    owner = "rsteube";
+    repo = "${pname}-bin";
+    rev = "v${version}";
+    hash = "sha256-ojcQ69FxU7luxYzKxnblwQgX0sapFJS8YNalMdTuzCo=";
+  };
+
+  vendorHash = "sha256-jbKF68fPwMigKSoSOP6pJMjn+PW2yeI/oZKv2ytoHuY=";
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X main.version=${version}"
+  ];
+
+  subPackages = [ "./cmd/carapace" ];
+
+  tags = [ "release" ];
+
+  preBuild = ''
+    go generate ./...
+  '';
+
+  passthru.tests.version = testers.testVersion { package = carapace; };
+
+  meta = with lib; {
+    description = "Multi-shell multi-command argument completer";
+    homepage = "https://rsteube.github.io/carapace-bin/";
+    maintainers = with maintainers; [ star-szr ];
+    license = licenses.mit;
+    mainProgram = "carapace";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/dash/default.nix b/nixpkgs/pkgs/shells/dash/default.nix
new file mode 100644
index 000000000000..6bdbd1798e3d
--- /dev/null
+++ b/nixpkgs/pkgs/shells/dash/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, stdenv
+, buildPackages
+, pkg-config
+, fetchurl
+, libedit
+, runCommand
+, dash
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "dash";
+  version = "0.5.12";
+
+  src = fetchurl {
+    url = "http://gondor.apana.org.au/~herbert/dash/files/dash-${finalAttrs.version}.tar.gz";
+    hash = "sha256-akdKxG6LCzKRbExg32lMggWNMpfYs4W3RQgDDKSo8oo=";
+  };
+
+  strictDeps = true;
+
+  nativeBuildInputs = lib.optionals stdenv.hostPlatform.isStatic [ pkg-config ];
+
+  depsBuildBuild = [ buildPackages.stdenv.cc ];
+  buildInputs = [ libedit ];
+
+  configureFlags = [ "--with-libedit" ];
+  preConfigure = lib.optional stdenv.hostPlatform.isStatic ''
+    export LIBS="$(''${PKG_CONFIG:-pkg-config} --libs --static libedit)"
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    shellPath = "/bin/dash";
+    tests = {
+      "execute-simple-command" = runCommand "dash-execute-simple-command" { } ''
+        mkdir $out
+        ${lib.getExe dash} -c 'echo "Hello World!" > $out/success'
+        [ -s $out/success ]
+        grep -q "Hello World" $out/success
+      '';
+    };
+  };
+
+  meta = with lib; {
+    homepage = "http://gondor.apana.org.au/~herbert/dash/";
+    description = "A POSIX-compliant implementation of /bin/sh that aims to be as small as possible";
+    platforms = platforms.unix;
+    license = with licenses; [ bsd3 gpl2 ];
+    mainProgram = "dash";
+  };
+})
diff --git a/nixpkgs/pkgs/shells/dgsh/default.nix b/nixpkgs/pkgs/shells/dgsh/default.nix
new file mode 100644
index 000000000000..2c98938b46d7
--- /dev/null
+++ b/nixpkgs/pkgs/shells/dgsh/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, fetchFromGitHub, autoconf, automake, pkg-config,
+  libtool, check, bison, git, gperf,
+  perl, texinfo, help2man, gettext, ncurses
+}:
+
+stdenv.mkDerivation {
+  pname = "dgsh-unstable";
+  version = "2017-02-05";
+
+  src = fetchFromGitHub {
+    owner = "dspinellis";
+    repo = "dgsh";
+    rev = "bc4fc2e8009c069ee4df5140c32a2fc15d0acdec";
+    sha256 = "0k3hmnarz56wphw45mabn5zcc427l5p77jldh1qqy89pxqy1wnql";
+    fetchSubmodules = true;
+  };
+
+  patches = [ ./glibc-2.26.patch ];
+
+  nativeBuildInputs = [ autoconf automake pkg-config libtool check
+    bison git gettext gperf perl texinfo help2man ncurses
+  ];
+
+  configurePhase = ''
+    cp -r ./unix-tools/coreutils/gnulib gnulib
+    perl -pi -e \
+      's#./bootstrap #./bootstrap --no-bootstrap-sync --skip-po --no-git --gnulib-srcdir='$PWD/gnulib' #g' \
+      unix-tools/Makefile
+    find . -name \*.diff | xargs rm -f
+    rm -rf unix-tools/*/gnulib
+    patchShebangs unix-tools/diffutils/man/help2man
+    export RSYNC=true # set to rsync binary, eventhough it is not used.
+    make PREFIX=$out config
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "The Directed Graph Shell";
+    homepage = "http://www.dmst.aueb.gr/dds/sw/dgsh";
+    license = with licenses; asl20;
+    maintainers = with maintainers; [ vrthra ];
+    platforms = with platforms; all;
+    # lib/freadseek.c:68:3: error: #error "Please port gnulib freadseek.c to your platform! Look at the definition of getc, getc_unlocked on your >
+    # 68 |  #error "Please port gnulib freadseek.c to your platform! Look at the definition of getc, getc_unlocked on your system, then report >
+    broken = true; # marked 2022-05-06
+  };
+}
diff --git a/nixpkgs/pkgs/shells/dgsh/glibc-2.26.patch b/nixpkgs/pkgs/shells/dgsh/glibc-2.26.patch
new file mode 100644
index 000000000000..c66768151316
--- /dev/null
+++ b/nixpkgs/pkgs/shells/dgsh/glibc-2.26.patch
@@ -0,0 +1,12 @@
+diff --git a/core-tools/src/dgsh-httpval.c b/core-tools/src/dgsh-httpval.c
+index 8b5dce3..7b43c3d 100644
+--- a/core-tools/src/dgsh-httpval.c
++++ b/core-tools/src/dgsh-httpval.c
+@@ -40,6 +40,7 @@
+ #include <sys/stat.h>
+ #include <unistd.h>
+ #include <stdlib.h>
++#include <stdint.h>
+ #include <stdio.h>
+ #include <string.h>
+ #include <ctype.h>
diff --git a/nixpkgs/pkgs/shells/es/default.nix b/nixpkgs/pkgs/shells/es/default.nix
new file mode 100644
index 000000000000..308a684e6f68
--- /dev/null
+++ b/nixpkgs/pkgs/shells/es/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchurl, readline, bison }:
+
+stdenv.mkDerivation rec {
+
+  pname = "es";
+  version = "0.9.2";
+
+  src = fetchurl {
+    url = "https://github.com/wryun/es-shell/releases/download/v${version}/es-${version}.tar.gz";
+    sha256 = "sha256-ySZIK0IITpA+uHHuHrDO/Ana5vGt64QI3Z6TMDXE9d0=";
+  };
+
+  # The distribution tarball does not have a single top-level directory.
+  preUnpack = ''
+    mkdir $name
+    cd $name
+    sourceRoot=.
+  '';
+
+  strictDeps = true;
+  nativeBuildInputs = [ bison ];
+  buildInputs = [ readline ];
+
+  configureFlags = [ "--with-readline" ];
+
+  meta = with lib; {
+    description = "An extensible shell with higher order functions";
+    longDescription =
+      ''
+        Es is an extensible shell. The language was derived
+        from the Plan 9 shell, rc, and was influenced by
+        functional programming languages, such as Scheme,
+        and the Tcl embeddable programming language.
+      '';
+    homepage = "http://wryun.github.io/es-shell/";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ sjmackenzie ttuegel ];
+    platforms = platforms.all;
+  };
+
+  passthru = {
+    shellPath = "/bin/es";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/babelfish.nix b/nixpkgs/pkgs/shells/fish/babelfish.nix
new file mode 100644
index 000000000000..9af0c2ce9138
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/babelfish.nix
@@ -0,0 +1,21 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+buildGoModule rec {
+  pname = "babelfish";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "bouk";
+    repo = "babelfish";
+    rev = "v${version}";
+    sha256 = "sha256-/rWX77n9wqWxkHG7gVOinCJ6ahuEfbAcGijC1oAxrno=";
+  };
+
+  vendorHash = "sha256-HY9ejLfT6gj3vUMSzbNZ4QlpB+liigTtNDBNWCy8X38=";
+
+  meta = with lib; {
+    description = "Translate bash scripts to fish";
+    homepage = "https://github.com/bouk/babelfish";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bouk kevingriffin ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/default.nix b/nixpkgs/pkgs/shells/fish/default.nix
new file mode 100644
index 000000000000..1fa5b9c6151a
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/default.nix
@@ -0,0 +1,345 @@
+{ stdenv
+, lib
+, fetchurl
+, fetchpatch
+, coreutils
+, which
+, gnused
+, gnugrep
+, groff
+, gawk
+, man-db
+, getent
+, libiconv
+, pcre2
+, gettext
+, ncurses
+, python3
+, cmake
+, fishPlugins
+, procps
+
+# used to generate autocompletions from manpages and for configuration editing in the browser
+, usePython ? true
+
+, runCommand
+, writeText
+, nixosTests
+, nix-update-script
+, useOperatingSystemEtc ? true
+  # An optional string containing Fish code that initializes the environment.
+  # This is run at the very beginning of initialization. If it sets $NIX_PROFILES
+  # then Fish will use that to configure its function, completion, and conf.d paths.
+  # For example:
+  #   fishEnvPreInit = "source /etc/fish/my-env-preinit.fish";
+  # It can also be a function that takes one argument, which is a function that
+  # takes a path to a bash file and converts it to fish. For example:
+  #   fishEnvPreInit = source: source "${nix}/etc/profile.d/nix-daemon.sh";
+, fishEnvPreInit ? null
+}:
+let
+  etcConfigAppendix = writeText "config.fish.appendix" ''
+    ############### ↓ Nix hook for sourcing /etc/fish/config.fish ↓ ###############
+    #                                                                             #
+    # Origin:
+    #     This fish package was called with the attribute
+    #     "useOperatingSystemEtc = true;".
+    #
+    # Purpose:
+    #     Fish ordinarily sources /etc/fish/config.fish as
+    #        $__fish_sysconfdir/config.fish,
+    #     and $__fish_sysconfdir is defined at compile-time, baked into the C++
+    #     component of fish. By default, it is set to "/etc/fish". When building
+    #     through Nix, $__fish_sysconfdir gets set to $out/etc/fish. Here we may
+    #     have included a custom $out/etc/config.fish in the fish package,
+    #     as specified, but according to the value of useOperatingSystemEtc, we
+    #     may want to further source the real "/etc/fish/config.fish" file.
+    #
+    #     When this option is enabled, this segment should appear the very end of
+    #     "$out/etc/config.fish". This is to emulate the behavior of fish itself
+    #     with respect to /etc/fish/config.fish and ~/.config/fish/config.fish:
+    #     source both, but source the more global configuration files earlier
+    #     than the more local ones, so that more local configurations inherit
+    #     from but override the more global locations.
+    #
+    #     Special care needs to be taken, when fish is called from an FHS user env
+    #     or similar setup, because this configuration file will then be relocated
+    #     to /etc/fish/config.fish, so we test for this case to avoid nontermination.
+
+    if test -f /etc/fish/config.fish && test /etc/fish/config.fish != (status filename)
+      source /etc/fish/config.fish
+    end
+
+    #                                                                             #
+    ############### ↑ Nix hook for sourcing /etc/fish/config.fish ↑ ###############
+  '';
+
+  fishPreInitHooks = writeText "__fish_build_paths_suffix.fish" ''
+    # source nixos environment
+    # note that this is required:
+    #   1. For all shells, not just login shells (mosh needs this as do some other command-line utilities)
+    #   2. Before the shell is initialized, so that config snippets can find the commands they use on the PATH
+    builtin status is-login
+    or test -z "$__fish_nixos_env_preinit_sourced" -a -z "$ETC_PROFILE_SOURCED" -a -z "$ETC_ZSHENV_SOURCED"
+    ${if fishEnvPreInit != null then ''
+    and begin
+    ${lib.removeSuffix "\n" (if lib.isFunction fishEnvPreInit then fishEnvPreInit sourceWithFenv else fishEnvPreInit)}
+    end'' else ''
+    and test -f /etc/fish/nixos-env-preinit.fish
+    and source /etc/fish/nixos-env-preinit.fish''}
+    and set -gx __fish_nixos_env_preinit_sourced 1
+
+    test -n "$NIX_PROFILES"
+    and begin
+      # We ensure that __extra_* variables are read in $__fish_datadir/config.fish
+      # with a preference for user-configured data by making sure the package-specific
+      # data comes last. Files are loaded/sourced in encounter order, duplicate
+      # basenames get skipped, so we assure this by prepending Nix profile paths
+      # (ordered in reverse of the $NIX_PROFILE variable)
+      #
+      # Note that at this point in evaluation, there is nothing whatsoever on the
+      # fish_function_path. That means we don't have most fish builtins, e.g., `eval`.
+
+
+      # additional profiles are expected in order of precedence, which means the reverse of the
+      # NIX_PROFILES variable (same as config.environment.profiles)
+      set -l __nix_profile_paths (string split ' ' $NIX_PROFILES)[-1..1]
+
+      set -p __extra_completionsdir \
+        $__nix_profile_paths"/etc/fish/completions" \
+        $__nix_profile_paths"/share/fish/vendor_completions.d"
+      set -p __extra_functionsdir \
+        $__nix_profile_paths"/etc/fish/functions" \
+        $__nix_profile_paths"/share/fish/vendor_functions.d"
+      set -p __extra_confdir \
+        $__nix_profile_paths"/etc/fish/conf.d" \
+        $__nix_profile_paths"/share/fish/vendor_conf.d"
+    end
+  '';
+
+  # This is wrapped in begin/end in case the user wants to apply redirections.
+  # This does mean the basic usage of sourcing a single file will produce
+  # `begin; begin; …; end; end` but that's ok.
+  sourceWithFenv = path: ''
+    begin # fenv
+      # This happens before $__fish_datadir/config.fish sets fish_function_path, so it is currently
+      # unset. We set it and then completely erase it, leaving its configuration to $__fish_datadir/config.fish
+      set fish_function_path ${fishPlugins.foreign-env}/share/fish/vendor_functions.d $__fish_datadir/functions
+      fenv source ${lib.escapeShellArg path}
+      set -l fenv_status $status
+      # clear fish_function_path so that it will be correctly set when we return to $__fish_datadir/config.fish
+      set -e fish_function_path
+      test $fenv_status -eq 0
+    end # fenv
+  '';
+
+  fish = stdenv.mkDerivation rec {
+    pname = "fish";
+    version = "3.6.1";
+
+    src = fetchurl {
+      # There are differences between the release tarball and the tarball GitHub
+      # packages from the tag. Specifically, it comes with a file containing its
+      # version, which is used in `build_tools/git_version_gen.sh` to determine
+      # the shell's actual version (and what it displays when running `fish
+      # --version`), as well as the local documentation for all builtins (and
+      # maybe other things).
+      url = "https://github.com/fish-shell/fish-shell/releases/download/${version}/${pname}-${version}.tar.xz";
+      hash = "sha256-VUArtHymc52KuiXkF4CQW1zhvOCl4N0X3KkItbwLSbI=";
+    };
+
+    # Fix FHS paths in tests
+    postPatch = ''
+      # src/fish_tests.cpp
+      sed -i 's|/bin/ls|${coreutils}/bin/ls|' src/fish_tests.cpp
+      sed -i 's|is_potential_path(L"/usr"|is_potential_path(L"/nix"|' src/fish_tests.cpp
+      sed -i 's|L"/bin/echo"|L"${coreutils}/bin/echo"|' src/fish_tests.cpp
+      sed -i 's|L"/bin/c"|L"${coreutils}/bin/c"|' src/fish_tests.cpp
+      sed -i 's|L"/bin/ca"|L"${coreutils}/bin/ca"|' src/fish_tests.cpp
+
+      # tests/checks/cd.fish
+      sed -i 's|/bin/pwd|${coreutils}/bin/pwd|' tests/checks/cd.fish
+
+      # tests/checks/redirect.fish
+      sed -i 's|/bin/echo|${coreutils}/bin/echo|' tests/checks/redirect.fish
+
+      # tests/checks/vars_as_commands.fish
+      sed -i 's|/usr/bin|${coreutils}/bin|' tests/checks/vars_as_commands.fish
+
+      # tests/checks/jobs.fish
+      sed -i 's|ps -o stat|${procps}/bin/ps -o stat|' tests/checks/jobs.fish
+      sed -i 's|/bin/echo|${coreutils}/bin/echo|' tests/checks/jobs.fish
+
+      # tests/checks/job-control-noninteractive.fish
+      sed -i 's|/bin/echo|${coreutils}/bin/echo|' tests/checks/job-control-noninteractive.fish
+
+      # tests/checks/complete.fish
+      sed -i 's|/bin/ls|${coreutils}/bin/ls|' tests/checks/complete.fish
+    '' + lib.optionalString stdenv.isDarwin ''
+      # Tests use pkill/pgrep which are currently not built on Darwin
+      # See https://github.com/NixOS/nixpkgs/pull/103180
+      rm tests/pexpects/exit.py
+      rm tests/pexpects/job_summary.py
+      rm tests/pexpects/signals.py
+
+      # pexpect tests are flaky in general
+      # See https://github.com/fish-shell/fish-shell/issues/8789
+      rm tests/pexpects/bind.py
+    '' + lib.optionalString stdenv.isLinux ''
+      # pexpect tests are flaky on aarch64-linux (also x86_64-linux)
+      # See https://github.com/fish-shell/fish-shell/issues/8789
+      rm tests/pexpects/exit_handlers.py
+    '';
+
+    outputs = [ "out" "doc" ];
+    strictDeps = true;
+    nativeBuildInputs = [
+      cmake
+      gettext
+    ];
+
+    buildInputs = [
+      ncurses
+      libiconv
+      pcre2
+    ];
+
+    cmakeFlags = [
+      "-DCMAKE_INSTALL_DOCDIR=${placeholder "doc"}/share/doc/fish"
+    ] ++ lib.optionals stdenv.isDarwin [
+      "-DMAC_CODESIGN_ID=OFF"
+    ];
+
+    # Fish’s test suite needs to be able to look up process information and send signals.
+    sandboxProfile = lib.optionalString stdenv.isDarwin ''
+      (allow mach-lookup mach-task-name)
+      (allow signal (target children))
+    '';
+
+    # The optional string is kind of an inelegant way to get fish to cross compile.
+    # Fish needs coreutils as a runtime dependency, and it gets put into
+    # CMAKE_PREFIX_PATH, which cmake uses to look up build time programs, so it
+    # was clobbering the PATH. It probably needs to be fixed at a lower level.
+    preConfigure = ''
+      patchShebangs ./build_tools/git_version_gen.sh
+    '' + lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
+      export CMAKE_PREFIX_PATH=
+    '';
+
+    # Required binaries during execution
+    propagatedBuildInputs = [
+      coreutils
+      gnugrep
+      gnused
+      groff
+      gettext
+    ] ++ lib.optional (!stdenv.isDarwin) man-db;
+
+    doCheck = true;
+
+    nativeCheckInputs = [
+      coreutils
+      (python3.withPackages (ps: [ ps.pexpect ]))
+      procps
+    ];
+
+    checkPhase = ''
+      make test
+    '';
+
+    postInstall = with lib; ''
+      sed -r "s|command grep|command ${gnugrep}/bin/grep|" \
+          -i "$out/share/fish/functions/grep.fish"
+      sed -e "s|\|cut|\|${coreutils}/bin/cut|"             \
+          -i "$out/share/fish/functions/fish_prompt.fish"
+      sed -e "s|uname|${coreutils}/bin/uname|"             \
+          -i "$out/share/fish/functions/__fish_pwd.fish"   \
+             "$out/share/fish/functions/prompt_pwd.fish"
+      sed -e "s|sed |${gnused}/bin/sed |"                  \
+          -i "$out/share/fish/functions/alias.fish"        \
+             "$out/share/fish/functions/prompt_pwd.fish"
+      sed -i "s|nroff|${groff}/bin/nroff|"                 \
+             "$out/share/fish/functions/__fish_print_help.fish"
+      sed -e "s|clear;|${getBin ncurses}/bin/clear;|"      \
+          -i "$out/share/fish/functions/fish_default_key_bindings.fish"
+      sed -i "s|/usr/local/sbin /sbin /usr/sbin||"         \
+             $out/share/fish/completions/{sudo.fish,doas.fish}
+      sed -e "s| awk | ${gawk}/bin/awk |"                  \
+          -i $out/share/fish/functions/{__fish_print_packages.fish,__fish_print_addresses.fish,__fish_describe_command.fish,__fish_complete_man.fish,__fish_complete_convert_options.fish} \
+             $out/share/fish/completions/{cwebp,adb,ezjail-admin,grunt,helm,heroku,lsusb,make,p4,psql,rmmod,vim-addons}.fish
+
+    '' + optionalString usePython ''
+      cat > $out/share/fish/functions/__fish_anypython.fish <<EOF
+      function __fish_anypython
+          echo ${python3.interpreter}
+          return 0
+      end
+      EOF
+
+    '' + optionalString stdenv.isLinux ''
+      for cur in $out/share/fish/functions/*.fish; do
+        sed -e "s|/usr/bin/getent|${getent}/bin/getent|" \
+            -i "$cur"
+      done
+
+    '' + optionalString (!stdenv.isDarwin) ''
+      sed -i "s|Popen(\['manpath'|Popen(\['${man-db}/bin/manpath'|" \
+              "$out/share/fish/tools/create_manpage_completions.py"
+      sed -i "s|command manpath|command ${man-db}/bin/manpath|"     \
+              "$out/share/fish/functions/man.fish"
+    '' + optionalString useOperatingSystemEtc ''
+      tee -a $out/etc/fish/config.fish < ${etcConfigAppendix}
+    '' + ''
+      tee -a $out/share/fish/__fish_build_paths.fish < ${fishPreInitHooks}
+    '';
+
+    meta = with lib; {
+      description = "Smart and user-friendly command line shell";
+      homepage = "https://fishshell.com/";
+      license = licenses.gpl2;
+      platforms = platforms.unix;
+      maintainers = with maintainers; [ cole-h winter ];
+      mainProgram = "fish";
+    };
+
+    passthru = {
+      shellPath = "/bin/fish";
+      tests = {
+        nixos = nixosTests.fish;
+
+        # Test the fish_config tool by checking the generated splash page.
+        # Since the webserver requires a port to run, it is not started.
+        fishConfig =
+          let fishScript = writeText "test.fish" ''
+            set -x __fish_bin_dir ${fish}/bin
+            echo $__fish_bin_dir
+            cp -r ${fish}/share/fish/tools/web_config/* .
+            chmod -R +w *
+
+            # if we don't set `delete=False`, the file will get cleaned up
+            # automatically (leading the test to fail because there's no
+            # tempfile to check)
+            sed -e 's@, mode="w"@, mode="w", delete=False@' -i webconfig.py
+
+            # we delete everything after the fileurl is assigned
+            sed -e '/fileurl =/q' -i webconfig.py
+            echo "print(fileurl)" >> webconfig.py
+
+            # and check whether the message appears on the page
+            cat (${python3}/bin/python ./webconfig.py \
+              | tail -n1 | sed -ne 's|.*\(/build/.*\)|\1|p' \
+            ) | grep 'a href="http://localhost.*Start the Fish Web config'
+
+            # cannot test the http server because it needs a localhost port
+          '';
+          in
+          runCommand "test-web-config" { } ''
+            HOME=$(mktemp -d)
+            ${fish}/bin/fish ${fishScript} && touch $out
+          '';
+      };
+      updateScript = nix-update-script { };
+    };
+  };
+in
+fish
diff --git a/nixpkgs/pkgs/shells/fish/oh-my-fish/default.nix b/nixpkgs/pkgs/shells/fish/oh-my-fish/default.nix
new file mode 100644
index 000000000000..6c09599972d1
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/oh-my-fish/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fish
+, runtimeShell
+, writeShellScript
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "oh-my-fish";
+  version = "unstable-2022-03-27";
+
+  src = fetchFromGitHub {
+    owner = finalAttrs.pname;
+    repo = finalAttrs.pname;
+    rev = "d428b723c8c18fef3b2a00b8b8b731177f483ad8";
+    hash = "sha256-msItKEPe7uSUpDAfCfdYZjt5NyfM3KtOrLUTO9NGqlg=";
+  };
+
+  strictDeps = true;
+  buildInputs = [
+    fish
+  ];
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -pv $out/bin $out/share/${finalAttrs.pname}
+    cp -vr * $out/share/${finalAttrs.pname}
+
+    cat << EOF > $out/bin/omf-install
+    #!${runtimeShell}
+
+    ${fish}/bin/fish \\
+      $out/share/${finalAttrs.pname}/bin/install \\
+      --noninteractive \\
+      --offline=$out/share/${finalAttrs.pname}
+
+    EOF
+    chmod +x $out/bin/omf-install
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/oh-my-fish/oh-my-fish";
+    description = "The Fish Shell Framework";
+    longDescription = ''
+      Oh My Fish provides core infrastructure to allow you to install packages
+      which extend or modify the look of your shell. It's fast, extensible and
+      easy to use.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ AndersonTorres ];
+    mainProgram = "omf-install";
+    platforms = fish.meta.platforms;
+  };
+})
+# TODO: customize the omf-install script
diff --git a/nixpkgs/pkgs/shells/fish/plugins/async-prompt.nix b/nixpkgs/pkgs/shells/fish/plugins/async-prompt.nix
new file mode 100644
index 000000000000..ff3a1e6d9891
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/async-prompt.nix
@@ -0,0 +1,20 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "async-prompt";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "acomagu";
+    repo = "fish-async-prompt";
+    rev = "v${version}";
+    hash = "sha256-B7Ze0a5Zp+5JVsQUOv97mKHh5wiv3ejsDhJMrK7YOx4=";
+  };
+
+  meta = with lib; {
+    description = "Make your prompt asynchronous to improve the reactivity";
+    homepage = "https://github.com/acomagu/fish-async-prompt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/autopair.nix b/nixpkgs/pkgs/shells/fish/plugins/autopair.nix
new file mode 100644
index 000000000000..50b5a30b1d93
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/autopair.nix
@@ -0,0 +1,20 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "autopair";
+  version = "1.0.4";
+
+  src = fetchFromGitHub {
+    owner = "jorgebucaran";
+    repo = "autopair.fish";
+    rev = version;
+    sha256 = "sha256-s1o188TlwpUQEN3X5MxUlD/2CFCpEkWu83U9O+wg3VU=";
+  };
+
+  meta = with lib; {
+    description = "Auto-complete matching pairs in the Fish command line";
+    homepage = "https://github.com/jorgebucaran/autopair.fish";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda kidonng thehedgeh0g ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/bass.nix b/nixpkgs/pkgs/shells/fish/plugins/bass.nix
new file mode 100644
index 000000000000..35b36e29d544
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/bass.nix
@@ -0,0 +1,30 @@
+{ lib, buildFishPlugin, fetchFromGitHub, python3 }:
+
+buildFishPlugin rec {
+  pname = "bass";
+  version = "unstable-2021-02-18";
+
+  src = fetchFromGitHub {
+    owner = "edc";
+    repo = pname;
+    rev = "2fd3d2157d5271ca3575b13daec975ca4c10577a";
+    sha256 = "0mb01y1d0g8ilsr5m8a71j6xmqlyhf8w4xjf00wkk8k41cz3ypky";
+  };
+
+  #buildFishplugin will only move the .fish files, but bass also relies on python
+  postInstall = ''
+    cp functions/__bass.py $out/share/fish/vendor_functions.d/
+  '';
+
+  nativeCheckInputs = [ python3 ];
+  checkPhase = ''
+    make test
+  '';
+
+  meta = with lib; {
+    description = "Fish function making it easy to use utilities written for Bash in Fish shell";
+    homepage = "https://github.com/edc/bass";
+    license = licenses.mit;
+    maintainers = with maintainers; [ beezow ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/bobthefish.nix b/nixpkgs/pkgs/shells/fish/plugins/bobthefish.nix
new file mode 100644
index 000000000000..417ac87257a7
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/bobthefish.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildFishPlugin
+, fetchFromGitHub
+,
+}:
+buildFishPlugin {
+  pname = "bobthefish";
+  version = "unstable-2023-06-16";
+
+  src = fetchFromGitHub {
+    owner = "oh-my-fish";
+    repo = "theme-bobthefish";
+    rev = "c2c47dc964a257131b3df2a127c2631b4760f3ec";
+    sha256 = "sha256-LB4g+EA3C7OxTuHfcxfgl8IVBe5NufFc+5z9VcS0Bt0=";
+  };
+
+  meta = with lib; {
+    description = "A Powerline-style, Git-aware fish theme optimized for awesome";
+    homepage = "https://github.com/oh-my-fish/theme-bobthefish";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Scrumplex ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/bobthefisher.nix b/nixpkgs/pkgs/shells/fish/plugins/bobthefisher.nix
new file mode 100644
index 000000000000..56d179cd24b5
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/bobthefisher.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildFishPlugin
+, fetchFromGitHub
+,
+}:
+buildFishPlugin {
+  pname = "bobthefisher";
+  version = "unstable-2023-10-25";
+
+  src = fetchFromGitHub {
+    owner = "Scrumplex";
+    repo = "bobthefisher";
+    rev = "f4179a14b087c7fbfc2e892da429adad40a39e44";
+    sha256 = "sha256-l1DHSZa40BX2/4GCjm5E53UOeFEnMioWbZtCW14WX6k=";
+  };
+
+  meta = with lib; {
+    description = "A Powerline-style, Git-aware fish theme optimized for awesome (fork of bobthefish)";
+    homepage = "https://github.com/Scrumplex/bobthefisher";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Scrumplex ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/build-fish-plugin.nix b/nixpkgs/pkgs/shells/fish/plugins/build-fish-plugin.nix
new file mode 100644
index 000000000000..807d5835f1ee
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/build-fish-plugin.nix
@@ -0,0 +1,75 @@
+{ stdenv, lib, writeScript, wrapFish }:
+
+attrs@{
+  pname,
+  version,
+  src,
+
+  name ? "fishplugin-${pname}-${version}",
+  unpackPhase ? "",
+  configurePhase ? ":",
+  buildPhase ? ":",
+  preInstall ? "",
+  postInstall ? "",
+
+  nativeCheckInputs ? [],
+  # plugin packages to add to the vendor paths of the test fish shell
+  checkPlugins ? [],
+  # vendor directories to add to the function path of the test fish shell
+  checkFunctionDirs ? [],
+  # test script to be executed in a fish shell
+  checkPhase ? "",
+  doCheck ? checkPhase != "",
+
+  ...
+}:
+
+let
+  # Do not pass attributes that are only relevant to buildFishPlugin to mkDerivation.
+  drvAttrs = builtins.removeAttrs attrs [
+    "checkPlugins"
+    "checkFunctionDirs"
+  ];
+in
+
+stdenv.mkDerivation (drvAttrs // {
+  inherit name;
+  inherit unpackPhase configurePhase buildPhase;
+
+  inherit preInstall postInstall;
+  installPhase = ''
+    runHook preInstall
+
+    (
+      install_vendor_files() {
+        source="$1"
+        target="$out/share/fish/vendor_$2.d"
+
+        # Check if any .fish file exists in $source
+        [ -n "$(shopt -s nullglob; echo $source/*.fish)" ] || return 0
+
+        mkdir -p $target
+        cp $source/*.fish "$target/"
+      }
+
+      install_vendor_files completions completions
+      install_vendor_files functions functions
+      install_vendor_files conf conf
+      install_vendor_files conf.d conf
+    )
+
+    runHook postInstall
+  '';
+
+  inherit doCheck;
+
+  nativeCheckInputs = [ (wrapFish {
+    pluginPkgs = checkPlugins;
+    functionDirs = checkFunctionDirs;
+  }) ] ++ nativeCheckInputs;
+
+  checkPhase = ''
+    export HOME=$(mktemp -d)  # fish wants a writable home
+    fish "${writeScript "${name}-test" checkPhase}"
+  '';
+})
diff --git a/nixpkgs/pkgs/shells/fish/plugins/clownfish.nix b/nixpkgs/pkgs/shells/fish/plugins/clownfish.nix
new file mode 100644
index 000000000000..cd5c997d3114
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/clownfish.nix
@@ -0,0 +1,20 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin {
+  pname = "clownfish";
+  version = "unstable-2021-01-17";
+
+  src = fetchFromGitHub {
+    owner = "IlanCosman";
+    repo = "clownfish";
+    rev = "a0db28d8280d05561b8f48c0465480725feeca4c";
+    sha256 = "04xvikyrdm6yxh588vbpwvm04fas76pa7sigsaqrip7yh021xxab";
+  };
+
+  meta = with lib; {
+    description = "Fish function to mock the behaviour of commands";
+    homepage = "https://github.com/IlanCosman/clownfish";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pacien ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/colored-man-pages.nix b/nixpkgs/pkgs/shells/fish/plugins/colored-man-pages.nix
new file mode 100644
index 000000000000..435ce6e5c410
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/colored-man-pages.nix
@@ -0,0 +1,20 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "colored-man-pages";
+  version = "unstable-2022-04-30";
+
+  src = fetchFromGitHub {
+    owner = "patrickf1";
+    repo = "colored_man_pages.fish";
+    rev = "f885c2507128b70d6c41b043070a8f399988bc7a";
+    sha256 = "0ifqdbaw09hd1ai0ykhxl8735fcsm0x2fwfzsk7my2z52ds60bwa";
+  };
+
+  meta = with lib; {
+    description = "Fish shell plugin to colorize man pages";
+    homepage = "https://github.com/PatrickF1/colored_man_pages.fish";
+    license = licenses.mit;
+    maintainers = [ maintainers.jocelynthode ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/default.nix b/nixpkgs/pkgs/shells/fish/plugins/default.nix
new file mode 100644
index 000000000000..739e81995233
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/default.nix
@@ -0,0 +1,62 @@
+{ lib, newScope, config }:
+
+lib.makeScope newScope (self: with self; {
+  async-prompt = callPackage ./async-prompt.nix { };
+
+  autopair = callPackage ./autopair.nix { };
+
+  bobthefish = callPackage ./bobthefish.nix { };
+
+  bobthefisher = callPackage ./bobthefisher.nix { };
+
+  buildFishPlugin = callPackage ./build-fish-plugin.nix { };
+
+  colored-man-pages = callPackage ./colored-man-pages.nix { };
+
+  clownfish = callPackage ./clownfish.nix { };
+
+  bass = callPackage ./bass.nix { };
+
+  done = callPackage ./done.nix { };
+
+  # Fishtape 2.x and 3.x aren't compatible,
+  # but both versions are used in the tests of different other plugins.
+  fishtape = callPackage ./fishtape.nix { };
+  fishtape_3 = callPackage ./fishtape_3.nix { };
+
+  foreign-env = callPackage ./foreign-env { };
+
+  forgit = callPackage ./forgit.nix { };
+
+  fzf = callPackage ./fzf.nix { };
+
+  fzf-fish = callPackage ./fzf-fish.nix { };
+
+  github-copilot-cli-fish = callPackage ./github-copilot-cli-fish.nix { };
+
+  grc = callPackage ./grc.nix { };
+
+  humantime-fish = callPackage ./humantime-fish.nix { };
+
+  hydro = callPackage ./hydro.nix { };
+
+  pisces = callPackage ./pisces.nix { };
+
+  plugin-git = callPackage ./plugin-git.nix { };
+
+  puffer = callPackage ./puffer.nix { };
+
+  pure = callPackage ./pure.nix { };
+
+  sdkman-for-fish = callPackage ./sdkman-for-fish.nix { };
+
+  sponge = callPackage ./sponge.nix { };
+
+  tide = callPackage ./tide.nix { };
+
+  wakatime-fish = callPackage ./wakatime-fish.nix { };
+
+  z = callPackage ./z.nix { };
+} // lib.optionalAttrs config.allowAliases {
+  autopair-fish = self.autopair; # Added 2023-03-10
+})
diff --git a/nixpkgs/pkgs/shells/fish/plugins/done.nix b/nixpkgs/pkgs/shells/fish/plugins/done.nix
new file mode 100644
index 000000000000..ad16e257bf62
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/done.nix
@@ -0,0 +1,25 @@
+{ lib, buildFishPlugin, fetchFromGitHub, fishtape }:
+
+buildFishPlugin rec {
+  pname = "done";
+  version = "1.17.1";
+
+  src = fetchFromGitHub {
+    owner = "franciscolourenco";
+    repo = "done";
+    rev = version;
+    hash = "sha256-aYKTkx5v7tB6k/UBcS0NOgA6SiRrjzn1lUTH/Xp5DFM=";
+  };
+
+  checkPlugins = [ fishtape ];
+  checkPhase = ''
+    fishtape test/done.fish
+  '';
+
+  meta = {
+    description = "Automatically receive notifications when long processes finish";
+    homepage = "https://github.com/franciscolourenco/done";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ malo ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/fishtape.nix b/nixpkgs/pkgs/shells/fish/plugins/fishtape.nix
new file mode 100644
index 000000000000..82f2375d5e3f
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/fishtape.nix
@@ -0,0 +1,32 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "fishtape";
+  version = "2.1.3";
+
+  src = fetchFromGitHub {
+    owner = "jorgebucaran";
+    repo = "fishtape";
+    rev = version;
+    sha256 = "0dxcyhs2shhgy5xnwcimqja8vqsyk841x486lgq13i3y1h0kp2kd";
+  };
+
+  checkFunctionDirs = [ "./" ]; # fishtape is introspective
+  checkPhase = ''
+    rm test/tty.fish  # test expects a tty
+    fishtape test/*.fish
+  '';
+
+  preInstall = ''
+    # move the function script in the proper sub-directory
+    mkdir functions
+    mv fishtape.fish functions/
+  '';
+
+  meta = {
+    description = "TAP-based test runner for Fish";
+    homepage = "https://github.com/jorgebucaran/fishtape";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ pacien ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/fishtape_3.nix b/nixpkgs/pkgs/shells/fish/plugins/fishtape_3.nix
new file mode 100644
index 000000000000..893e6d65ffb3
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/fishtape_3.nix
@@ -0,0 +1,25 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "fishtape";
+  version = "3.0.1";
+
+  src = fetchFromGitHub {
+    owner = "jorgebucaran";
+    repo = "fishtape";
+    rev = version;
+    sha256 = "072a3qbk1lpxw53bxp91drsffylx8fbywhss3x0jbnayn9m8i7aa";
+  };
+
+  checkFunctionDirs = [ "./functions" ]; # fishtape is introspective
+  checkPhase = ''
+    fishtape tests/*.fish
+  '';
+
+  meta = with lib; {
+    description = "100% pure-Fish test runner";
+    homepage = "https://github.com/jorgebucaran/fishtape";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pacien ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/foreign-env/default.nix b/nixpkgs/pkgs/shells/fish/plugins/foreign-env/default.nix
new file mode 100644
index 000000000000..d0b5b77a03b1
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/foreign-env/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildFishPlugin, fetchFromGitHub, gnused, bash, coreutils }:
+
+buildFishPlugin {
+  pname = "foreign-env";
+  version = "unstable-2020-02-09";
+
+  src = fetchFromGitHub {
+    owner = "oh-my-fish";
+    repo = "plugin-foreign-env";
+    rev = "dddd9213272a0ab848d474d0cbde12ad034e65bc";
+    sha256 = "00xqlyl3lffc5l0viin1nyp819wf81fncqyz87jx8ljjdhilmgbs";
+  };
+
+  patches = [ ./suppress-harmless-warnings.patch ];
+
+  preInstall = ''
+    sed -e "s|sed|${gnused}/bin/sed|" \
+        -e "s|bash|${bash}/bin/bash|" \
+        -e "s|\| tr|\| ${coreutils}/bin/tr|" \
+        -i functions/*
+  '';
+
+  meta = with lib; {
+    description = "A foreign environment interface for Fish shell";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jgillich ];
+    platforms = with platforms; unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/foreign-env/suppress-harmless-warnings.patch b/nixpkgs/pkgs/shells/fish/plugins/foreign-env/suppress-harmless-warnings.patch
new file mode 100644
index 000000000000..6eed35152120
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/foreign-env/suppress-harmless-warnings.patch
@@ -0,0 +1,23 @@
+diff --git a/functions/fenv.apply.fish b/functions/fenv.apply.fish
+index 34a25e3..3d94135 100644
+--- a/functions/fenv.apply.fish
++++ b/functions/fenv.apply.fish
+@@ -27,11 +27,17 @@ function fenv.apply
+     for variable in $variables
+         set key (echo $variable | sed 's/=.*//')
+         set value (echo $variable | sed 's/[^=]*=//')
++        set ignore PATH _
+ 
+         if test "$key" = 'PATH'
+           set value (echo $value | tr ':' '\n')
+         end
+ 
+-        set -g -x $key $value
++        if contains $key $ignore
++          set -g -x $key $value 2>/dev/null
++        else
++          set -g -x $key $value
++        end
++
+     end
+ end
diff --git a/nixpkgs/pkgs/shells/fish/plugins/forgit.nix b/nixpkgs/pkgs/shells/fish/plugins/forgit.nix
new file mode 100644
index 000000000000..80a40aff0e99
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/forgit.nix
@@ -0,0 +1,24 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "forgit";
+  version = "23.04.0";
+
+  src = fetchFromGitHub {
+    owner = "wfxr";
+    repo = "forgit";
+    rev = version;
+    sha256 = "sha256-3lvYIuzuJw0CQlaAQG6hAyfUgSXM+3BOmKRVDNFUN/U=";
+  };
+
+  postInstall = ''
+    cp -r bin $out/share/fish/vendor_conf.d/
+  '';
+
+  meta = with lib; {
+    description = "A utility tool powered by fzf for using git interactively.";
+    homepage = "https://github.com/wfxr/forgit";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/fzf-fish.nix b/nixpkgs/pkgs/shells/fish/plugins/fzf-fish.nix
new file mode 100644
index 000000000000..073ae04952ec
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/fzf-fish.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, pkgs, buildFishPlugin, fetchFromGitHub, fd, unixtools, procps, clownfish, fishtape_3, }:
+let
+  # we want `pkgs.fzf`, not `fishPlugins.fzf`
+  inherit (pkgs) fzf;
+in
+buildFishPlugin rec {
+  pname = "fzf.fish";
+  version = "10.0";
+
+  src = fetchFromGitHub {
+    owner = "PatrickF1";
+    repo = "fzf.fish";
+    rev = "v${version}";
+    hash = "sha256-CqRSkwNqI/vdxPKrShBykh+eHQq9QIiItD6jWdZ/DSM=";
+  };
+
+  nativeCheckInputs = [ fzf fd unixtools.script procps ];
+  checkPlugins = [ clownfish fishtape_3 ];
+  checkFunctionDirs = [ "./functions" ];
+  checkPhase = ''
+    # Disable git tests which inspect the project's git repo, which isn't
+    # possible since we strip the impure .git from our build input
+    rm -r tests/*git*
+    rm -r tests/preview_changed_file/modified_path_with_spaces.fish
+    rm -r tests/preview_changed_file/renamed_path_modifications.fish
+
+    # Disable tests that are failing, probably because of our wrappers
+    rm -r tests/configure_bindings
+    rm -r tests/search_variables
+
+    # Disable tests that are failing, because there is not 'rev' command
+    rm tests/preview_file/custom_file_preview.fish
+  '' + (
+    if stdenv.isDarwin then ''script /dev/null fish -c "fishtape tests/*/*.fish"''
+    else ''script -c 'fish -c "fishtape tests/*/*.fish"' ''
+  );
+
+  meta = with lib; {
+    description = "Augment your fish command line with fzf key bindings";
+    homepage = "https://github.com/PatrickF1/fzf.fish";
+    changelog = "https://github.com/PatrickF1/fzf.fish/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pacien natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/fzf.nix b/nixpkgs/pkgs/shells/fish/plugins/fzf.nix
new file mode 100644
index 000000000000..fa7e33da6a74
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/fzf.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildFishPlugin
+, fetchFromGitHub
+,
+}:
+buildFishPlugin rec {
+  pname = "fzf";
+  version = "unstable-2021-05-12";
+
+  src = fetchFromGitHub {
+    owner = "jethrokuan";
+    repo = pname;
+    rev = "479fa67d7439b23095e01b64987ae79a91a4e283";
+    sha256 = "sha256-28QW/WTLckR4lEfHv6dSotwkAKpNJFCShxmKFGQQ1Ew=";
+  };
+
+  meta = with lib; {
+    description = "Ef-fish-ient fish keybindings for fzf";
+    homepage = "https://github.com/jethrokuan/fzf";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Scrumplex ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/github-copilot-cli-fish.nix b/nixpkgs/pkgs/shells/fish/plugins/github-copilot-cli-fish.nix
new file mode 100644
index 000000000000..83192ad092f5
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/github-copilot-cli-fish.nix
@@ -0,0 +1,20 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "github-copilot-cli.fish";
+  version = "0.1.33";
+
+  src = fetchFromGitHub {
+    owner = "z11i";
+    repo = pname;
+    rev = version;
+    hash = "sha256-dhACPlFrw1Z0dW0eA0IMnOelYJc7Fyz2D9u+rL1pyiM=";
+  };
+
+  meta = with lib; {
+    description = "GitHub Copilot CLI aliases for Fish Shell";
+    homepage = "https://github.com/z11i/github-copilot-cli.fish";
+    license = licenses.asl20;
+    maintainers = [ maintainers.malo ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/grc.nix b/nixpkgs/pkgs/shells/fish/plugins/grc.nix
new file mode 100644
index 000000000000..1149c082cac0
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/grc.nix
@@ -0,0 +1,24 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin {
+  pname = "grc";
+  version = "unstable-2022-05-24";
+
+  src = fetchFromGitHub {
+    owner = "oh-my-fish";
+    repo = "plugin-grc";
+    rev = "61de7a8a0d7bda3234f8703d6e07c671992eb079";
+    sha256 = "sha256-NQa12L0zlEz2EJjMDhWUhw5cz/zcFokjuCK5ZofTn+Q=";
+  };
+
+  postInstall = ''
+    cp conf.d/executables $out/share/fish/vendor_conf.d/
+  '';
+
+  meta = with lib; {
+    description = "grc Colourizer for some commands on Fish shell";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+    platforms = with platforms; unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/humantime-fish.nix b/nixpkgs/pkgs/shells/fish/plugins/humantime-fish.nix
new file mode 100644
index 000000000000..8e1c960e59e5
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/humantime-fish.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildFishPlugin
+, fetchFromGitHub
+, fishtape
+,
+}:
+buildFishPlugin rec {
+  pname = "humantime-fish";
+  version = "unstable-2022-04-08";
+
+  src = fetchFromGitHub {
+    owner = "jorgebucaran";
+    repo = "humantime.fish";
+    rev = "53b2adb4c6aff0da569c931a3cc006efcd0e7219";
+    sha256 = "sha256-792rPsf2WDIYcP8gn6TbHh9RZvskfOAL/oKfpilaLh0=";
+  };
+
+  checkPlugins = [ fishtape ];
+  checkPhase = ''
+    fishtape tests/humantime.fish
+  '';
+
+  meta = with lib; {
+    description = "Turn milliseconds into a human-readable string in Fish";
+    homepage = "https://github.com/jorgebucaran/humantime.fish";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Scrumplex ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/hydro.nix b/nixpkgs/pkgs/shells/fish/plugins/hydro.nix
new file mode 100644
index 000000000000..cd8705d54716
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/hydro.nix
@@ -0,0 +1,20 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "hydro";
+  version = "unstable-2022-02-21";
+
+  src = fetchFromGitHub {
+    owner = "jorgebucaran";
+    repo = "hydro";
+    rev = "d4875065ceea226f58ead97dd9b2417937344d6e";
+    sha256 = "sha256-nXeDnqqOuZyrqGTPEQtYlFvrFvy1bZVMF4CA37b0lsE=";
+  };
+
+  meta = with lib; {
+    description = "Ultra-pure, lag-free prompt with async Git status";
+    homepage = "https://github.com/jorgebucaran/hydro";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thehedgeh0g ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/pisces.nix b/nixpkgs/pkgs/shells/fish/plugins/pisces.nix
new file mode 100644
index 000000000000..c1ed37f41227
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/pisces.nix
@@ -0,0 +1,20 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "pisces";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "laughedelic";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-Oou2IeNNAqR00ZT3bss/DbhrJjGeMsn9dBBYhgdafBw=";
+  };
+
+  meta = with lib; {
+    description = "Paired symbols in the command line";
+    homepage = "https://github.com/laughedelic/pisces";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ vanilla ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/plugin-git.nix b/nixpkgs/pkgs/shells/fish/plugins/plugin-git.nix
new file mode 100644
index 000000000000..7d1774b642df
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/plugin-git.nix
@@ -0,0 +1,20 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "plugin-git";
+  version = "0.1";
+
+  src = fetchFromGitHub {
+    owner = "jhillyerd";
+    repo = "plugin-git";
+    rev = "v0.1";
+    sha256 = "sha256-MfrRQdcj7UtIUgtqKjt4lqFLpA6YZgKjE03VaaypNzE";
+  };
+
+  meta = with lib; {
+    description = "Git plugin for fish (similar to oh-my-zsh git)";
+    homepage = "https://github.com/jhillyerd/plugin-git";
+    license = licenses.mit;
+    maintainers = with maintainers; [ unsolvedcypher ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/puffer.nix b/nixpkgs/pkgs/shells/fish/plugins/puffer.nix
new file mode 100644
index 000000000000..0365c55e5351
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/puffer.nix
@@ -0,0 +1,20 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "puffer";
+  version = "unstable-2022-10-07";
+
+  src = fetchFromGitHub {
+    owner = "nickeb96";
+    repo = "puffer-fish";
+    rev = "fd0a9c95da59512beffddb3df95e64221f894631";
+    hash = "sha256-aij48yQHeAKCoAD43rGhqW8X/qmEGGkg8B4jSeqjVU0=";
+  };
+
+  meta = with lib; {
+    description = "Text Expansions for Fish";
+    homepage = "https://github.com/nickeb96/puffer-fish";
+    license = licenses.mit;
+    maintainers = with maintainers; [ quantenzitrone ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/pure.nix b/nixpkgs/pkgs/shells/fish/plugins/pure.nix
new file mode 100644
index 000000000000..04334f14fa99
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/pure.nix
@@ -0,0 +1,29 @@
+{ lib, buildFishPlugin, fetchFromGitHub, git, fishtape_3 }:
+
+buildFishPlugin rec {
+  pname = "pure";
+  version = "4.8.0";
+
+  src = fetchFromGitHub {
+    owner = "pure-fish";
+    repo = "pure";
+    rev = "v${version}";
+    hash = "sha256-O8rC2uCuM3xUQPRap7XqyyAvO77hP+sqNM4mEQ7pZkw=";
+  };
+
+  nativeCheckInputs = [ git ];
+  checkPlugins = [ fishtape_3 ];
+  checkPhase = ''
+    rm tests/pure_tools_installer.test.fish
+    rm tests/_pure_uninstall.test.fish
+
+    fishtape tests/*.test.fish
+  '';
+
+  meta = {
+    description = "Pretty, minimal and fast Fish prompt, ported from zsh";
+    homepage = "https://github.com/rafaelrinaldi/pure";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ pacien ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/sdkman-for-fish.nix b/nixpkgs/pkgs/shells/fish/plugins/sdkman-for-fish.nix
new file mode 100644
index 000000000000..ee8b4757fc61
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/sdkman-for-fish.nix
@@ -0,0 +1,20 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "sdkman-for-fish";
+  version = "2.0.0";
+
+  src = fetchFromGitHub {
+    owner = "reitzig";
+    repo = "sdkman-for-fish";
+    rev = "v${version}";
+    hash = "sha256-cgDTunWFxFm48GmNv21o47xrXyo+sS6a3CzwHlv0Ezo=";
+  };
+
+  meta = with lib; {
+    description = "Adds support for SDKMAN! to fish";
+    homepage = "https://github.com/reitzig/sdkman-for-fish";
+    license = licenses.mit;
+    maintainers = with maintainers; [ giorgiga ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/sponge.nix b/nixpkgs/pkgs/shells/fish/plugins/sponge.nix
new file mode 100644
index 000000000000..8528452e783b
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/sponge.nix
@@ -0,0 +1,20 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+buildFishPlugin rec {
+  pname = "sponge";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "meaningful-ooo";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-MdcZUDRtNJdiyo2l9o5ma7nAX84xEJbGFhAVhK+Zm1w=";
+  };
+
+  meta = with lib; {
+    description = "keeps your fish shell history clean from typos, incorrectly used commands and everything you don't want to store due to privacy reasons";
+    homepage = "https://github.com/meaningful-ooo/sponge";
+    license = licenses.mit;
+    maintainers = with maintainers; [ quantenzitrone ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/tide.nix b/nixpkgs/pkgs/shells/fish/plugins/tide.nix
new file mode 100644
index 000000000000..39afd487afdb
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/tide.nix
@@ -0,0 +1,28 @@
+{ lib, buildFishPlugin, fetchFromGitHub }:
+
+# Due to a quirk in tide breaking wrapFish, we need to add additional commands in the config.fish
+# Refer to the following comment to get you setup: https://github.com/NixOS/nixpkgs/pull/201646#issuecomment-1320893716
+buildFishPlugin rec {
+  pname = "tide";
+  version = "6.0.1";
+
+  src = fetchFromGitHub {
+    owner = "IlanCosman";
+    repo = "tide";
+    rev = "v${version}";
+    hash = "sha256-oLD7gYFCIeIzBeAW1j62z5FnzWAp3xSfxxe7kBtTLgA=";
+  };
+
+  #buildFishplugin will only move the .fish files, but tide has a tide configure function
+  postInstall = ''
+    cp -R functions/tide $out/share/fish/vendor_functions.d/
+  '';
+
+  meta = with lib; {
+    description = "The ultimate Fish prompt";
+    homepage = "https://github.com/IlanCosman/tide";
+    license = licenses.mit;
+    maintainers = [ maintainers.jocelynthode ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/shells/fish/plugins/wakatime-fish.nix b/nixpkgs/pkgs/shells/fish/plugins/wakatime-fish.nix
new file mode 100644
index 000000000000..3bd6585d19ca
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/wakatime-fish.nix
@@ -0,0 +1,30 @@
+{ lib
+, wakatime
+, buildFishPlugin
+, fetchFromGitHub
+}:
+
+buildFishPlugin rec {
+  pname = "wakatime-fish";
+  version = "0.0.3";
+
+  src = fetchFromGitHub {
+    owner = "ik11235";
+    repo = "wakatime.fish";
+    rev = "v${version}";
+    hash = "sha256-t0b8jvkNU7agF0A8YkwQ57qGGqcYJF7l9eNr12j2ZQ0=";
+  };
+
+  preFixup = ''
+    substituteInPlace $out/share/fish/vendor_conf.d/wakatime.fish \
+      --replace "if type -p wakatime" "if type -p ${lib.getExe wakatime}" \
+      --replace "(type -p wakatime)" "${lib.getExe wakatime}"
+  '';
+
+  meta = with lib; {
+    description = "A fish plugin for wakatime";
+    homepage = "https://github.com/ik11235/wakatime.fish";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ocfox ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/plugins/z.nix b/nixpkgs/pkgs/shells/fish/plugins/z.nix
new file mode 100644
index 000000000000..207c68a43d76
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/plugins/z.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildFishPlugin
+, fetchFromGitHub
+,
+}:
+buildFishPlugin rec {
+  pname = "z";
+  version = "unstable-2022-04-08";
+
+  src = fetchFromGitHub {
+    owner = "jethrokuan";
+    repo = pname;
+    rev = "85f863f20f24faf675827fb00f3a4e15c7838d76";
+    sha256 = "sha256-+FUBM7CodtZrYKqU542fQD+ZDGrd2438trKM0tIESs0=";
+  };
+
+  meta = with lib; {
+    description = "Pure-fish z directory jumping";
+    homepage = "https://github.com/jethrokuan/z";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Scrumplex ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/fish/wrapper.nix b/nixpkgs/pkgs/shells/fish/wrapper.nix
new file mode 100644
index 000000000000..62ae03ec9ef9
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fish/wrapper.nix
@@ -0,0 +1,52 @@
+{ lib, writeShellApplication, fish, writeTextFile }:
+
+lib.makeOverridable ({
+  completionDirs ? [],
+  functionDirs ? [],
+  confDirs ? [],
+  pluginPkgs ? [],
+  localConfig ? "",
+  shellAliases ? {},
+  runtimeInputs ? []
+}:
+
+let
+  aliasesStr = builtins.concatStringsSep "\n"
+      (lib.mapAttrsToList (k: v: "alias ${k} ${lib.escapeShellArg v}") shellAliases);
+
+  shellAliasesFishConfig = writeTextFile {
+    name = "wrapfish.aliases.fish";
+    destination = "/share/fish/vendor_conf.d/aliases.fish";
+    text = ''
+      status is-interactive; and begin
+        # Aliases
+        ${aliasesStr}
+      end
+    '';
+  };
+
+  localFishConfig = writeTextFile {
+    name = "wrapfish.local.fish";
+    destination = "/share/fish/vendor_conf.d/config.local.fish";
+    text = localConfig;
+  };
+
+  vendorDir = kind: plugin: "${plugin}/share/fish/vendor_${kind}.d";
+  complPath = completionDirs ++ map (vendorDir "completions") pluginPkgs;
+  funcPath = functionDirs ++ map (vendorDir "functions") pluginPkgs;
+  confPath = confDirs
+    ++ (map (vendorDir "conf") pluginPkgs)
+    ++ (map (vendorDir "conf") [ localFishConfig shellAliasesFishConfig ]);
+
+in writeShellApplication {
+  inherit runtimeInputs;
+  name = "fish";
+  text = ''
+    ${fish}/bin/fish --init-command "
+      set --prepend fish_complete_path ${lib.escapeShellArgs complPath}
+      set --prepend fish_function_path ${lib.escapeShellArgs funcPath}
+      set --local fish_conf_source_path ${lib.escapeShellArgs confPath}
+      for c in \$fish_conf_source_path/*; source \$c; end
+    " "$@"
+  '';
+})
diff --git a/nixpkgs/pkgs/shells/fzf-git-sh/default.nix b/nixpkgs/pkgs/shells/fzf-git-sh/default.nix
new file mode 100644
index 000000000000..598c2d0eb0b2
--- /dev/null
+++ b/nixpkgs/pkgs/shells/fzf-git-sh/default.nix
@@ -0,0 +1,64 @@
+{ stdenv
+, lib
+, bash
+, bat
+, coreutils
+, fetchFromGitHub
+, findutils
+, fzf
+, gawk
+, git
+, gnugrep
+, gnused
+, tmux
+, util-linux
+, xdg-utils
+}:
+
+stdenv.mkDerivation rec {
+  pname = "fzf-git-sh";
+  version = "unstable-2022-09-30";
+
+  src = fetchFromGitHub {
+    owner = "junegunn";
+    repo = "fzf-git.sh";
+    rev = "9190e1bf7273d85f435fa759a5c3b20e588e9f7e";
+    sha256 = "sha256-2CGjk1oTXip+eAJMuOk/X3e2KTwfwzcKTcGToA2xPd4=";
+  };
+
+  dontBuild = true;
+
+  postPatch = ''
+    sed -i \
+      -e "s,\bawk\b,${gawk}/bin/awk," \
+      -e "s,\bbash\b,${bash}/bin/bash," \
+      -e "s,\bbat\b,${bat}/bin/bat," \
+      -e "s,\bcat\b,${coreutils}/bin/cat," \
+      -e "s,\bcut\b,${coreutils}/bin/cut," \
+      -e "s,\bhead\b,${coreutils}/bin/head," \
+      -e "s,\buniq\b,${coreutils}/bin/uniq," \
+      -e "s,\bcolumn\b,${util-linux}/bin/column," \
+      -e "s,\bfzf-tmux\b,${fzf}/bin/fzf-tmux," \
+      -e "/display-message/!s,\bgit\b,${git}/bin/git,g" \
+      -e "s,\bgrep\b,${gnugrep}/bin/grep," \
+      -e "s,\bsed\b,${gnused}/bin/sed," \
+      -e "/fzf-tmux/!s,\btmux\b,${tmux}/bin/tmux," \
+      -e "s,\bxargs\b,${findutils}/bin/xargs," \
+      -e "s,\bxdg-open\b,${xdg-utils}/bin/xdg-open," \
+      -e "s,__fzf_git=.*BASH_SOURCE.*,__fzf_git=$out/share/${pname}/fzf-git.sh," \
+      -e "/__fzf_git=.*readlink.*/d" \
+      fzf-git.sh
+  '';
+
+  installPhase = ''
+    install -D fzf-git.sh $out/share/${pname}/fzf-git.sh
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/junegunn/fzf-git.sh";
+    description = "Bash and zsh key bindings for Git objects, powered by fzf";
+    license = licenses.mit;
+    maintainers = with maintainers; [ deejayem ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/hilbish/default.nix b/nixpkgs/pkgs/shells/hilbish/default.nix
new file mode 100644
index 000000000000..e558402543bf
--- /dev/null
+++ b/nixpkgs/pkgs/shells/hilbish/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "hilbish";
+  version = "2.1.2";
+
+  src = fetchFromGitHub {
+    owner = "Rosettea";
+    repo = "Hilbish";
+    rev = "v${version}";
+    hash = "sha256-OEuriFnVDS0POXoPeUk4IcLtV3JAMLDM2apDxmjg5cQ=";
+    fetchSubmodules = true;
+  };
+
+  subPackages = [ "." ];
+
+  vendorHash = "sha256-Kiy1JR3X++naY2XNLpnGujrNQt7qlL0zxv8E96cHmHo=";
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X main.dataDir=${placeholder "out"}/share/hilbish"
+  ];
+
+  postInstall = ''
+    mkdir -p "$out/share/hilbish"
+
+    cp .hilbishrc.lua $out/share/hilbish/
+    cp -r docs -t $out/share/hilbish/
+    cp -r libs -t $out/share/hilbish/
+    cp -r nature $out/share/hilbish/
+  '';
+
+  meta = with lib; {
+    description = "An interactive Unix-like shell written in Go";
+    changelog = "https://github.com/Rosettea/Hilbish/releases/tag/v${version}";
+    homepage = "https://github.com/Rosettea/Hilbish";
+    maintainers = with maintainers; [ fortuneteller2k ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/hishtory/default.nix b/nixpkgs/pkgs/shells/hishtory/default.nix
new file mode 100644
index 000000000000..1d5256e401ac
--- /dev/null
+++ b/nixpkgs/pkgs/shells/hishtory/default.nix
@@ -0,0 +1,37 @@
+{ buildGoModule
+, fetchFromGitHub
+, lib
+}:
+
+buildGoModule rec {
+  pname = "hishtory";
+  version = "0.215";
+
+  src = fetchFromGitHub {
+    owner = "ddworken";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-XDxAzMQjtCfufWnEO5NXP8Zv823a85qYhkZcEZKxIXs=";
+  };
+
+  vendorHash = "sha256-aXHqPk8iBMbe0NlsY3ZR7iozBGCAKlOOQ23FAD/5hL8=";
+
+  ldflags = [ "-X github.com/ddworken/hishtory/client/lib.Version=${version}" ];
+
+  excludedPackages = [ "backend/server" ];
+
+  postInstall = ''
+    mkdir -p $out/share/hishtory
+    cp client/lib/config.* $out/share/hishtory
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Your shell history: synced, queryable, and in context";
+    homepage = "https://github.com/ddworken/hishtory";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Enzime ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/shells/ion/Cargo.lock b/nixpkgs/pkgs/shells/ion/Cargo.lock
new file mode 100644
index 000000000000..e8355a3928cd
--- /dev/null
+++ b/nixpkgs/pkgs/shells/ion/Cargo.lock
@@ -0,0 +1,2976 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "ab_glyph_rasterizer"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a13739d7177fbd22bb0ed28badfff9f372f8bef46c863db4e1c6248f6b223b6e"
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "adler32"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "andrew"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c4afb09dd642feec8408e33f92f3ffc4052946f6b20f32fb99c1f58cd4fa7cf"
+dependencies = [
+ "bitflags",
+ "rusttype",
+ "walkdir",
+ "xdg",
+ "xml-rs",
+]
+
+[[package]]
+name = "android_glue"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407"
+
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "arrayref"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
+
+[[package]]
+name = "arrayvec"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "auto_enums"
+version = "0.7.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe0dfe45d75158751e195799f47ea02e81f570aa24bc5ef999cdd9e888c4b5c3"
+dependencies = [
+ "auto_enums_core",
+ "auto_enums_derive",
+]
+
+[[package]]
+name = "auto_enums_core"
+version = "0.7.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da47c46001293a2c4b744d731958be22cff408a2ab76e2279328f9713b1267b4"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "auto_enums_derive"
+version = "0.7.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41aed1da83ecdc799503b7cb94da1b45a34d72b49caf40a61d9cf5b88ec07cfd"
+dependencies = [
+ "autocfg",
+ "derive_utils",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "base64"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "blake2b_simd"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587"
+dependencies = [
+ "arrayref",
+ "arrayvec",
+ "constant_time_eq",
+]
+
+[[package]]
+name = "block"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
+
+[[package]]
+name = "bstr"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
+dependencies = [
+ "lazy_static",
+ "memchr",
+ "regex-automata",
+ "serde",
+]
+
+[[package]]
+name = "builtins-proc"
+version = "0.1.0"
+dependencies = [
+ "darling",
+ "ion-shell",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3"
+
+[[package]]
+name = "bytecount"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c"
+
+[[package]]
+name = "bytemuck"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5377c8865e74a160d21f29c2d40669f53286db6eab59b88540cbb12ffc8b835"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "calculate"
+version = "0.7.0"
+source = "git+https://gitlab.redox-os.org/redox-os/calc#9f975c504bf6d1a2bcf44992866233f49afaeb29"
+dependencies = [
+ "atty",
+ "clap",
+ "decimal",
+ "num",
+ "rand 0.7.3",
+ "redox_liner",
+]
+
+[[package]]
+name = "calloop"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b036167e76041694579972c28cf4877b4f92da222560ddb49008937b6a6727c"
+dependencies = [
+ "log",
+ "nix 0.18.0",
+]
+
+[[package]]
+name = "cast"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
+
+[[package]]
+name = "cc"
+version = "1.0.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "cgl"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "clap"
+version = "2.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+dependencies = [
+ "ansi_term",
+ "atty",
+ "bitflags",
+ "strsim 0.8.0",
+ "textwrap",
+ "unicode-width",
+ "vec_map",
+]
+
+[[package]]
+name = "cocoa"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c54201c07dcf3a5ca33fececb8042aed767ee4bfd5a0235a8ceabcda956044b2"
+dependencies = [
+ "bitflags",
+ "block",
+ "cocoa-foundation",
+ "core-foundation 0.9.3",
+ "core-graphics 0.22.3",
+ "foreign-types",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "cocoa"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832"
+dependencies = [
+ "bitflags",
+ "block",
+ "cocoa-foundation",
+ "core-foundation 0.9.3",
+ "core-graphics 0.22.3",
+ "foreign-types",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "cocoa-foundation"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318"
+dependencies = [
+ "bitflags",
+ "block",
+ "core-foundation 0.9.3",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
+[[package]]
+name = "constant_time_eq"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
+
+[[package]]
+name = "core-foundation"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171"
+dependencies = [
+ "core-foundation-sys 0.7.0",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+dependencies = [
+ "core-foundation-sys 0.8.3",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac"
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+
+[[package]]
+name = "core-graphics"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.7.0",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics"
+version = "0.22.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.9.3",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics-types"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.9.3",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-video-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828"
+dependencies = [
+ "cfg-if 0.1.10",
+ "core-foundation-sys 0.7.0",
+ "core-graphics 0.19.2",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "criterion"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f"
+dependencies = [
+ "atty",
+ "cast",
+ "clap",
+ "criterion-plot",
+ "csv",
+ "itertools 0.10.3",
+ "lazy_static",
+ "num-traits",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_cbor",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876"
+dependencies = [
+ "cast",
+ "itertools 0.10.3",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1"
+dependencies = [
+ "autocfg",
+ "cfg-if 1.0.0",
+ "crossbeam-utils",
+ "memoffset",
+ "once_cell",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc"
+dependencies = [
+ "cfg-if 1.0.0",
+ "once_cell",
+]
+
+[[package]]
+name = "csv"
+version = "1.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1"
+dependencies = [
+ "bstr",
+ "csv-core",
+ "itoa 0.4.8",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "csv-core"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "cty"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35"
+
+[[package]]
+name = "darling"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim 0.9.3",
+ "syn",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "decimal"
+version = "2.1.0"
+source = "git+https://github.com/alkis/decimal.git#83cfb19d07188106e9399b36d2496a1a07ee619f"
+dependencies = [
+ "bitflags",
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "deflate"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
+dependencies = [
+ "adler32",
+ "byteorder",
+]
+
+[[package]]
+name = "derivative"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "derive_utils"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "532b4c15dccee12c7044f1fcad956e98410860b22231e44a3b827464797ca7bf"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "dirs"
+version = "4.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "dispatch"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
+
+[[package]]
+name = "dlib"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b11f15d1e3268f140f68d390637d5e76d849782d971ae7063e0da69fe9709a76"
+dependencies = [
+ "libloading 0.6.7",
+]
+
+[[package]]
+name = "dlib"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794"
+dependencies = [
+ "libloading 0.7.3",
+]
+
+[[package]]
+name = "downcast-rs"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
+
+[[package]]
+name = "draw_state"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33cf9537e2d06891448799b96d5a8c8083e0e90522a7fdabe6ebf4f41d79d651"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "either"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be"
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
+[[package]]
+name = "fuchsia-cprng"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+
+[[package]]
+name = "fuchsia-zircon"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+dependencies = [
+ "bitflags",
+ "fuchsia-zircon-sys",
+]
+
+[[package]]
+name = "fuchsia-zircon-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
+
+[[package]]
+name = "futures"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b"
+
+[[package]]
+name = "futures-sink"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868"
+
+[[package]]
+name = "futures-task"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a"
+
+[[package]]
+name = "futures-util"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "gfx"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01de46f9508a5c259aef105f0bff760ceddca832ea9c87ce03d1923e22ee155b"
+dependencies = [
+ "draw_state",
+ "gfx_core",
+ "log",
+]
+
+[[package]]
+name = "gfx_core"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75fbddaef2e12b4995900539d7209d947b988a3d87ee8737484d049b526e5441"
+dependencies = [
+ "bitflags",
+ "draw_state",
+ "log",
+]
+
+[[package]]
+name = "gfx_device_gl"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "109c385fa380c18888633aa27d1e16cbae518469702a2f69dcb5f52d5378bebc"
+dependencies = [
+ "gfx_core",
+ "gfx_gl",
+ "log",
+]
+
+[[package]]
+name = "gfx_gl"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2d38164670920cfb7491bc0cf6f49f0554bd1c44cdbedc6c78d2bf91691ff5e"
+dependencies = [
+ "gl_generator 0.14.0",
+]
+
+[[package]]
+name = "gif"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06"
+dependencies = [
+ "color_quant",
+ "weezl",
+]
+
+[[package]]
+name = "gl"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b411c7e0bfc599e3606412c190e786b5bb48cf00073e1635f9bb6f88fe7d84a"
+dependencies = [
+ "gl_generator 0.13.1",
+]
+
+[[package]]
+name = "gl_generator"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca98bbde17256e02d17336a6bdb5a50f7d0ccacee502e191d3e3d0ec2f96f84a"
+dependencies = [
+ "khronos_api",
+ "log",
+ "xml-rs",
+]
+
+[[package]]
+name = "gl_generator"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"
+dependencies = [
+ "khronos_api",
+ "log",
+ "xml-rs",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
+
+[[package]]
+name = "glutin"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ae1cbb9176b9151c4ce03f012e3cd1c6c18c4be79edeaeb3d99f5d8085c5fa3"
+dependencies = [
+ "android_glue",
+ "cgl",
+ "cocoa 0.23.0",
+ "core-foundation 0.9.3",
+ "glutin_egl_sys",
+ "glutin_emscripten_sys",
+ "glutin_gles2_sys",
+ "glutin_glx_sys",
+ "glutin_wgl_sys",
+ "lazy_static",
+ "libloading 0.6.7",
+ "log",
+ "objc",
+ "osmesa-sys",
+ "parking_lot 0.11.2",
+ "wayland-client",
+ "wayland-egl",
+ "winapi 0.3.9",
+ "winit",
+]
+
+[[package]]
+name = "glutin_egl_sys"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2abb6aa55523480c4adc5a56bbaa249992e2dddb2fc63dc96e04a3355364c211"
+dependencies = [
+ "gl_generator 0.14.0",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "glutin_emscripten_sys"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80de4146df76e8a6c32b03007bc764ff3249dcaeb4f675d68a06caf1bac363f1"
+
+[[package]]
+name = "glutin_gles2_sys"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8094e708b730a7c8a1954f4f8a31880af00eb8a1c5b5bf85d28a0a3c6d69103"
+dependencies = [
+ "gl_generator 0.14.0",
+ "objc",
+]
+
+[[package]]
+name = "glutin_glx_sys"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e393c8fc02b807459410429150e9c4faffdb312d59b8c038566173c81991351"
+dependencies = [
+ "gl_generator 0.14.0",
+ "x11-dl",
+]
+
+[[package]]
+name = "glutin_wgl_sys"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3da5951a1569dbab865c6f2a863efafff193a93caf05538d193e9e3816d21696"
+dependencies = [
+ "gl_generator 0.14.0",
+]
+
+[[package]]
+name = "half"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "image"
+version = "0.23.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "color_quant",
+ "gif",
+ "jpeg-decoder",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+ "png",
+ "scoped_threadpool",
+ "tiff",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "interpolation"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3b7357d2bbc5ee92f8e899ab645233e43d21407573cceb37fed8bc3dede2c02"
+
+[[package]]
+name = "ion-ranges"
+version = "0.1.0"
+
+[[package]]
+name = "ion-shell"
+version = "1.0.0-alpha"
+dependencies = [
+ "atty",
+ "auto_enums",
+ "builtins-proc",
+ "calculate",
+ "criterion",
+ "errno-dragonfly",
+ "glob",
+ "ion-ranges",
+ "itertools 0.9.0",
+ "lexical",
+ "mktemp",
+ "nix 0.23.1",
+ "object-pool",
+ "permutate",
+ "piston-ai_behavior",
+ "piston2d-sprite",
+ "piston_window",
+ "rand 0.7.3",
+ "redox_liner",
+ "redox_users",
+ "regex",
+ "scopes",
+ "serial_test",
+ "serial_test_derive",
+ "small",
+ "smallvec",
+ "thiserror",
+ "types-rs",
+ "unicode-segmentation",
+ "users",
+ "xdg",
+]
+
+[[package]]
+name = "iovec"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "itertools"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itertools"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
+
+[[package]]
+name = "itoa"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d"
+
+[[package]]
+name = "jni-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+
+[[package]]
+name = "jpeg-decoder"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2"
+dependencies = [
+ "rayon",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.59"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "khronos_api"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "lazycell"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+
+[[package]]
+name = "lexical"
+version = "5.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f404a90a744e32e8be729034fc33b90cf2a56418fbf594d69aa3c0214ad414e5"
+dependencies = [
+ "cfg-if 1.0.0",
+ "lexical-core",
+]
+
+[[package]]
+name = "lexical-core"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe"
+dependencies = [
+ "arrayvec",
+ "bitflags",
+ "cfg-if 1.0.0",
+ "ryu",
+ "static_assertions",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.126"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
+
+[[package]]
+name = "libloading"
+version = "0.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883"
+dependencies = [
+ "cfg-if 1.0.0",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "libloading"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd"
+dependencies = [
+ "cfg-if 1.0.0",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "lock_api"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "malloc_buf"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memmap2"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b70ca2a6103ac8b665dc150b142ef0e4e89df640c9e6cf295d189c3caebe5a"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435"
+dependencies = [
+ "adler32",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
+dependencies = [
+ "adler",
+ "autocfg",
+]
+
+[[package]]
+name = "mio"
+version = "0.6.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4"
+dependencies = [
+ "cfg-if 0.1.10",
+ "fuchsia-zircon",
+ "fuchsia-zircon-sys",
+ "iovec",
+ "kernel32-sys",
+ "libc",
+ "log",
+ "miow",
+ "net2",
+ "slab",
+ "winapi 0.2.8",
+]
+
+[[package]]
+name = "mio-extras"
+version = "2.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19"
+dependencies = [
+ "lazycell",
+ "log",
+ "mio",
+ "slab",
+]
+
+[[package]]
+name = "miow"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d"
+dependencies = [
+ "kernel32-sys",
+ "net2",
+ "winapi 0.2.8",
+ "ws2_32-sys",
+]
+
+[[package]]
+name = "mktemp"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "975de676448231fcde04b9149d2543077e166b78fc29eae5aa219e7928410da2"
+dependencies = [
+ "uuid 0.8.2",
+]
+
+[[package]]
+name = "ndk"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5eb167c1febed0a496639034d0c76b3b74263636045db5489eee52143c246e73"
+dependencies = [
+ "jni-sys",
+ "ndk-sys",
+ "num_enum",
+ "thiserror",
+]
+
+[[package]]
+name = "ndk-glue"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdf399b8b7a39c6fb153c4ec32c72fd5fe789df24a647f229c239aa7adb15241"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "ndk",
+ "ndk-macro",
+ "ndk-sys",
+]
+
+[[package]]
+name = "ndk-macro"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d"
+dependencies = [
+ "darling",
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "ndk-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121"
+
+[[package]]
+name = "net2"
+version = "0.2.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "nix"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055"
+dependencies = [
+ "bitflags",
+ "cc",
+ "cfg-if 0.1.10",
+ "libc",
+]
+
+[[package]]
+name = "nix"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a"
+dependencies = [
+ "bitflags",
+ "cc",
+ "cfg-if 1.0.0",
+ "libc",
+]
+
+[[package]]
+name = "nix"
+version = "0.23.1"
+source = "git+https://github.com/nix-rust/nix.git?rev=ff6f8b8a#ff6f8b8a26c8d61f4341e441acf405402b46a430"
+dependencies = [
+ "bitflags",
+ "cfg-if 1.0.0",
+ "libc",
+ "memoffset",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "num"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f"
+dependencies = [
+ "num-bigint",
+ "num-complex",
+ "num-integer",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-complex"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
+dependencies = [
+ "autocfg",
+ "num-bigint",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca565a7df06f3d4b485494f25ba05da1435950f4dc263440eda7a6fa9b8e36e4"
+dependencies = [
+ "derivative",
+ "num_enum_derive",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffa5a33ddddfee04c0283a7653987d634e880347e96b5b2ed64de07efb59db9d"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "numtoa"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef"
+
+[[package]]
+name = "objc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+dependencies = [
+ "malloc_buf",
+]
+
+[[package]]
+name = "object-pool"
+version = "0.5.3"
+source = "git+https://github.com/CJP10/object-pool.git?rev=b7461b6ad6dcc93e69c3eee378895ea8593d880e#b7461b6ad6dcc93e69c3eee378895ea8593d880e"
+dependencies = [
+ "parking_lot 0.11.2",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1"
+
+[[package]]
+name = "oorandom"
+version = "11.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+
+[[package]]
+name = "osmesa-sys"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b"
+dependencies = [
+ "shared_library",
+]
+
+[[package]]
+name = "owned_ttf_parser"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f923fb806c46266c02ab4a5b239735c144bdeda724a50ed058e5226f594cde3"
+dependencies = [
+ "ttf-parser",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core 0.8.5",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core 0.9.3",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
+dependencies = [
+ "cfg-if 1.0.0",
+ "instant",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-sys",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+
+[[package]]
+name = "permutate"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53b7d5b19a715ffab38693a9dd44b067fdfa2b18eef65bd93562dfe507022fae"
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "piston"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f483bc0f9316e80f27c9f083fb20e8ae881a9799ad792cf683a059f3f58d6e6"
+dependencies = [
+ "pistoncore-event_loop",
+ "pistoncore-input 1.0.1",
+ "pistoncore-window",
+]
+
+[[package]]
+name = "piston-ai_behavior"
+version = "0.31.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa27af3fe9208a668af67bf296fa50b2e3353f67b0dd5112192c13ccd5464e10"
+dependencies = [
+ "pistoncore-input 0.28.1",
+ "serde",
+ "serde_derive",
+]
+
+[[package]]
+name = "piston-float"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad78bf43dcf80e8f950c92b84f938a0fc7590b7f6866fbcbeca781609c115590"
+
+[[package]]
+name = "piston-gfx_texture"
+version = "0.41.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de8d1197620f9774197c2f4fa5bca2b667ec40a9521160d6a4b46ccfdf4ac97c"
+dependencies = [
+ "gfx",
+ "gfx_core",
+ "image",
+ "piston-texture",
+]
+
+[[package]]
+name = "piston-graphics_api_version"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b06401e3ea38467d8d85b394557408107e3e56d827f0d00c9b47e902cbd1bed"
+
+[[package]]
+name = "piston-shaders_graphics2d"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a35f4d08d2b6fd7ff02baab63346d4b7d2fdd5ac3f2e091a5128c22c77a489a"
+
+[[package]]
+name = "piston-texture"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62c93564eef40a9920d026697f63d224efd7ac80981fb418fe1dad447c2d9bdd"
+
+[[package]]
+name = "piston-viewport"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61ecaf8ae0d71dd9cdbbd8662b47659621c09430ff3cb880d154858d3b8ac001"
+dependencies = [
+ "piston-float",
+]
+
+[[package]]
+name = "piston2d-gfx_graphics"
+version = "0.73.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84b79261cc8dfd181ad82640a1cac6fcbdb57f3ef447673ec8ec6926e5b33a8d"
+dependencies = [
+ "draw_state",
+ "gfx",
+ "piston-gfx_texture",
+ "piston-shaders_graphics2d",
+ "piston2d-graphics 0.40.0",
+ "shader_version",
+]
+
+[[package]]
+name = "piston2d-graphics"
+version = "0.35.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf145cd97b579ad9e0aa19652a217be961021de8e2d0c2a039f20ad6ad72a2b7"
+dependencies = [
+ "interpolation",
+ "piston-texture",
+ "piston-viewport",
+ "read_color",
+ "vecmath",
+]
+
+[[package]]
+name = "piston2d-graphics"
+version = "0.40.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "beb104512055b3bf44fc3d8dad9af88abda16a468d048626ae9b49f634802c67"
+dependencies = [
+ "fnv",
+ "interpolation",
+ "piston-texture",
+ "piston-viewport",
+ "read_color",
+ "rusttype",
+ "vecmath",
+]
+
+[[package]]
+name = "piston2d-sprite"
+version = "0.58.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c735fb7ebd161e94bdab236f33dc4978433e493e30856840dc4057bb192d054"
+dependencies = [
+ "interpolation",
+ "piston-ai_behavior",
+ "piston2d-graphics 0.35.0",
+ "pistoncore-input 0.28.1",
+ "uuid 0.6.5",
+]
+
+[[package]]
+name = "piston_window"
+version = "0.120.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96675d1e6ea52d59751e1fb956c3600b8d67a5d62cacbfb553f2ef07374d93f5"
+dependencies = [
+ "gfx",
+ "gfx_device_gl",
+ "piston",
+ "piston-texture",
+ "piston2d-gfx_graphics",
+ "piston2d-graphics 0.40.0",
+ "pistoncore-glutin_window",
+ "shader_version",
+]
+
+[[package]]
+name = "pistoncore-event_loop"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d86b3bf012430bb23694348615e37769aca0e9910539ce93674006aeeb77e6"
+dependencies = [
+ "pistoncore-input 1.0.1",
+ "pistoncore-window",
+ "spin_sleep",
+]
+
+[[package]]
+name = "pistoncore-glutin_window"
+version = "0.69.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "66086130e496d440aba286ba47b7d61e33413208323bec3499bf7975fa72dc2e"
+dependencies = [
+ "gl",
+ "glutin",
+ "pistoncore-input 1.0.1",
+ "pistoncore-window",
+ "shader_version",
+]
+
+[[package]]
+name = "pistoncore-input"
+version = "0.28.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd3f576d1a49fe2a86716b52ae72896319b05eb4d3abe41fb01abd3241cd5f7a"
+dependencies = [
+ "bitflags",
+ "piston-viewport",
+ "serde",
+ "serde_derive",
+]
+
+[[package]]
+name = "pistoncore-input"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2977fed6eb16c554fd445a09a50c8a0c250f4c50f752be46a7bd9dcc5ba471f0"
+dependencies = [
+ "bitflags",
+ "piston-viewport",
+ "serde",
+ "serde_derive",
+]
+
+[[package]]
+name = "pistoncore-window"
+version = "0.47.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d62962b4e9cfc13143c77e032302fedc58a8f0f570d30006cdb38ba00a5e50bf"
+dependencies = [
+ "piston-graphics_api_version",
+ "pistoncore-input 1.0.1",
+]
+
+[[package]]
+name = "pkg-config"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
+
+[[package]]
+name = "plotters"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9428003b84df1496fb9d6eeee9c5f8145cb41ca375eb0dad204328888832811f"
+dependencies = [
+ "num-traits",
+ "plotters-backend",
+ "plotters-svg",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "plotters-backend"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142"
+
+[[package]]
+name = "plotters-svg"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0918736323d1baff32ee0eade54984f6f201ad7e97d5cfb5d6ab4a358529615"
+dependencies = [
+ "plotters-backend",
+]
+
+[[package]]
+name = "png"
+version = "0.16.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6"
+dependencies = [
+ "bitflags",
+ "crc32fast",
+ "deflate",
+ "miniz_oxide 0.3.7",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
+
+[[package]]
+name = "proc-macro-crate"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
+dependencies = [
+ "toml",
+]
+
+[[package]]
+name = "proc-macro-error"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
+dependencies = [
+ "proc-macro-error-attr",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro-error-attr"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c278e965f1d8cf32d6e0e96de3d3e79712178ae67986d9cf9151f51e95aac89b"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
+dependencies = [
+ "fuchsia-cprng",
+ "libc",
+ "rand_core 0.3.1",
+ "rdrand",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha",
+ "rand_core 0.5.1",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
+dependencies = [
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "raw-window-handle"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e28f55143d0548dad60bb4fbdc835a3d7ac6acc3324506450c5fdd6e42903a76"
+dependencies = [
+ "libc",
+ "raw-window-handle 0.4.3",
+]
+
+[[package]]
+name = "raw-window-handle"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41"
+dependencies = [
+ "cty",
+]
+
+[[package]]
+name = "rayon"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d"
+dependencies = [
+ "autocfg",
+ "crossbeam-deque",
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "rdrand"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "read_color"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f4c8858baa4ad3c8bcc156ae91a0ffe22b76a3975c40c49b4f04c15c6bce0da"
+
+[[package]]
+name = "redox_liner"
+version = "0.5.1"
+source = "git+https://gitlab.redox-os.org/redox-os/liner#616e61657fd611c3fe5818e6151300cbcbdd5c06"
+dependencies = [
+ "bytecount",
+ "itertools 0.8.2",
+ "strip-ansi-escapes",
+ "termion",
+ "unicode-width",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "redox_termios"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8440d8acb4fd3d277125b4bd01a6f38aee8d814b3b5fc09b3f2b825d37d3fe8f"
+dependencies = [
+ "redox_syscall",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
+dependencies = [
+ "getrandom 0.2.7",
+ "redox_syscall",
+ "rust-argon2",
+ "thiserror",
+ "zeroize",
+]
+
+[[package]]
+name = "regex"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
+
+[[package]]
+name = "rust-argon2"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb"
+dependencies = [
+ "base64",
+ "blake2b_simd",
+ "constant_time_eq",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "rusttype"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc7c727aded0be18c5b80c1640eae0ac8e396abf6fa8477d96cb37d18ee5ec59"
+dependencies = [
+ "ab_glyph_rasterizer",
+ "owned_ttf_parser",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24c8ad4f0c00e1eb5bc7614d236a7f1300e3dbd76b68cac8e06fb00b015ad8d8"
+
+[[package]]
+name = "ryu"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scoped-tls"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
+
+[[package]]
+name = "scoped_threadpool"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "scopes"
+version = "0.1.0"
+
+[[package]]
+name = "serde"
+version = "1.0.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03"
+
+[[package]]
+name = "serde_cbor"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5"
+dependencies = [
+ "half",
+ "serde",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7"
+dependencies = [
+ "itoa 1.0.2",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serial_test"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7eec42e7232e5ca56aa59d63af3c7f991fe71ee6a3ddd2d3480834cf3902b007"
+dependencies = [
+ "futures",
+ "lazy_static",
+ "log",
+ "parking_lot 0.12.1",
+ "serial_test_derive",
+]
+
+[[package]]
+name = "serial_test_derive"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1b95bb2f4f624565e8fe8140c789af7e2082c0e0561b5a82a1b678baa9703dc"
+dependencies = [
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "rustversion",
+ "syn",
+]
+
+[[package]]
+name = "shader_version"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfadbf7574784ee97f062ace17e1008fb5e7f46dd714b7dd46baf6efebd30e26"
+dependencies = [
+ "piston-graphics_api_version",
+]
+
+[[package]]
+name = "shared_library"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11"
+dependencies = [
+ "lazy_static",
+ "libc",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "small"
+version = "0.1.0"
+source = "git+https://gitlab.redox-os.org/redox-os/small#4374ae30a2de281d686e14a1626dcb22e23ffae4"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
+
+[[package]]
+name = "smithay-client-toolkit"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4750c76fd5d3ac95fa3ed80fe667d6a3d8590a960e5b575b98eea93339a80b80"
+dependencies = [
+ "andrew",
+ "bitflags",
+ "calloop",
+ "dlib 0.4.2",
+ "lazy_static",
+ "log",
+ "memmap2",
+ "nix 0.18.0",
+ "wayland-client",
+ "wayland-cursor",
+ "wayland-protocols",
+]
+
+[[package]]
+name = "spin_sleep"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cafa7900db085f4354dbc7025e25d7a839a14360ea13b5fc4fd717f2d3b23134"
+dependencies = [
+ "once_cell",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "strip-ansi-escapes"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "011cbb39cf7c1f62871aea3cc46e5817b0937b49e9447370c93cacbe93a766d8"
+dependencies = [
+ "vte",
+]
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+
+[[package]]
+name = "strsim"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
+
+[[package]]
+name = "syn"
+version = "1.0.98"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "synstructure"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "unicode-xid",
+]
+
+[[package]]
+name = "termion"
+version = "1.5.6"
+source = "git+https://gitlab.redox-os.org/redox-os/termion#8054e082b01c3f45f89f0db96bc374f1e378deb1"
+dependencies = [
+ "libc",
+ "numtoa",
+ "redox_syscall",
+ "redox_termios",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tiff"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437"
+dependencies = [
+ "jpeg-decoder",
+ "miniz_oxide 0.4.4",
+ "weezl",
+]
+
+[[package]]
+name = "tinytemplate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "toml"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "ttf-parser"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e5d7cd7ab3e47dda6e56542f4bbf3824c15234958c6e1bd6aaa347e93499fdc"
+
+[[package]]
+name = "types-rs"
+version = "0.1.0"
+dependencies = [
+ "itertools 0.9.0",
+ "lexical",
+ "small",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7"
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04"
+
+[[package]]
+name = "users"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa4227e95324a443c9fcb06e03d4d85e91aabe9a5a02aa818688b6918b6af486"
+dependencies = [
+ "libc",
+ "log",
+]
+
+[[package]]
+name = "utf8parse"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372"
+
+[[package]]
+name = "uuid"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1436e58182935dcd9ce0add9ea0b558e8a87befe01c1a301e6020aeb0876363"
+dependencies = [
+ "cfg-if 0.1.10",
+ "rand 0.4.6",
+]
+
+[[package]]
+name = "uuid"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+dependencies = [
+ "getrandom 0.2.7",
+]
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "vecmath"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "956ae1e0d85bca567dee1dcf87fb1ca2e792792f66f87dced8381f99cd91156a"
+dependencies = [
+ "piston-float",
+]
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "vte"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983"
+dependencies = [
+ "arrayvec",
+ "utf8parse",
+ "vte_generate_state_changes",
+]
+
+[[package]]
+name = "vte_generate_state_changes"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff"
+dependencies = [
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "walkdir"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
+dependencies = [
+ "same-file",
+ "winapi 0.3.9",
+ "winapi-util",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d"
+dependencies = [
+ "cfg-if 1.0.0",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a"
+
+[[package]]
+name = "wayland-client"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3ab332350e502f159382201394a78e3cc12d0f04db863429260164ea40e0355"
+dependencies = [
+ "bitflags",
+ "downcast-rs",
+ "libc",
+ "nix 0.20.0",
+ "scoped-tls",
+ "wayland-commons",
+ "wayland-scanner",
+ "wayland-sys",
+]
+
+[[package]]
+name = "wayland-commons"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a21817947c7011bbd0a27e11b17b337bfd022e8544b071a2641232047966fbda"
+dependencies = [
+ "nix 0.20.0",
+ "once_cell",
+ "smallvec",
+ "wayland-sys",
+]
+
+[[package]]
+name = "wayland-cursor"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be610084edd1586d45e7bdd275fe345c7c1873598caa464c4fb835dee70fa65a"
+dependencies = [
+ "nix 0.20.0",
+ "wayland-client",
+ "xcursor",
+]
+
+[[package]]
+name = "wayland-egl"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99ba1ab1e18756b23982d36f08856d521d7df45015f404a2d7c4f0b2d2f66956"
+dependencies = [
+ "wayland-client",
+ "wayland-sys",
+]
+
+[[package]]
+name = "wayland-protocols"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "286620ea4d803bacf61fa087a4242ee316693099ee5a140796aaba02b29f861f"
+dependencies = [
+ "bitflags",
+ "wayland-client",
+ "wayland-commons",
+ "wayland-scanner",
+]
+
+[[package]]
+name = "wayland-scanner"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce923eb2deb61de332d1f356ec7b6bf37094dc5573952e1c8936db03b54c03f1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "xml-rs",
+]
+
+[[package]]
+name = "wayland-sys"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d841fca9aed7febf9bed2e9796c49bf58d4152ceda8ac949ebe00868d8f0feb8"
+dependencies = [
+ "dlib 0.5.0",
+ "lazy_static",
+ "pkg-config",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.59"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "weezl"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-sys"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
+dependencies = [
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
+
+[[package]]
+name = "winit"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da4eda6fce0eb84bd0a33e3c8794eb902e1033d0a1d5a31bc4f19b1b4bbff597"
+dependencies = [
+ "bitflags",
+ "cocoa 0.24.0",
+ "core-foundation 0.9.3",
+ "core-graphics 0.22.3",
+ "core-video-sys",
+ "dispatch",
+ "instant",
+ "lazy_static",
+ "libc",
+ "log",
+ "mio",
+ "mio-extras",
+ "ndk",
+ "ndk-glue",
+ "ndk-sys",
+ "objc",
+ "parking_lot 0.11.2",
+ "percent-encoding",
+ "raw-window-handle 0.3.4",
+ "smithay-client-toolkit",
+ "wayland-client",
+ "winapi 0.3.9",
+ "x11-dl",
+]
+
+[[package]]
+name = "ws2_32-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "x11-dl"
+version = "2.19.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "xcursor"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "xdg"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c4583db5cbd4c4c0303df2d15af80f0539db703fa1c68802d4cbbd2dd0f88f6"
+dependencies = [
+ "dirs",
+]
+
+[[package]]
+name = "xml-rs"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
+
+[[package]]
+name = "zeroize"
+version = "1.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f"
+dependencies = [
+ "zeroize_derive",
+]
+
+[[package]]
+name = "zeroize_derive"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
+]
diff --git a/nixpkgs/pkgs/shells/ion/build-script.patch b/nixpkgs/pkgs/shells/ion/build-script.patch
new file mode 100644
index 000000000000..869289289592
--- /dev/null
+++ b/nixpkgs/pkgs/shells/ion/build-script.patch
@@ -0,0 +1,17 @@
+--- a/build.rs
++++ b/build.rs
+@@ -23,13 +23,7 @@ fn write_version_file() -> io::Result<()> {
+     let target = env::var("TARGET").unwrap();
+     let version_fname = Path::new(&env::var("OUT_DIR").unwrap()).join("version_string");
+     let mut version_file = File::create(&version_fname)?;
+-    write!(
+-        &mut version_file,
+-        "r#\"ion {} ({})\nrev {}\"#",
+-        version,
+-        target,
+-        get_git_rev()?.trim()
+-    )?;
++    write!(&mut version_file, "r#\"ion {version} ({target})\n\"#")?;
+     Ok(())
+ }
+ 
diff --git a/nixpkgs/pkgs/shells/ion/default.nix b/nixpkgs/pkgs/shells/ion/default.nix
new file mode 100644
index 000000000000..72b6387f8e16
--- /dev/null
+++ b/nixpkgs/pkgs/shells/ion/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, stdenv
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "ion";
+  version = "unstable-2022-11-27";
+
+  src = fetchFromGitHub {
+    owner = "redox-os";
+    repo = "ion";
+    rev = "3bb8966fc99ba223033e1e02b0a6d50fc25cbef4";
+    sha256 = "sha256-6KW/YkMQFeGb1i+1YdADZRW89UruHsfPhMq9Cvxjl/4=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "calculate-0.7.0" = "sha256-wUmi8XLgEMgECeaCM0r1KxJ+oTd47QozgFBANKSwt24=";
+      "decimal-2.1.0" = "sha256-s5mDRCkaDBUdaywYEJzTfe7qH25sG5UUo5iVmPE+zrw=";
+      "nix-0.23.1" = "sha256-yWJYrQt9piJHhqBkH/hn9dsXR8oqzl0RKPrzx9fvqlw=";
+      "object-pool-0.5.3" = "sha256-LWP0b62sk2dcqnQEEvLmZVvWSVLJ722yH/zIIPL93W4=";
+      "redox_liner-0.5.1" = "sha256-OT9E4AwQgm5NngcCtcno1VKhkS4d8Eq/l+8aYHvXtTY=";
+      "small-0.1.0" = "sha256-QIzEfFc0EDEllf+YxVyV7j/PvC7nVWiK0YYBoZBQZ3Q=";
+      "termion-1.5.6" = "sha256-NTY/2SbqkSyslnN5Xg6lrQ0MTrOhTMHqN+XXqN6Nkr8=";
+    };
+  };
+
+  patches = [
+    # remove git revision from the build script to fix build
+    ./build-script.patch
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  checkFlags = lib.optionals stdenv.isDarwin [
+    # test assumes linux
+    "--skip=binary::completer::tests::filename_completion"
+  ];
+
+  passthru = {
+    shellPath = "/bin/ion";
+  };
+
+  meta = with lib; {
+    description = "Modern system shell with simple (and powerful) syntax";
+    homepage = "https://gitlab.redox-os.org/redox-os/ion";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dywedir ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/jush/default.nix b/nixpkgs/pkgs/shells/jush/default.nix
new file mode 100644
index 000000000000..a09024608bb6
--- /dev/null
+++ b/nixpkgs/pkgs/shells/jush/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, pkg-config, editline }:
+
+stdenv.mkDerivation rec {
+  pname = "jush";
+  version = "0.1";
+
+  src = fetchFromGitHub {
+    owner = "troglobit";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1azvghrh31gawd798a254ml4id642qvbva64zzg30pjszh1087n8";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+
+  buildInputs = [ editline ];
+
+  passthru.shellPath = "/bin/jush";
+
+  meta = with lib; {
+    description = "just a useless shell";
+    homepage = "https://github.com/troglobit/jush";
+    license = licenses.isc;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ dtzWill ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/ksh/default.nix b/nixpkgs/pkgs/shells/ksh/default.nix
new file mode 100644
index 000000000000..cfd278aaca65
--- /dev/null
+++ b/nixpkgs/pkgs/shells/ksh/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, meson, ninja, fetchFromGitHub, which, python3, fetchpatch
+, libiconv }:
+
+stdenv.mkDerivation rec {
+  pname = "ksh";
+  version = "2020.0.0";
+
+  src = fetchFromGitHub {
+    owner  = "att";
+    repo   = "ast";
+    rev    = version;
+    sha256 = "0cdxz0nhpq03gb9rd76fn0x1yzs2c8q289b7vcxnzlsrz1imz65j";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/att/ast/commit/11983a71f5e29df578b7e2184400728b4e3f451d.patch";
+      sha256 = "1n9558c4v2qpgpjb1vafs29n3qn3z0770wr1ayc0xjf5z5j4g3kv";
+    })
+  ];
+
+  nativeBuildInputs = [ meson ninja which python3 ];
+
+  buildInputs = [ libiconv ];
+
+  strictDeps = true;
+
+  meta = with lib; {
+    description = "KornShell Command And Programming Language";
+    longDescription = ''
+      The KornShell language was designed and developed by David G. Korn at
+      AT&T Bell Laboratories. It is an interactive command language that
+      provides access to the UNIX system and to many other systems, on the
+      many different computers and workstations on which it is implemented.
+    '';
+    homepage = "https://github.com/att/ast";
+    license = licenses.cpl10;
+    maintainers = with maintainers; [ ];
+    platforms = platforms.all;
+  };
+
+  passthru = {
+    shellPath = "/bin/ksh";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/liquidprompt/default.nix b/nixpkgs/pkgs/shells/liquidprompt/default.nix
new file mode 100644
index 000000000000..47e2e72c7ab7
--- /dev/null
+++ b/nixpkgs/pkgs/shells/liquidprompt/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "liquidprompt";
+  version = "2.1.2";
+
+  src = fetchFromGitHub {
+    owner = "nojhan";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-7mnrXLqnCdOuS2aRs4tVLfO8SRFrqZHNM40gWE/CVFI=";
+  };
+
+  strictDeps = true;
+  installPhase = ''
+    install -D -m 0444 liquidprompt $out/bin/liquidprompt
+    install -D -m 0444 liquidpromptrc-dist $out/share/doc/liquidprompt/liquidpromptrc-dist
+    install -D -m 0444 liquid.theme $out/share/doc/liquidprompt/liquid.theme
+
+    install -D -m 0444 liquidprompt.plugin.zsh \
+      $out/share/zsh/plugins/liquidprompt/liquidprompt.plugin.zsh
+    install -D -m 0444 liquidprompt \
+      $out/share/zsh/plugins/liquidprompt/liquidprompt
+  '';
+
+  meta = with lib; {
+    description = "A full-featured & carefully designed adaptive prompt for Bash & Zsh";
+    homepage = "https://github.com/nojhan/liquidprompt";
+    license = licenses.agpl3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ gerschtli ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/loksh/default.nix b/nixpkgs/pkgs/shells/loksh/default.nix
new file mode 100644
index 000000000000..39231e6e1442
--- /dev/null
+++ b/nixpkgs/pkgs/shells/loksh/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, meson
+, ncurses
+, ninja
+, pkg-config
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "loksh";
+  version = "7.4";
+
+  src = fetchFromGitHub {
+    owner = "dimkr";
+    repo = finalAttrs.pname;
+    rev = finalAttrs.version;
+    fetchSubmodules = true;
+    sha256 = "sha256-gQK9gq6MsKVyOikOW0sW/SbIM1K/3I8pn58P/SqzKys=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+  ];
+
+  buildInputs = [
+    ncurses
+  ];
+
+  strictDeps = true;
+
+  postInstall = ''
+    mv $out/bin/ksh $out/bin/loksh
+    mv $out/share/man/man1/ksh.1 $out/share/man/man1/loksh.1
+    mv $out/share/man/man1/sh.1 $out/share/man/man1/loksh-sh.1
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/dimkr/loksh";
+    description = "Linux port of OpenBSD's ksh";
+    longDescription = ''
+      loksh is a Linux port of OpenBSD's ksh.
+
+      Unlike other ports of ksh, loksh targets only one platform, follows
+      upstream closely and keeps changes to a minimum. loksh does not add any
+      extra features; this reduces the risk of introducing security
+      vulnerabilities and makes loksh a good fit for resource-constrained
+      systems.
+    '';
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ cameronnemo ];
+    platforms = platforms.linux;
+  };
+
+  passthru = {
+    shellPath = "/bin/loksh";
+  };
+})
diff --git a/nixpkgs/pkgs/shells/mrsh/default.nix b/nixpkgs/pkgs/shells/mrsh/default.nix
new file mode 100644
index 000000000000..2b9bc4e3e22e
--- /dev/null
+++ b/nixpkgs/pkgs/shells/mrsh/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub, meson, ninja, pkg-config, readline }:
+
+stdenv.mkDerivation rec {
+  pname = "mrsh-unstable";
+  version = "2021-01-10";
+
+  src = fetchFromGitHub {
+    owner = "emersion";
+    repo = "mrsh";
+    rev = "9f9884083831ea1f94bdda5151c5df3888932849";
+    sha256 = "0vvdwzw3fq74lwgmy6xxkk01sd68fzhsw84c750lm1dma22xhjci";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ meson ninja pkg-config ];
+  buildInputs = [ readline ];
+
+  doCheck = true;
+
+  meta = with lib; {
+    description = "A minimal POSIX shell";
+    homepage = "https://mrsh.sh";
+    license = licenses.mit;
+    maintainers = with maintainers; [ matthiasbeyer ];
+    platforms = platforms.unix;
+  };
+
+  passthru = {
+    shellPath = "/bin/mrsh";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/murex/default.nix b/nixpkgs/pkgs/shells/murex/default.nix
new file mode 100644
index 000000000000..81b585b28fdf
--- /dev/null
+++ b/nixpkgs/pkgs/shells/murex/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+}:
+
+buildGoModule rec {
+  pname = "murex";
+  version = "5.1.2210";
+
+  src = fetchFromGitHub {
+    owner = "lmorg";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-N0sWTWZJT4hjivTreYfG5VkxiWgTjlH+/9VZD6YKQXY=";
+  };
+
+  vendorHash = "sha256-PClKzvpztpry8xsYLfWB/9s/qI5k2m8qHBxkxY0AJqI=";
+
+  subPackages = [ "." ];
+
+  meta = with lib; {
+    description = "Bash-like shell and scripting environment with advanced features designed for safety and productivity";
+    homepage = "https://murex.rocks";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ dit7ya kashw2 ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/nix-your-shell/default.nix b/nixpkgs/pkgs/shells/nix-your-shell/default.nix
new file mode 100644
index 000000000000..8b2c36daf127
--- /dev/null
+++ b/nixpkgs/pkgs/shells/nix-your-shell/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, nix-update-script
+}:
+rustPlatform.buildRustPackage rec {
+  pname = "nix-your-shell";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "MercuryTechnologies";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-5zHjz0NOKcZCuR6QaLrwOXih3Xoqf2uBrJnxTX/TQok=";
+  };
+
+  cargoSha256 = "sha256-4Z/z4VgnJQd8Uc0tMDnx7sChzXtG5ZDL88jTlhPSonM=";
+
+  meta = with lib; {
+    mainProgram = "nix-your-shell";
+    description = "A `nix` and `nix-shell` wrapper for shells other than `bash`";
+    homepage = "https://github.com/MercuryTechnologies/nix-your-shell";
+    license = [ licenses.mit ];
+    maintainers = [ maintainers._9999years ];
+  };
+
+  passthru.updateScript = nix-update-script { };
+}
diff --git a/nixpkgs/pkgs/shells/nsh/default.nix b/nixpkgs/pkgs/shells/nsh/default.nix
new file mode 100644
index 000000000000..881d14002ebd
--- /dev/null
+++ b/nixpkgs/pkgs/shells/nsh/default.nix
@@ -0,0 +1,29 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "nsh";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "nuta";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1479wv8h5l2b0cwp27vpybq50nyvszhjxmn76n2bz3fchr0lrcbp";
+  };
+
+  cargoSha256 = "1kxjr4ymns95g6jz94107nqmd71m2xh8k19gcsy08650gjrn5cz3";
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A command-line shell like fish, but POSIX compatible";
+    homepage = "https://github.com/nuta/nsh";
+    changelog = "https://github.com/nuta/nsh/raw/v${version}/docs/changelog.md";
+    license = [ licenses.cc0 /* or */ licenses.mit ];
+    maintainers = [ maintainers.marsam ];
+  };
+
+  passthru = {
+    shellPath = "/bin/nsh";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/nushell/default.nix b/nixpkgs/pkgs/shells/nushell/default.nix
new file mode 100644
index 000000000000..acd7494fd3cc
--- /dev/null
+++ b/nixpkgs/pkgs/shells/nushell/default.nix
@@ -0,0 +1,77 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, rustPlatform
+, openssl
+, zlib
+, zstd
+, pkg-config
+, python3
+, xorg
+, Libsystem
+, AppKit
+, Security
+, nghttp2
+, libgit2
+, doCheck ? true
+, withDefaultFeatures ? true
+, additionalFeatures ? (p: p)
+, testers
+, nushell
+, nix-update-script
+}:
+
+let
+  version = "0.86.0";
+in
+
+rustPlatform.buildRustPackage {
+  pname = "nushell";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "nushell";
+    repo = "nushell";
+    rev = version;
+    hash = "sha256-jUZKqsu0/RO4mc+hzjis1mNrohj1JzM17Z8e2Ggxlfs=";
+  };
+
+  cargoHash = "sha256-WDGhuc2ZGDwfh7X/oRTZLzmKPj1jSnQFL4sy7KYt5Js=";
+
+  nativeBuildInputs = [ pkg-config ]
+    ++ lib.optionals (withDefaultFeatures && stdenv.isLinux) [ python3 ]
+    ++ lib.optionals stdenv.isDarwin [ rustPlatform.bindgenHook ];
+
+  buildInputs = [ openssl zstd ]
+    ++ lib.optionals stdenv.isDarwin [ zlib Libsystem Security ]
+    ++ lib.optionals (withDefaultFeatures && stdenv.isLinux) [ xorg.libX11 ]
+    ++ lib.optionals (withDefaultFeatures && stdenv.isDarwin) [ AppKit nghttp2 libgit2 ];
+
+  buildNoDefaultFeatures = !withDefaultFeatures;
+  buildFeatures = additionalFeatures [ ];
+
+  inherit doCheck;
+
+  checkPhase = ''
+    runHook preCheck
+    echo "Running cargo test"
+    HOME=$(mktemp -d) cargo test
+    runHook postCheck
+  '';
+
+  passthru = {
+    shellPath = "/bin/nu";
+    tests.version = testers.testVersion {
+      package = nushell;
+    };
+    updateScript = nix-update-script { };
+  };
+
+  meta = with lib; {
+    description = "A modern shell written in Rust";
+    homepage = "https://www.nushell.sh/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Br1ght0ne johntitor marsam ];
+    mainProgram = "nu";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/nushell/nu_scripts/default.nix b/nixpkgs/pkgs/shells/nushell/nu_scripts/default.nix
new file mode 100644
index 000000000000..5aa0adae6ebb
--- /dev/null
+++ b/nixpkgs/pkgs/shells/nushell/nu_scripts/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, stdenvNoCC
+, fetchFromGitHub
+, unstableGitUpdater
+}:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "nu_scripts";
+  version = "unstable-2023-10-19";
+
+  src = fetchFromGitHub {
+    owner = "nushell";
+    repo = pname;
+    rev = "7b2856ddff8afac538d826df4abc08325c4be39d";
+    hash = "sha256-9OFKtaADDV5I5Yu0sCfQABAmf8yqwX2QwDhPPkh5BEo=";
+  };
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/share/nu_scripts
+    mv ./* $out/share/nu_scripts
+
+    runHook postInstall
+  '';
+
+  passthru.updateScript = unstableGitUpdater { };
+
+  meta = {
+    description = "A place to share Nushell scripts with each other";
+    homepage = "https://github.com/nushell/nu_scripts";
+    license = lib.licenses.free;
+
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.CardboardTurkey ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/nushell/plugins/default.nix b/nixpkgs/pkgs/shells/nushell/plugins/default.nix
new file mode 100644
index 000000000000..f4571d4da002
--- /dev/null
+++ b/nixpkgs/pkgs/shells/nushell/plugins/default.nix
@@ -0,0 +1,9 @@
+{ lib, newScope, IOKit, CoreFoundation, Foundation, Security }:
+
+lib.makeScope newScope (self: with self; {
+  gstat = callPackage ./gstat.nix { inherit Security; };
+  formats = callPackage ./formats.nix { inherit IOKit Foundation; };
+  query = callPackage ./query.nix { inherit IOKit CoreFoundation; };
+  regex = callPackage ./regex.nix { inherit IOKit; };
+  net = callPackage ./net.nix { inherit IOKit CoreFoundation; };
+})
diff --git a/nixpkgs/pkgs/shells/nushell/plugins/formats.nix b/nixpkgs/pkgs/shells/nushell/plugins/formats.nix
new file mode 100644
index 000000000000..0603ba9bfb6b
--- /dev/null
+++ b/nixpkgs/pkgs/shells/nushell/plugins/formats.nix
@@ -0,0 +1,36 @@
+{ stdenv
+, lib
+, rustPlatform
+, nushell
+, pkg-config
+, IOKit
+, Foundation
+, nix-update-script
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "nushell_plugin_formats";
+  inherit (nushell) version src;
+  cargoHash = "sha256-Nuo+i1j2l5p3p1hFWipSk0EqZiR+9ZsQyTl3YmyBk+0=";
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = lib.optionals stdenv.isDarwin [ IOKit Foundation ];
+  cargoBuildFlags = [ "--package nu_plugin_formats" ];
+
+  checkPhase = ''
+    cargo test --manifest-path crates/nu_plugin_formats/Cargo.toml
+  '';
+
+  passthru.updateScript = nix-update-script {
+    # Skip the version check and only check the hash because we inherit version from nushell.
+    extraArgs = [ "--version=skip" ];
+  };
+
+  meta = with lib; {
+    description = "A formats plugin for Nushell";
+    homepage = "https://github.com/nushell/nushell/tree/${version}/crates/nu_plugin_formats";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ viraptor aidalgol ];
+    platforms = with platforms; all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/nushell/plugins/gstat.nix b/nixpkgs/pkgs/shells/nushell/plugins/gstat.nix
new file mode 100644
index 000000000000..e35a7c483d86
--- /dev/null
+++ b/nixpkgs/pkgs/shells/nushell/plugins/gstat.nix
@@ -0,0 +1,36 @@
+{ stdenv
+, lib
+, rustPlatform
+, openssl
+, nushell
+, pkg-config
+, Security
+, nix-update-script
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "nushell_plugin_gstat";
+  inherit (nushell) version src;
+  cargoHash = "sha256-GIIY4wK85igsfkwEiQ2+jJQTv5qekqx4y+OG0yt8TgE=";
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ openssl ] ++ lib.optionals stdenv.isDarwin [ Security ];
+  cargoBuildFlags = [ "--package nu_plugin_gstat" ];
+
+  checkPhase = ''
+    cargo test --manifest-path crates/nu_plugin_gstat/Cargo.toml
+  '';
+
+  passthru.updateScript = nix-update-script {
+    # Skip the version check and only check the hash because we inherit version from nushell.
+    extraArgs = [ "--version=skip" ];
+  };
+
+  meta = with lib; {
+    description = "A git status plugin for Nushell";
+    homepage = "https://github.com/nushell/nushell/tree/${version}/crates/nu_plugin_gstat";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ mrkkrp aidalgol ];
+    platforms = with platforms; all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/nushell/plugins/net.nix b/nixpkgs/pkgs/shells/nushell/plugins/net.nix
new file mode 100644
index 000000000000..031fa30eb61e
--- /dev/null
+++ b/nixpkgs/pkgs/shells/nushell/plugins/net.nix
@@ -0,0 +1,41 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, stdenv
+, IOKit
+, CoreFoundation
+, unstableGitUpdater
+}:
+
+rustPlatform.buildRustPackage {
+  pname = "nu-plugin-net";
+  version = "unstable-2023-10-24";
+
+  src = fetchFromGitHub {
+    owner = "fennewald";
+    repo = "nu_plugin_net";
+    rev = "8b63996ea2ff8bf282c9b0f5f6d01960cfe3d074";
+    hash = "sha256-QFo2cMI41GDBsuPNay5MyVyY+HdrLjAWedz8kDNA3JY=";
+  };
+
+  cargoHash = "sha256-ekfUQOsaWdpDASnRzoYh5Y/p3BnP7rvSYCCWQ6DJDnE=";
+
+  nativeBuildInputs = [
+    rustPlatform.bindgenHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    CoreFoundation
+    IOKit
+  ];
+
+  passthru.updateScript = unstableGitUpdater { };
+
+  meta = with lib; {
+    description = "A nushell plugin to list system network interfaces";
+    homepage = "https://github.com/fennewald/nu_plugin_net";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+    mainProgram = "nu-plugin-net";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/nushell/plugins/query.nix b/nixpkgs/pkgs/shells/nushell/plugins/query.nix
new file mode 100644
index 000000000000..b34d0b17df13
--- /dev/null
+++ b/nixpkgs/pkgs/shells/nushell/plugins/query.nix
@@ -0,0 +1,34 @@
+{ stdenv
+, lib
+, rustPlatform
+, nushell
+, IOKit
+, CoreFoundation
+, nix-update-script
+}:
+
+rustPlatform.buildRustPackage {
+  pname = "nushell_plugin_query";
+  inherit (nushell) version src;
+  cargoHash = "sha256-l32TKBM01JAiUqhkxPsg76dodirZ/NuGn6/KKgHKS8I=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ IOKit CoreFoundation ];
+  cargoBuildFlags = [ "--package nu_plugin_query" ];
+
+  checkPhase = ''
+    cargo test --manifest-path crates/nu_plugin_query/Cargo.toml
+  '';
+
+  passthru.updateScript = nix-update-script {
+    # Skip the version check and only check the hash because we inherit version from nushell.
+    extraArgs = [ "--version=skip" ];
+  };
+
+  meta = with lib; {
+    description = "A Nushell plugin to query JSON, XML, and various web data";
+    homepage = "https://github.com/nushell/nushell/tree/${version}/crates/nu_plugin_query";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ happysalada aidalgol ];
+    platforms = with platforms; all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/nushell/plugins/regex.nix b/nixpkgs/pkgs/shells/nushell/plugins/regex.nix
new file mode 100644
index 000000000000..4689a8390257
--- /dev/null
+++ b/nixpkgs/pkgs/shells/nushell/plugins/regex.nix
@@ -0,0 +1,35 @@
+{ stdenv
+, lib
+, rustPlatform
+, fetchFromGitHub
+, nix-update-script
+, IOKit
+}:
+
+rustPlatform.buildRustPackage {
+  pname = "nushell_plugin_regex";
+  version = "unstable-2023-10-08";
+
+  src = fetchFromGitHub {
+    owner = "fdncred";
+    repo = "nu_plugin_regex";
+    rev = "e1aa88e703f1f632ede685dd733472d34dd0c8e7";
+    hash = "sha256-GJgnsaeNDJoJjw8RPw6wpEq1mIult18Eh4frl8Plgxc=";
+  };
+
+  cargoHash = "sha256-AACpzSavY6MlYnl1lDYxVlfsEvEpNK0u8SzsoSZbqFc=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ IOKit ];
+
+  passthru = {
+    updateScript = nix-update-script { };
+  };
+
+  meta = with lib; {
+    description = "A Nushell plugin to parse regular expressions";
+    homepage = "https://github.com/fdncred/nu_plugin_regex";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aidalgol ];
+    platforms = with platforms; all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/oh/default.nix b/nixpkgs/pkgs/shells/oh/default.nix
new file mode 100644
index 000000000000..10bd86ba0594
--- /dev/null
+++ b/nixpkgs/pkgs/shells/oh/default.nix
@@ -0,0 +1,25 @@
+{ buildGoModule, fetchFromGitHub, lib }:
+
+buildGoModule rec {
+  pname = "oh";
+  version = "0.8.1";
+
+  src = fetchFromGitHub {
+    owner = "michaelmacinnis";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-DMxC5fv5ZLDv7gMajC/eyJd2YpO+OXFdvwAPYotnczw=";
+  };
+
+  vendorHash = "sha256-f4rqXOu6yXUzNsseSaV9pb8c2KXItYOalB5pfH3Acnc=";
+
+  meta = with lib; {
+    homepage = "https://github.com/michaelmacinnis/oh";
+    description = "A new Unix shell";
+    license = licenses.mit;
+  };
+
+  passthru = {
+    shellPath = "/bin/oh";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/oil/default.nix b/nixpkgs/pkgs/shells/oil/default.nix
new file mode 100644
index 000000000000..1fe9fe7f664f
--- /dev/null
+++ b/nixpkgs/pkgs/shells/oil/default.nix
@@ -0,0 +1,54 @@
+{ stdenv, lib, fetchurl, symlinkJoin, withReadline ? true, readline }:
+
+let
+  readline-all = symlinkJoin {
+    name = "readline-all"; paths = [ readline readline.dev ];
+  };
+in
+stdenv.mkDerivation rec {
+  pname = "oil";
+  version = "0.17.0";
+
+  src = fetchurl {
+    url = "https://www.oilshell.org/download/oil-${version}.tar.xz";
+    hash = "sha256-H7oWI3+660MhMdDTTPX11/YalnItzhxfdBrtwKR8xrM=";
+  };
+
+  postPatch = ''
+    patchShebangs build
+  '';
+
+  preInstall = ''
+    mkdir -p $out/bin
+  '';
+
+  strictDeps = true;
+  buildInputs = lib.optional withReadline readline;
+  configureFlags = [
+    "--datarootdir=${placeholder "out"}"
+  ] ++ lib.optionals withReadline [
+    "--with-readline"
+    "--readline=${readline-all}"
+  ];
+
+  # Stripping breaks the bundles by removing the zip file from the end.
+  dontStrip = true;
+
+  meta = {
+    description = "A new unix shell";
+    homepage = "https://www.oilshell.org/";
+
+    license = with lib.licenses; [
+      psfl # Includes a portion of the python interpreter and standard library
+      asl20 # Licence for Oil itself
+    ];
+
+    platforms = lib.platforms.all;
+    maintainers = with lib.maintainers; [ lheckemann alva ];
+    changelog = "https://www.oilshell.org/release/${version}/changelog.html";
+  };
+
+  passthru = {
+    shellPath = "/bin/osh";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/oksh/default.nix b/nixpkgs/pkgs/shells/oksh/default.nix
new file mode 100644
index 000000000000..d90c4003cb8f
--- /dev/null
+++ b/nixpkgs/pkgs/shells/oksh/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, lib, fetchFromGitHub, buildPackages }:
+
+stdenv.mkDerivation rec {
+  pname = "oksh";
+  version = "7.3";
+
+  src = fetchFromGitHub {
+    owner = "ibara";
+    repo = pname;
+    rev = "${pname}-${version}";
+    sha256 = "sha256-uGiPbkIeKH9zu+xKJJLCYFnyejWLdq7bE59yub3f3KM=";
+  };
+
+  strictDeps = true;
+
+  postPatch = lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) ''
+    substituteInPlace configure --replace "./conftest" "echo"
+  '';
+
+  configureFlags = [ "--no-strip" ];
+
+  meta = with lib; {
+    description = "Portable OpenBSD ksh, based on the Public Domain Korn Shell (pdksh)";
+    homepage = "https://github.com/ibara/oksh";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ siraben ];
+    platforms = platforms.all;
+  };
+
+  passthru = {
+    shellPath = "/bin/oksh";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/powershell/default.nix b/nixpkgs/pkgs/shells/powershell/default.nix
new file mode 100644
index 000000000000..58485bc8c9aa
--- /dev/null
+++ b/nixpkgs/pkgs/shells/powershell/default.nix
@@ -0,0 +1,139 @@
+{ lib
+, stdenv
+, fetchurl
+, less
+, makeWrapper
+, autoPatchelfHook
+, curl
+, icu
+, libuuid
+, libunwind
+, openssl
+, darwin
+, lttng-ust
+, pam
+, testers
+, powershell
+, writeShellScript
+, common-updater-scripts
+, gnused
+, jq
+}:
+
+let
+  ext = stdenv.hostPlatform.extensions.sharedLibrary;
+  platformLdLibraryPath = {
+    darwin = "DYLD_FALLBACK_LIBRARY_PATH";
+    linux = "LD_LIBRARY_PATH";
+  }.${stdenv.hostPlatform.parsed.kernel.name} or (throw "unsupported platform");
+in
+stdenv.mkDerivation rec {
+  pname = "powershell";
+  version = "7.3.9";
+
+  src = passthru.sources.${stdenv.hostPlatform.system}
+    or (throw "Unsupported system: ${stdenv.hostPlatform.system}");
+
+  sourceRoot = ".";
+
+  strictDeps = true;
+
+  nativeBuildInputs = [
+    less
+    makeWrapper
+  ] ++ lib.optionals stdenv.isLinux [
+    autoPatchelfHook
+  ];
+
+  buildInputs = [
+    curl
+    icu
+    libuuid
+    libunwind
+    openssl
+  ] ++ lib.optionals stdenv.isDarwin [
+    darwin.Libsystem
+  ] ++ lib.optionals stdenv.isLinux [
+    lttng-ust
+    pam
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/{bin,share/powershell}
+    cp -R * $out/share/powershell
+    chmod +x $out/share/powershell/pwsh
+    makeWrapper $out/share/powershell/pwsh $out/bin/pwsh \
+      --prefix ${platformLdLibraryPath} : "${lib.makeLibraryPath buildInputs}" \
+      --set TERM xterm \
+      --set POWERSHELL_TELEMETRY_OPTOUT 1 \
+      --set DOTNET_CLI_TELEMETRY_OPTOUT 1
+
+  '' + lib.optionalString (stdenv.isLinux && stdenv.isx86_64) ''
+    patchelf --replace-needed libcrypto${ext}.1.0.0 libcrypto${ext} $out/share/powershell/libmi.so
+    patchelf --replace-needed libssl${ext}.1.0.0 libssl${ext} $out/share/powershell/libmi.so
+
+  '' + lib.optionalString stdenv.isLinux ''
+    patchelf --replace-needed liblttng-ust${ext}.0 liblttng-ust${ext}.1 $out/share/powershell/libcoreclrtraceptprovider.so
+
+  '' + ''
+    runHook postInstall
+  '';
+
+  dontStrip = true;
+
+  passthru = {
+    shellPath = "/bin/pwsh";
+    sources = {
+      aarch64-darwin = fetchurl {
+        url = "https://github.com/PowerShell/PowerShell/releases/download/v${version}/powershell-${version}-osx-arm64.tar.gz";
+        hash = "sha256-g63hMkJUIYFpSl9NylCQs0WYdq/8S3UaFVtRjhZOs+s=";
+      };
+      aarch64-linux = fetchurl {
+        url = "https://github.com/PowerShell/PowerShell/releases/download/v${version}/powershell-${version}-linux-arm64.tar.gz";
+        hash = "sha256-zy6VZyXj9TV5QlVFnCgiB6XfIOyS79kPOFhvMRpOrP4=";
+      };
+      x86_64-darwin = fetchurl {
+        url = "https://github.com/PowerShell/PowerShell/releases/download/v${version}/powershell-${version}-osx-x64.tar.gz";
+        hash = "sha256-DI+m3Ik1Zw293H6VR19DNAECBApqdIENlrK2/D/3vNc=";
+      };
+      x86_64-linux = fetchurl {
+        url = "https://github.com/PowerShell/PowerShell/releases/download/v${version}/powershell-${version}-linux-x64.tar.gz";
+        hash = "sha256-eHlh46eV+g3eCiKalVGixwKY9mlk2lXRwUJF6By5lP0=";
+      };
+    };
+    tests.version = testers.testVersion {
+      package = powershell;
+      command = "HOME=$(mktemp -d) pwsh --version";
+    };
+    updateScript = writeShellScript "update-powershell" ''
+      set -o errexit
+      export PATH="${lib.makeBinPath [ common-updater-scripts curl gnused jq ]}"
+      NEW_VERSION=$(curl -s https://api.github.com/repos/PowerShell/PowerShell/releases/latest | jq .tag_name --raw-output | sed -e 's/v//')
+
+      if [[ "${version}" = "$NEW_VERSION" ]]; then
+        echo "The new version same as the old version."
+        exit 0
+      fi
+
+      for platform in ${lib.escapeShellArgs meta.platforms}; do
+        update-source-version "powershell" "0" "${lib.fakeHash}" --source-key="sources.$platform"
+        update-source-version "powershell" "$NEW_VERSION" --source-key="sources.$platform"
+      done
+    '';
+  };
+
+  meta = with lib; {
+    description = "Powerful cross-platform (Windows, Linux, and macOS) shell and scripting language based on .NET";
+    homepage = "https://microsoft.com/PowerShell";
+    license = licenses.mit;
+    mainProgram = "pwsh";
+    maintainers = with maintainers; [ wegank ];
+    platforms = builtins.attrNames passthru.sources;
+    sourceProvenance = with sourceTypes; [
+      binaryBytecode
+      binaryNativeCode
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/rc-9front/default.nix b/nixpkgs/pkgs/shells/rc-9front/default.nix
new file mode 100644
index 000000000000..a7d2f1e54e3e
--- /dev/null
+++ b/nixpkgs/pkgs/shells/rc-9front/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, fetchFrom9Front
+, unstableGitUpdater
+, byacc
+, installShellFiles
+}:
+
+stdenv.mkDerivation {
+  pname = "rc-9front";
+  version = "unstable-2022-11-01";
+
+  src = fetchFrom9Front {
+    domain = "shithub.us";
+    owner = "cinap_lenrek";
+    repo = "rc";
+    rev = "69041639483e16392e3013491fcb382efd2b9374";
+    hash = "sha256-xc+EfC4bc9ZA97jCQ6CGCzeLGf+Hx3/syl090/x4ew4=";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ byacc installShellFiles ];
+  enableParallelBuilding = true;
+  patches = [ ./path.patch ];
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 -t $out/bin/ rc
+    installManPage rc.1
+    mkdir -p $out/lib
+    install -m644 rcmain.unix $out/lib/rcmain
+
+    runHook postInstall
+  '';
+
+  passthru = {
+    shellPath = "/bin/rc";
+    updateScript = unstableGitUpdater { shallowClone = false; };
+  };
+
+  meta = with lib; {
+    description = "The 9front shell";
+    longDescription = "unix port of 9front rc";
+    homepage = "http://shithub.us/cinap_lenrek/rc/HEAD/info.html";
+    license = licenses.mit;
+    maintainers = with maintainers; [ moody ];
+    mainProgram = "rc";
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/rc-9front/path.patch b/nixpkgs/pkgs/shells/rc-9front/path.patch
new file mode 100644
index 000000000000..7deef2cebfcd
--- /dev/null
+++ b/nixpkgs/pkgs/shells/rc-9front/path.patch
@@ -0,0 +1,13 @@
+diff --git a/rcmain.unix b/rcmain.unix
+index 7ccbe1b..691f493 100644
+--- a/rcmain.unix
++++ b/rcmain.unix
+@@ -13,7 +13,7 @@ if(~ $rcname ?.out) prompt=('broken! ' '	')
+ if(flag p) path=/bin
+ if not {
+ 	finit
+-	if(~ $#path 0) path=(. /bin /usr/bin /usr/local/bin)
++	if(~ $#path 0) path=`:{/usr/bin/env echo -n $PATH}
+ }
+ fn sigexit
+ if(! ~ $#cflag 0){
diff --git a/nixpkgs/pkgs/shells/rush/default.nix b/nixpkgs/pkgs/shells/rush/default.nix
new file mode 100644
index 000000000000..6e7e256561b6
--- /dev/null
+++ b/nixpkgs/pkgs/shells/rush/default.nix
@@ -0,0 +1,50 @@
+{ fetchurl, lib, stdenv, bash, perl }:
+
+stdenv.mkDerivation rec {
+  pname = "rush";
+  version = "2.3";
+
+  src = fetchurl {
+    url = "mirror://gnu/${pname}/${pname}-${version}.tar.gz";
+    sha256 = "sha256-57gBYfZsKdK1moXBC52KgxKv/MIeQK6tDu+fznXLZ+Y=";
+  };
+
+  strictDeps = true;
+  buildInputs = [ bash ];
+
+  postInstall = ''
+    substituteInPlace $out/bin/rush-po \
+      --replace "exec perl" "exec ${lib.getExe perl}"
+  '';
+
+  doCheck = true;
+
+  meta = {
+    broken = stdenv.isDarwin;
+    description = "Restricted User Shell";
+
+    longDescription =
+      '' GNU Rush is a Restricted User Shell, designed for sites
+         providing limited remote access to their resources, such as
+         svn or git repositories, scp, or the like.  Using a
+         sophisticated configuration file, Rush gives you complete
+         control over the command lines that users execute, as well as
+         over the usage of system resources, such as virtual memory,
+         CPU time, etc.
+
+         In particular, it allows remote programs to be run in a chrooted
+         environment, which is important with such programs as
+         sftp-server or scp, that lack this ability.
+      '';
+
+    homepage = "https://www.gnu.org/software/rush/";
+    license = lib.licenses.gpl3Plus;
+
+    maintainers = [ ];
+    platforms = lib.platforms.all;
+  };
+
+  passthru = {
+    shellPath = "/bin/rush";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/scponly/default.nix b/nixpkgs/pkgs/shells/scponly/default.nix
new file mode 100644
index 000000000000..f15f04cfe227
--- /dev/null
+++ b/nixpkgs/pkgs/shells/scponly/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, lib, fetchFromGitHub, openssh, debugLevel ? 0 }:
+
+stdenv.mkDerivation {
+  pname = "scponly";
+  version = "4.8";
+
+  src = fetchFromGitHub {
+    owner = "scponly";
+    repo = "scponly";
+    rev = "d8ca58257b9905186aa5706f35813d5f80ea07c1";
+    sha256 = "U0K7lOp18ytNjh3KVFmc6vL+/tG4ETnwLEPQEhM4lXE=";
+  };
+
+  patches = [ ./scponly-fix-make.patch ];
+
+  strictDeps = true;
+
+  # chroot doesn't seem to work, so not enabling
+  # rsync could also be optionally enabled
+  configureFlags = [
+    "--enable-winscp-compat"
+    "scponly_PROG_SFTP_SERVER=${lib.getBin openssh}/libexec/sftp-server"
+    "scponly_PROG_SCP=${lib.getBin openssh}/bin/scp"
+  ];
+
+  postInstall = lib.optionalString (debugLevel > 0) ''
+    mkdir -p $out/etc/scponly && echo ${
+      toString debugLevel
+    } > $out/etc/scponly/debuglevel
+  '';
+
+  passthru.shellPath = "/bin/scponly";
+
+  meta = with lib; {
+    description = "A shell that only permits scp and sftp-server";
+    homepage = "https://github.com/scponly/scponly";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ wmertens ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/scponly/scponly-fix-make.patch b/nixpkgs/pkgs/shells/scponly/scponly-fix-make.patch
new file mode 100644
index 000000000000..e8522ec8e6e3
--- /dev/null
+++ b/nixpkgs/pkgs/shells/scponly/scponly-fix-make.patch
@@ -0,0 +1,21 @@
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -41,14 +41,14 @@
+ 	${INSTALL} -d ${DESTDIR}${bindir}
+ 	${INSTALL} -d ${DESTDIR}${mandir}/man8
+ 	${INSTALL} -d ${DESTDIR}${CONFDIR}
+-	${INSTALL} -o 0 -g 0 scponly ${DESTDIR}${bindir}/scponly
+-	${INSTALL} -o 0 -g 0 -m 0644 scponly.8 ${DESTDIR}${mandir}/man8/scponly.8
+-	${INSTALL} -o 0 -g 0 -m 0644 debuglevel ${DESTDIR}${DEBUGFILE}
++	${INSTALL} scponly ${DESTDIR}${bindir}/scponly
++	${INSTALL} -m 0644 scponly.8 ${DESTDIR}${mandir}/man8/scponly.8
++	${INSTALL} -m 0644 debuglevel ${DESTDIR}${DEBUGFILE}
+ 	if test "x${CHROOTED_NAME}" != "x"; then			\
+ 		${INSTALL} -d ${DESTDIR}${sbindir};				\
+ 		rm -f ${DESTDIR}${sbindir}/${CHROOTED_NAME};			\
+ 		cp scponly ${CHROOTED_NAME};				\
+-		${INSTALL} -o 0 -g 0 -m 4755 ${CHROOTED_NAME} ${DESTDIR}${sbindir}/${CHROOTED_NAME};	\
++		${INSTALL} ${CHROOTED_NAME} ${DESTDIR}${sbindir}/${CHROOTED_NAME};	\
+ 	fi
+ 
+ debuglevel:
diff --git a/nixpkgs/pkgs/shells/xonsh/default.nix b/nixpkgs/pkgs/shells/xonsh/default.nix
new file mode 100644
index 000000000000..67896d83632d
--- /dev/null
+++ b/nixpkgs/pkgs/shells/xonsh/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, fetchFromGitHub
+, python3
+, glibcLocales
+, coreutils
+, git
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "xonsh";
+  version = "0.14.0";
+  format = "pyproject";
+
+  # fetch from github because the pypi package ships incomplete tests
+  src = fetchFromGitHub {
+    owner = "xonsh";
+    repo = "xonsh";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ZrPKKa/vl06QAjGr16ZzKF/DAByFHr6ze2WVOCa+wf8=";
+  };
+
+  env.LC_ALL = "en_US.UTF-8";
+
+  postPatch = ''
+    sed -ie "s|/bin/ls|${coreutils}/bin/ls|" tests/test_execer.py
+    sed -ie "s|SHELL=xonsh|SHELL=$out/bin/xonsh|" tests/test_integrations.py
+
+    sed -ie 's|/usr/bin/env|${coreutils}/bin/env|' tests/test_integrations.py
+    sed -ie 's|/usr/bin/env|${coreutils}/bin/env|' scripts/xon.sh
+    find scripts -name 'xonsh*' -exec sed -i -e "s|env -S|env|" {} \;
+    find -name "*.xsh" | xargs sed -ie 's|/usr/bin/env|${coreutils}/bin/env|'
+    patchShebangs .
+  '';
+
+  nativeBuildInputs = with python3.pkgs; [
+    setuptools
+    wheel
+  ];
+
+  disabledTests = [
+    # fails on sandbox
+    "test_colorize_file"
+    "test_loading_correctly"
+    "test_no_command_path_completion"
+    "test_bsd_man_page_completions"
+    "test_xonsh_activator"
+    # fails on non-interactive shells
+    "test_capture_always"
+    "test_casting"
+    "test_command_pipeline_capture"
+    "test_dirty_working_directory"
+    "test_man_completion"
+    "test_vc_get_branch"
+    "test_bash_and_is_alias_is_only_functional_alias"
+  ];
+
+  disabledTestPaths = [
+    # fails on sandbox
+    "tests/completers/test_command_completers.py"
+    "tests/test_ptk_highlight.py"
+    "tests/test_ptk_shell.py"
+    # fails on non-interactive shells
+    "tests/prompt/test_gitstatus.py"
+    "tests/completers/test_bash_completer.py"
+  ];
+
+  preCheck = ''
+    HOME=$TMPDIR
+  '';
+
+  nativeCheckInputs = [ glibcLocales git ] ++
+    (with python3.pkgs; [ pip pyte pytestCheckHook pytest-mock pytest-subprocess ]);
+
+  propagatedBuildInputs = with python3.pkgs; [ ply prompt-toolkit pygments ];
+
+  meta = with lib; {
+    description = "A Python-ish, BASHwards-compatible shell";
+    homepage = "https://xon.sh/";
+    changelog = "https://github.com/xonsh/xonsh/raw/${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ vrthra ];
+  };
+
+  passthru = {
+    shellPath = "/bin/xonsh";
+    python = python3;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/xonsh/wrapper.nix b/nixpkgs/pkgs/shells/xonsh/wrapper.nix
new file mode 100644
index 000000000000..7868404ca5fb
--- /dev/null
+++ b/nixpkgs/pkgs/shells/xonsh/wrapper.nix
@@ -0,0 +1,24 @@
+{ runCommand
+, xonsh-unwrapped
+, lib
+, extraPackages ? (ps: [ ])
+}:
+
+let
+  xonsh = xonsh-unwrapped;
+  inherit (xonsh.passthru) python;
+
+  pythonEnv = python.withPackages (ps: [
+    (ps.toPythonModule xonsh)
+  ] ++ extraPackages ps);
+
+in
+runCommand "${xonsh.pname}-${xonsh.version}"
+{
+  inherit (xonsh) pname version meta passthru;
+} ''
+  mkdir -p $out/bin
+  for bin in ${lib.getBin xonsh}/bin/*; do
+    ln -s ${pythonEnv}/bin/$(basename "$bin") $out/bin/
+  done
+''
diff --git a/nixpkgs/pkgs/shells/yash/default.nix b/nixpkgs/pkgs/shells/yash/default.nix
new file mode 100644
index 000000000000..4957c657b86d
--- /dev/null
+++ b/nixpkgs/pkgs/shells/yash/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, lib, fetchFromGitHub, gettext, ncurses, asciidoc }:
+
+stdenv.mkDerivation rec {
+  pname = "yash";
+  version = "2.55";
+
+  src = fetchFromGitHub {
+    owner = "magicant";
+    repo = pname;
+    rev = version;
+    hash = "sha256-raTIqklo69JEuhzdWUK3uywuLjqeQJCJ9nvnLRxlGr4=";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ asciidoc gettext ];
+  buildInputs = [ ncurses ] ++ lib.optionals stdenv.isDarwin [ gettext ];
+
+  meta = with lib; {
+    homepage = "https://yash.osdn.jp/index.html.en";
+    description = "Yet another POSIX-compliant shell";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ qbit ];
+    platforms = platforms.all;
+  };
+
+  passthru.shellPath = "/bin/yash";
+}
diff --git a/nixpkgs/pkgs/shells/zsh/agdsn-zsh-config/default.nix b/nixpkgs/pkgs/shells/zsh/agdsn-zsh-config/default.nix
new file mode 100644
index 000000000000..6efbb285f29f
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/agdsn-zsh-config/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenvNoCC, fetchFromGitHub }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "agdsn-zsh-config";
+  version = "0.8.0";
+
+  src = fetchFromGitHub {
+    owner = "agdsn";
+    repo = "agdsn-zsh-config";
+    rev = "v${version}";
+    sha256 = "sha256-kbpiA+aI3mXQAanmTyZo2rJNOKX77FKjpVsQywyyq90=";
+  };
+
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D -m644 zshrc-base-hw.zsh "$out/etc/zsh/zshrc"
+    install -D -m644 zshrc-home.zsh "$out/etc/skel/.zshrc"
+    install -D -m644 zshrc-home.zsh "$out/etc/zsh/newuser.zshrc.recommended"
+    install -D -m644 profile-d-agdsn-zsh-config.sh "$out/etc/profile.d/agdsn-zsh-config.sh"
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A modified version of the Grml Zsh configuration specialised for the needs of system administration";
+    homepage = "https://github.com/agdsn/agdsn-zsh-config";
+    license = licenses.gpl2Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ fugi ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/agkozak-zsh-prompt/default.nix b/nixpkgs/pkgs/shells/zsh/agkozak-zsh-prompt/default.nix
new file mode 100644
index 000000000000..fa4d9f4cf477
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/agkozak-zsh-prompt/default.nix
@@ -0,0 +1,32 @@
+{ stdenvNoCC, lib, fetchFromGitHub }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "agkozak-zsh-prompt";
+  version = "3.11.2";
+
+  src = fetchFromGitHub {
+    owner = "agkozak";
+    repo = "agkozak-zsh-prompt";
+    rev = "v${version}";
+    sha256 = "sha256-QDUI9EYflITttkX9Khij62ybBMYJwPfayqj+wr495mM=";
+  };
+
+  strictDeps = true;
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    plugindir="$out/share/zsh/site-functions"
+
+    mkdir -p "$plugindir"
+    cp -r -- lib/*.zsh agkozak-zsh-prompt.plugin.zsh prompt_agkozak-zsh-prompt_setup "$plugindir"/
+  '';
+
+  meta = with lib; {
+    description = "A fast, asynchronous Zsh prompt";
+    homepage = "https://github.com/agkozak/agkozak-zsh-prompt";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/antibody/default.nix b/nixpkgs/pkgs/shells/zsh/antibody/default.nix
new file mode 100644
index 000000000000..8df75ac15b95
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/antibody/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "antibody";
+  version = "6.1.1";
+
+  src = fetchFromGitHub {
+    owner = "getantibody";
+    repo = "antibody";
+    rev = "v${version}";
+    hash = "sha256-If7XAwtg1WqkDkrJ6qYED+DjwHWloPu3P7X9rUd5ikU=";
+  };
+
+  vendorHash = "sha256-0m+yDo+AMX5tZfOsjsZgulyjB9mVEjy2RfA2sYeqDn0=";
+
+  doCheck = false;
+
+  ldflags = [ "-s" "-w" "-X main.version=${version}" ];
+
+  meta = with lib; {
+    description = "The fastest shell plugin manager";
+    homepage = "https://github.com/getantibody/antibody";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Br1ght0ne ];
+
+    # golang.org/x/sys needs to be updated due to:
+    #
+    #   https://github.com/golang/go/issues/49219
+    #
+    # but this package is no longer maintained.
+    #
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/antidote/default.nix b/nixpkgs/pkgs/shells/zsh/antidote/default.nix
new file mode 100644
index 000000000000..3506f0853f5f
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/antidote/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation (finalAttrs: {
+  version = "1.9.2";
+  pname = "antidote";
+
+  src = fetchFromGitHub {
+    owner = "mattmc3";
+    repo = "antidote";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-h+Gay1InnOY6tc8Iir5QzCC7FQj9cVWSn5YViEAHraU=";
+  };
+
+  dontPatch = true;
+  dontBuild = true;
+  dontConfigure = true;
+  dontFixup = true;
+
+  installPhase = ''
+    runHook preInstall
+    install -D antidote --target-directory=$out/share/antidote
+    install -D antidote.zsh --target-directory=$out/share/antidote
+    install -D functions/* --target-directory=$out/share/antidote/functions
+    runHook postInstall
+  '';
+
+  meta = {
+    description = "A zsh plugin manager made from the ground up thinking about performance";
+    homepage = "https://getantidote.github.io/";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.hitsmaxft ];
+  };
+})
diff --git a/nixpkgs/pkgs/shells/zsh/antigen/default.nix b/nixpkgs/pkgs/shells/zsh/antigen/default.nix
new file mode 100644
index 000000000000..ca5fbee6e368
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/antigen/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  version = "2.2.3";
+  pname = "antigen";
+
+  src = fetchurl {
+    url = "https://github.com/zsh-users/antigen/releases/download/v${version}/antigen.zsh";
+    sha256 = "1bmp3qf14509swpxin4j9f98n05pdilzapjm0jdzbv0dy3hn20ix";
+  };
+
+  strictDeps = true;
+  dontUnpack = true;
+
+  installPhase = ''
+    outdir=$out/share/antigen
+    mkdir -p $outdir
+    cp $src $outdir/antigen.zsh
+  '';
+
+  meta = {
+    description = "The plugin manager for zsh";
+    homepage = "https://antigen.sharats.me/";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/default.nix b/nixpkgs/pkgs/shells/zsh/default.nix
new file mode 100644
index 000000000000..5af94223ec83
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/default.nix
@@ -0,0 +1,152 @@
+{ lib
+, stdenv
+, fetchurl
+, fetchpatch
+, autoreconfHook
+, yodl
+, perl
+, groff
+, util-linux
+, texinfo
+, ncurses
+, pcre
+, pkg-config
+, buildPackages
+, nixosTests
+}:
+
+let
+  version = "5.9";
+in
+
+stdenv.mkDerivation {
+  pname = "zsh";
+  inherit version;
+  outputs = [ "out" "doc" "info" "man" ];
+
+  src = fetchurl {
+    url = "mirror://sourceforge/zsh/zsh-${version}.tar.xz";
+    sha256 = "sha256-m40ezt1bXoH78ZGOh2dSp92UjgXBoNuhCrhjhC1FrNU=";
+  };
+
+  patches = [
+    # fix location of timezone data for TZ= completion
+    ./tz_completion.patch
+    # Fixes configure misdetection when using clang 16, resulting in broken subshells on Darwin.
+    # This patch can be dropped with the next release of zsh.
+    (fetchpatch {
+      url = "https://github.com/zsh-users/zsh/commit/ab4d62eb975a4c4c51dd35822665050e2ddc6918.patch";
+      hash = "sha256-nXB4w7qqjZJC7/+CDxnNy6wu9qNwmS3ezjj/xK7JfeU=";
+      excludes = [ "ChangeLog" ];
+    })
+  ];
+
+  strictDeps = true;
+  nativeBuildInputs = [ autoreconfHook perl groff texinfo pkg-config ]
+                      ++ lib.optionals stdenv.isLinux [ util-linux yodl ];
+
+  buildInputs = [ ncurses pcre ];
+
+  configureFlags = [
+    "--enable-maildir-support"
+    "--enable-multibyte"
+    "--with-tcsetpgrp"
+    "--enable-pcre"
+    "--enable-zshenv=${placeholder "out"}/etc/zshenv"
+    "--disable-site-fndir"
+    "--enable-function-subdirs"
+  ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform && !stdenv.hostPlatform.isStatic) [
+    # Also see: https://github.com/buildroot/buildroot/commit/2f32e668aa880c2d4a2cce6c789b7ca7ed6221ba
+    "zsh_cv_shared_environ=yes"
+    "zsh_cv_shared_tgetent=yes"
+    "zsh_cv_shared_tigetstr=yes"
+    "zsh_cv_sys_dynamic_clash_ok=yes"
+    "zsh_cv_sys_dynamic_rtld_global=yes"
+    "zsh_cv_sys_dynamic_execsyms=yes"
+    "zsh_cv_sys_dynamic_strip_exe=yes"
+    "zsh_cv_sys_dynamic_strip_lib=yes"
+  ];
+
+  postPatch = ''
+    substituteInPlace Src/Modules/pcre.mdd \
+      --replace 'pcre-config' 'true'
+  '';
+
+  preConfigure = ''
+    # use pkg-config instead of pcre-config
+    configureFlagsArray+=("PCRECONF=''${PKG_CONFIG} libpcre")
+  '';
+
+  # the zsh/zpty module is not available on hydra
+  # so skip groups Y Z
+  checkFlags = map (T: "TESTNUM=${T}") (lib.stringToCharacters "ABCDEVW");
+
+  # XXX: think/discuss about this, also with respect to nixos vs nix-on-X
+  postInstall = ''
+    make install.info install.html
+    mkdir -p $out/etc/
+    cat > $out/etc/zshenv <<EOF
+if test -e /etc/NIXOS; then
+  if test -r /etc/zshenv; then
+    . /etc/zshenv
+  else
+    emulate bash
+    alias shopt=false
+    if [ -z "\$__NIXOS_SET_ENVIRONMENT_DONE" ]; then
+      . /etc/set-environment
+    fi
+    unalias shopt
+    emulate zsh
+  fi
+  if test -r /etc/zshenv.local; then
+    . /etc/zshenv.local
+  fi
+else
+  # on non-nixos we just source the global /etc/zshenv as if we did
+  # not use the configure flag
+  if test -r /etc/zshenv; then
+    . /etc/zshenv
+  fi
+fi
+EOF
+    ${if stdenv.hostPlatform == stdenv.buildPlatform then ''
+      $out/bin/zsh -c "zcompile $out/etc/zshenv"
+    '' else ''
+      ${lib.getBin buildPackages.zsh}/bin/zsh -c "zcompile $out/etc/zshenv"
+    ''}
+    mv $out/etc/zshenv $out/etc/zshenv_zwc_is_used
+
+    rm $out/bin/zsh-${version}
+    mkdir -p $out/share/doc/
+    mv $out/share/zsh/htmldoc $out/share/doc/zsh-$version
+  '';
+  # XXX: patch zsh to take zwc if newer _or equal_
+
+  postFixup = ''
+    HOST_PATH=$out/bin:$HOST_PATH patchShebangs --host $out/share/zsh/*/functions
+  '';
+
+  meta = {
+    description = "The Z shell";
+    longDescription = ''
+      Zsh is a UNIX command interpreter (shell) usable as an interactive login
+      shell and as a shell script command processor.  Of the standard shells,
+      zsh most closely resembles ksh but includes many enhancements.  Zsh has
+      command line editing, builtin spelling correction, programmable command
+      completion, shell functions (with autoloading), a history mechanism, and
+      a host of other features.
+    '';
+    license = "MIT-like";
+    homepage = "https://www.zsh.org/";
+    maintainers = with lib.maintainers; [ pSub artturin ];
+    platforms = lib.platforms.unix;
+    mainProgram = "zsh";
+  };
+
+  passthru = {
+    shellPath = "/bin/zsh";
+    tests = {
+      inherit (nixosTests) zsh-history oh-my-zsh;
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/fzf-zsh/default.nix b/nixpkgs/pkgs/shells/zsh/fzf-zsh/default.nix
new file mode 100644
index 000000000000..40c4edaff86e
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/fzf-zsh/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchFromGitHub, fzf }:
+
+stdenv.mkDerivation rec {
+  pname = "fzf-zsh-unstable";
+  version = "2019-09-09";
+
+  src = fetchFromGitHub {
+    owner = "Wyntau";
+    repo = "fzf-zsh";
+    rev = "829d7e40cc437dce8a6e234e259bbd4065e87124";
+    sha256 = "1irjmxhcg1fm4g8p3psjqk7sz5qhj5kw73pyhv91njvpdhn9l26z";
+  };
+
+  strictDeps = true;
+  postPatch = ''
+    substituteInPlace fzf-zsh.plugin.zsh \
+      --replace \
+        'fzf_path="$( cd "$fzf_zsh_path/../fzf/" && pwd )"' \
+        "fzf_path=${fzf}" \
+      --replace \
+        '$fzf_path/shell' \
+        '${fzf}/share/fzf'
+  '';
+
+  dontBuild = true;
+
+  installPhase = ''
+    install -Dm0644 fzf-zsh.plugin.zsh $out/share/zsh/plugins/fzf-zsh/fzf-zsh.plugin.zsh
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/wyntau/fzf-zsh";
+    description = "wrap fzf to use in oh-my-zsh";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/gradle-completion/default.nix b/nixpkgs/pkgs/shells/zsh/gradle-completion/default.nix
new file mode 100644
index 000000000000..fa40db3603b9
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/gradle-completion/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "gradle-completion";
+  version = "1.4.1";
+
+  src = fetchFromGitHub {
+    owner = "gradle";
+    repo = "gradle-completion";
+    rev = "v${version}";
+    sha256 = "15b0692i3h8h7b95465b2aw9qf5qjmjag5n62347l8yl7zbhv3l2";
+  };
+
+  strictDeps = true;
+
+  # we just move two files into $out,
+  # this shouldn't bother Hydra.
+  preferLocalBuild = true;
+
+  dontBuild = true;
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out
+    install -Dm0644 ./_gradle $out/share/zsh/site-functions/_gradle
+    install -Dm0644 ./gradle-completion.bash $out/share/bash-completion/completions/gradle
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Gradle tab completion for bash and zsh";
+    homepage = "https://github.com/gradle/gradle-completion";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/grml-zsh-config/default.nix b/nixpkgs/pkgs/shells/zsh/grml-zsh-config/default.nix
new file mode 100644
index 000000000000..b7c581e08f5e
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/grml-zsh-config/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchFromGitHub, lib, txt2tags }:
+
+stdenv.mkDerivation rec {
+  pname = "grml-zsh-config";
+  version = "0.19.6";
+
+  src = fetchFromGitHub {
+    owner = "grml";
+    repo = "grml-etc-core";
+    rev = "v${version}";
+    sha256 = "sha256-31BD5jUA54oLSsL4NzGaGAiOXMcZwy7uX65pD+jtE4M=";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ txt2tags ];
+
+  buildPhase = ''
+    cd doc
+    make
+    cd ..
+  '';
+
+  installPhase = ''
+    install -D -m644 etc/zsh/keephack $out/etc/zsh/keephack
+    install -D -m644 etc/zsh/zshrc $out/etc/zsh/zshrc
+
+    install -D -m644 doc/grmlzshrc.5 $out/share/man/man5/grmlzshrc.5
+    ln -s grmlzshrc.5.gz $out/share/man/man5/grml-zsh-config.5.gz
+  '';
+
+  meta = with lib; {
+    description = "grml's zsh setup";
+    homepage = "https://grml.org/zsh/";
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ msteen rvolosatovs ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/lambda-mod-zsh-theme/default.nix b/nixpkgs/pkgs/shells/zsh/lambda-mod-zsh-theme/default.nix
new file mode 100644
index 000000000000..f64f96a60aa7
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/lambda-mod-zsh-theme/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation {
+  pname = "lambda-mod-zsh-theme-unstable";
+  version = "2020-10-03";
+
+  src = fetchFromGitHub {
+    owner = "halfo";
+    repo = "lambda-mod-zsh-theme";
+    rev = "78347ea9709935f265e558b6345919d12323fbff";
+    sha256 = "0fvxnvgbcvwii7ghvpj5l43frllq71wwjvfg7cqfmic727z001dh";
+  };
+
+  strictDeps = true;
+  installPhase = ''
+    install -Dm0644 lambda-mod.zsh-theme $out/share/zsh/themes/lambda-mod.zsh-theme
+  '';
+
+  meta = with lib; {
+    description = "A ZSH theme optimized for people who use Git & Unicode-compatible fonts and terminals";
+    homepage = "https://github.com/halfo/lambda-mod-zsh-theme/";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/nix-zsh-completions/default.nix b/nixpkgs/pkgs/shells/zsh/nix-zsh-completions/default.nix
new file mode 100644
index 000000000000..32565af35be9
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/nix-zsh-completions/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "nix-zsh-completions";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "nix-community";
+    repo = "nix-zsh-completions";
+    rev = "refs/tags/${version}";
+    hash = "sha256-DKvCpjAeCiUwD5l6PUW7WlEvM0cNZEOk41IiVXoh9D8=";
+  };
+
+  strictDeps = true;
+  installPhase = ''
+    mkdir -p $out/share/zsh/{site-functions,plugins/nix}
+    cp _* $out/share/zsh/site-functions
+    cp *.zsh $out/share/zsh/plugins/nix
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/nix-community/nix-zsh-completions";
+    description = "ZSH completions for Nix, NixOS, and NixOps";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ olejorgenb hedning ma27 ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/oh-my-zsh/default.nix b/nixpkgs/pkgs/shells/zsh/oh-my-zsh/default.nix
new file mode 100644
index 000000000000..be67c6e14e35
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/oh-my-zsh/default.nix
@@ -0,0 +1,126 @@
+# This script was inspired by the ArchLinux User Repository package:
+#
+#   https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=oh-my-zsh-git
+{ lib, stdenv, fetchFromGitHub, nixosTests, writeScript, common-updater-scripts
+, git, nix, nixfmt, jq, coreutils, gnused, curl, cacert, bash }:
+
+stdenv.mkDerivation rec {
+  version = "2023-06-26";
+  pname = "oh-my-zsh";
+
+  src = fetchFromGitHub {
+    owner = "ohmyzsh";
+    repo = "ohmyzsh";
+    rev = "8cbe98469d9862d37d43ca4229dc8e915ec377a9";
+    sha256 = "sha256-/bFD1z/icQe4OfVcudMjIbkCh7MU6pEZiKBOYOFiCXs=";
+  };
+
+  strictDeps = true;
+  buildInputs = [ bash ];
+
+  installPhase = ''
+    runHook preInstall
+
+    outdir=$out/share/oh-my-zsh
+    template=templates/zshrc.zsh-template
+
+    mkdir -p $outdir
+    cp -r * $outdir
+    cd $outdir
+
+    rm LICENSE.txt
+    rm -rf .git*
+
+    chmod -R +w templates
+
+    # Change the path to oh-my-zsh dir and disable auto-updating.
+    sed -i -e "s#ZSH=\$HOME/.oh-my-zsh#ZSH=$outdir#" \
+           -e 's/\# \(DISABLE_AUTO_UPDATE="true"\)/\1/' \
+     $template
+
+    chmod +w oh-my-zsh.sh
+
+    # Both functions expect oh-my-zsh to be in ~/.oh-my-zsh and try to
+    # modify the directory.
+    cat >> oh-my-zsh.sh <<- EOF
+
+    # Undefine functions that don't work on Nix.
+    unfunction uninstall_oh_my_zsh
+    unfunction upgrade_oh_my_zsh
+    EOF
+
+    # Look for .zsh_variables, .zsh_aliases, and .zsh_funcs, and source
+    # them, if found.
+    cat >> $template <<- EOF
+
+    # Load the variables.
+    if [ -f ~/.zsh_variables ]; then
+        . ~/.zsh_variables
+    fi
+
+    # Load the functions.
+    if [ -f ~/.zsh_funcs ]; then
+      . ~/.zsh_funcs
+    fi
+
+    # Load the aliases.
+    if [ -f ~/.zsh_aliases ]; then
+        . ~/.zsh_aliases
+    fi
+    EOF
+
+    runHook postInstall
+  '';
+
+  passthru = {
+    tests = { inherit (nixosTests) oh-my-zsh; };
+
+    updateScript = writeScript "update.sh" ''
+      #!${stdenv.shell}
+      set -o errexit
+      PATH=${
+        lib.makeBinPath [
+          common-updater-scripts
+          curl
+          cacert
+          git
+          nixfmt
+          nix
+          jq
+          coreutils
+          gnused
+        ]
+      }
+
+      oldVersion="$(nix-instantiate --eval -E "with import ./. {}; lib.getVersion oh-my-zsh" | tr -d '"')"
+      latestSha="$(curl -L -s https://api.github.com/repos/ohmyzsh/ohmyzsh/commits\?sha\=master\&since\=$oldVersion | jq -r '.[0].sha')"
+
+      if [ ! "null" = "$latestSha" ]; then
+        nixpkgs="$(git rev-parse --show-toplevel)"
+        default_nix="$nixpkgs/pkgs/shells/zsh/oh-my-zsh/default.nix"
+        latestDate="$(curl -L -s https://api.github.com/repos/ohmyzsh/ohmyzsh/commits/$latestSha | jq '.commit.committer.date' | sed 's|"\(.*\)T.*|\1|g')"
+        update-source-version oh-my-zsh "$latestSha" --version-key=rev
+        update-source-version oh-my-zsh "$latestDate" --ignore-same-hash
+        nixfmt "$default_nix"
+      else
+        echo "${pname} is already up-to-date"
+      fi
+    '';
+  };
+
+  meta = with lib; {
+    description = "A framework for managing your zsh configuration";
+    longDescription = ''
+      Oh My Zsh is a framework for managing your zsh configuration.
+
+      To copy the Oh My Zsh configuration file to your home directory, run
+      the following command:
+
+        $ cp -v $(nix-env -q --out-path oh-my-zsh | cut -d' ' -f3)/share/oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
+    '';
+    homepage = "https://ohmyz.sh/";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ nequissimus ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/pure-prompt/default.nix b/nixpkgs/pkgs/shells/zsh/pure-prompt/default.nix
new file mode 100644
index 000000000000..6fbda66d4cc2
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/pure-prompt/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+with lib;
+
+stdenv.mkDerivation rec {
+  pname = "pure-prompt";
+  version = "1.22.0";
+
+  src = fetchFromGitHub {
+    owner = "sindresorhus";
+    repo = "pure";
+    rev = "v${version}";
+    sha256 = "sha256-TR4CyBZ+KoZRs9XDmWE5lJuUXXU1J8E2Z63nt+FS+5w=";
+  };
+
+  strictDeps = true;
+  installPhase = ''
+    OUTDIR="$out/share/zsh/site-functions"
+    mkdir -p "$OUTDIR"
+    cp pure.zsh "$OUTDIR/prompt_pure_setup"
+    cp async.zsh "$OUTDIR/async"
+  '';
+
+  meta = {
+    description = "Pretty, minimal and fast ZSH prompt";
+    homepage = "https://github.com/sindresorhus/pure";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ pacien pablovsky ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/spaceship-prompt/default.nix b/nixpkgs/pkgs/shells/zsh/spaceship-prompt/default.nix
new file mode 100644
index 000000000000..b7c7284e9f43
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/spaceship-prompt/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenvNoCC, fetchFromGitHub }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "spaceship-prompt";
+  version = "4.14.1";
+
+  src = fetchFromGitHub {
+    owner = "denysdovhan";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-dl8Ao9Sg+wbFpp6LfWD6isEKou75UzfJkTjZrue4A0A=";
+  };
+
+  strictDeps = true;
+  dontBuild = true;
+
+  installPhase = ''
+    install -Dm644 LICENSE.md "$out/share/licenses/spaceship-prompt/LICENSE"
+    install -Dm644 README.md "$out/share/doc/spaceship-prompt/README.md"
+    find docs -type f -exec install -Dm644 {} "$out/share/doc/spaceship-prompt/{}" \;
+    find lib -type f -exec install -Dm644 {} "$out/lib/spaceship-prompt/{}" \;
+    find scripts -type f -exec install -Dm644 {} "$out/lib/spaceship-prompt/{}" \;
+    find sections -type f -exec install -Dm644 {} "$out/lib/spaceship-prompt/{}" \;
+    install -Dm644 spaceship.zsh "$out/lib/spaceship-prompt/spaceship.zsh"
+    install -Dm644 async.zsh "$out/lib/spaceship-prompt/async.zsh"
+    install -d "$out/share/zsh/themes/"
+    ln -s "$out/lib/spaceship-prompt/spaceship.zsh" "$out/share/zsh/themes/spaceship.zsh-theme"
+    install -d "$out/share/zsh/site-functions/"
+    ln -s "$out/lib/spaceship-prompt/spaceship.zsh" "$out/share/zsh/site-functions/prompt_spaceship_setup"
+  '';
+
+  meta = with lib; {
+    description = "Zsh prompt for Astronauts";
+    homepage = "https://github.com/denysdovhan/spaceship-prompt/";
+    changelog = "https://github.com/spaceship-prompt/spaceship-prompt/releases/tag/v${version}";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ nyanloutre fortuneteller2k kyleondy ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/tz_completion.patch b/nixpkgs/pkgs/shells/zsh/tz_completion.patch
new file mode 100644
index 000000000000..01977828129d
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/tz_completion.patch
@@ -0,0 +1,14 @@
+On NixOS, timezone data is located at /etc/zoneinfo
+diff --git a/Completion/Unix/Type/_time_zone b/Completion/Unix/Type/_time_zone
+index cd924bbc7..5d683291b 100644
+--- a/Completion/Unix/Type/_time_zone
++++ b/Completion/Unix/Type/_time_zone
+@@ -3,7 +3,7 @@
+ local expl
+ 
+ if (( ! $+_zoneinfo_dirs )); then
+-  _zoneinfo_dirs=( /usr/{share,lib,share/lib}/{zoneinfo*,locale/TZ}(/) )
++  _zoneinfo_dirs=( /etc/zoneinfo /usr/{share,lib,share/lib}/{zoneinfo*,locale/TZ}(/) )
+ fi
+ 
+ _wanted time-zones expl 'time zone' _files -W _zoneinfo_dirs "$@" -
diff --git a/nixpkgs/pkgs/shells/zsh/zi/default.nix b/nixpkgs/pkgs/shells/zsh/zi/default.nix
new file mode 100644
index 000000000000..b1adbe8d6616
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zi/default.nix
@@ -0,0 +1,30 @@
+{ lib, fetchFromGitHub, installShellFiles, stdenvNoCC }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "zi";
+  version = "unstable-2022-04-09";
+  src = fetchFromGitHub {
+    owner = "z-shell";
+    repo = pname;
+    rev = "4ca4d3276ca816c3d37a31e47d754f9a732c40b9";
+    sha256 = "sha256-KcDFT0is5Ef/zRo6zVfxYfBMOb5oVaVFT4EsUrfiMko=";
+  };
+
+  dontBuild = true;
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  installPhase = ''
+    mkdir -p $out
+    cp -r lib zi.zsh $out
+    installManPage docs/man/zi.1
+    installShellCompletion --zsh lib/_zi
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/z-shell/zi";
+    description = "A Swiss Army Knife for Zsh - Unix Shell";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sei40kr ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zimfw/default.nix b/nixpkgs/pkgs/shells/zsh/zimfw/default.nix
new file mode 100644
index 000000000000..af452968fa63
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zimfw/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, lib, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "zimfw";
+  version = "1.12.1";
+  src = fetchFromGitHub {
+    owner = "zimfw";
+    repo = "zimfw";
+    rev = "v${version}";
+    ## zim only needs this one file to be installed.
+    sparseCheckout = [ "zimfw.zsh" ];
+    sha256 = "sha256-BoUNUdhRUWNi2ttxgWJxbjHw64K9k0rNjRi2L4V+gLk=";
+  };
+  strictDeps = true;
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out
+    cp -r $src/zimfw.zsh $out/
+
+    runHook postInstall
+  '';
+
+  ## zim automates the downloading of any plugins you specify in the `.zimrc`
+  ## file. To do that with Nix, you'll need $ZIM_HOME to be writable.
+  ## `~/.cache/zim` is a good place for that. The problem is that zim also
+  ## looks for `zimfw.zsh` there, so we're going to tell it here to look for
+  ## the `zimfw.zsh` where we currently are.
+  postFixup = ''
+    substituteInPlace $out/zimfw.zsh \
+      --replace "\''${ZIM_HOME}/zimfw.zsh" "$out/zimfw.zsh" \
+      --replace "\''${(q-)ZIM_HOME}/zimfw.zsh" "$out/zimfw.zsh"
+  '';
+
+  meta = with lib; {
+    description =
+      "The Zsh configuration framework with blazing speed and modular extensions";
+    homepage = "https://zimfw.sh";
+    license = licenses.mit;
+    maintainers = [ maintainers.joedevivo ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zinit/default.nix b/nixpkgs/pkgs/shells/zsh/zinit/default.nix
new file mode 100644
index 000000000000..6b949b90fda2
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zinit/default.nix
@@ -0,0 +1,43 @@
+{ stdenvNoCC, lib, fetchFromGitHub, installShellFiles }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "zinit";
+  version = "3.12.0";
+  src = fetchFromGitHub {
+    owner = "zdharma-continuum";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-AiYK1pRFD4CGvBcQg9QwgFjc5Z564TVlWW0MzxoxdWU=";
+  };
+  # adapted from https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=zsh-zplugin-git
+  dontBuild = true;
+  strictDeps = true;
+  nativeBuildInputs = [ installShellFiles ];
+  installPhase = ''
+    outdir="$out/share/$pname"
+
+    cd "$src"
+
+    # Zplugin's source files
+    install -dm0755 "$outdir"
+    # Installing backward compatibility layer
+    install -m0644 zinit{,-side,-install,-autoload}.zsh "$outdir"
+    install -m0755 share/git-process-output.zsh "$outdir"
+
+    # Zplugin autocompletion
+    installShellCompletion --zsh _zinit
+
+    #TODO:Zplugin-module files
+    # find zmodules/ -type d -exec install -dm 755 "{}" "$outdir/{}" \;
+    # find zmodules/ -type f -exec install -m 744 "{}" "$outdir/{}" \;
+
+  '';
+  #TODO:doc output
+
+  meta = with lib; {
+    homepage = "https://github.com/zdharma-continuum/zinit";
+    description = "Flexible zsh plugin manager";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pasqui23 sei40kr ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zplug/default.nix b/nixpkgs/pkgs/shells/zsh/zplug/default.nix
new file mode 100644
index 000000000000..7fdc682387d7
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zplug/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, lib, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "zplug";
+  version = "2.4.2";
+
+  src = fetchFromGitHub {
+    owner = "zplug";
+    repo = pname;
+    rev = version;
+    sha256 = "0hci1pbs3k5icwfyfw5pzcgigbh9vavprxxvakg1xm19n8zb61b3";
+  };
+
+  strictDeps = true;
+  dontConfigure = true;
+  dontBuild = true;
+  dontPatch = true;
+
+  installPhase = ''
+    mkdir -p $out/share/zplug
+    cp -r $src/{autoload,base,bin,init.zsh,misc} $out/share/zplug/
+    mkdir -p $out/share/man
+    cp -r $src/doc/man/* $out/share/man/
+  '';
+
+  meta = with lib; {
+    description = "A next-generation plugin manager for zsh";
+    homepage = "https://github.com/zplug/zplug";
+    license = licenses.mit;
+    maintainers = [ maintainers.s1341 ];
+    mainProgram = "zplug-env";
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-abbr/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-abbr/default.nix
new file mode 100644
index 000000000000..27b9e02dc93e
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-abbr/default.nix
@@ -0,0 +1,30 @@
+{
+  stdenv,
+  lib,
+  fetchFromGitHub,
+}:
+stdenv.mkDerivation rec {
+  pname = "zsh-abbr";
+  version = "5.2.0";
+
+  src = fetchFromGitHub {
+    owner = "olets";
+    repo = "zsh-abbr";
+    rev = "v${version}";
+    hash = "sha256-MvxJkEbJKMmYRku/RF6ayOb7u7NI4HZehO8ty64jEnE=";
+  };
+
+  strictDeps = true;
+
+  installPhase = ''
+    install -D zsh-abbr.zsh $out/share/zsh/${pname}/abbr.plugin.zsh
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/olets/zsh-abbr";
+    description = "The zsh manager for auto-expanding abbreviations, inspired by fish shell";
+    license = with licenses; [cc-by-nc-nd-40 hl3];
+    maintainers = with maintainers; [icy-thought];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-autocomplete/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-autocomplete/default.nix
new file mode 100644
index 000000000000..05721221f2ab
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-autocomplete/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenvNoCC, fetchFromGitHub }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "zsh-autocomplete";
+  version = "23.05.24";
+
+  src = fetchFromGitHub {
+    owner = "marlonrichert";
+    repo = "zsh-autocomplete";
+    rev = version;
+    sha256 = "sha256-/6V6IHwB5p0GT1u5SAiUa20LjFDSrMo731jFBq/bnpw=";
+  };
+
+  strictDeps = true;
+  installPhase = ''
+    install -D zsh-autocomplete.plugin.zsh $out/share/zsh-autocomplete/zsh-autocomplete.plugin.zsh
+    cp -R scripts $out/share/zsh-autocomplete/scripts
+    cp -R functions $out/share/zsh-autocomplete/functions
+  '';
+
+  meta = with lib; {
+    description = "Real-time type-ahead completion for Zsh. Asynchronous find-as-you-type autocompletion";
+    homepage = "https://github.com/marlonrichert/zsh-autocomplete/";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.leona ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-autopair/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-autopair/default.nix
new file mode 100644
index 000000000000..73b70c00405a
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-autopair/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, lib, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-autopair";
+  version = "1.0";
+
+  src = fetchFromGitHub {
+    owner = "hlissner";
+    repo = "zsh-autopair";
+    rev = "v${version}";
+    sha256 = "1h0vm2dgrmb8i2pvsgis3lshc5b0ad846836m62y8h3rdb3zmpy1";
+  };
+
+  strictDeps = true;
+
+  installPhase = ''
+    install -D autopair.zsh $out/share/zsh/${pname}/autopair.zsh
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/hlissner/zsh-autopair";
+    description = "A plugin that auto-closes, deletes and skips over matching delimiters in zsh intelligently";
+    license = licenses.mit;
+    maintainers = with maintainers; [ _0qq ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-autosuggestions/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-autosuggestions/default.nix
new file mode 100644
index 000000000000..6445b0d31e73
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-autosuggestions/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub, zsh }:
+
+# To make use of this derivation, use the `programs.zsh.autosuggestions.enable` option
+
+stdenv.mkDerivation rec {
+  pname = "zsh-autosuggestions";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "zsh-users";
+    repo = "zsh-autosuggestions";
+    rev = "v${version}";
+    sha256 = "1g3pij5qn2j7v7jjac2a63lxd97mcsgw6xq6k5p7835q9fjiid98";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ zsh ];
+
+  installPhase = ''
+    install -D zsh-autosuggestions.zsh \
+      $out/share/zsh-autosuggestions/zsh-autosuggestions.zsh
+    '';
+
+  meta = with lib; {
+    description = "Fish shell autosuggestions for Zsh";
+    homepage = "https://github.com/zsh-users/zsh-autosuggestions";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.loskutov ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-bd/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-bd/default.nix
new file mode 100644
index 000000000000..ebfa55ecd229
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-bd/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub}:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-bd";
+  version = "2018-07-04";
+
+  src = fetchFromGitHub {
+    owner = "Tarrasch";
+    repo = pname;
+    rev = "d4a55e661b4c9ef6ae4568c6abeff48bdf1b1af7";
+    sha256 = "020f8nq86g96cps64hwrskppbh2dapfw2m9np1qbs5pgh16z4fcb";
+  };
+
+  strictDeps = true;
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/share/zsh-bd
+    cp {.,$out/share/zsh-bd}/bd.zsh
+    cd $out/share/zsh-bd
+    ln -s bd{,.plugin}.zsh
+  '';
+
+  meta = {
+    description = "Jump back to a specific directory, without doing `cd ../../..` ";
+    homepage = "https://github.com/Tarrasch/zsh-bd";
+    license = lib.licenses.free;
+
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.olejorgenb ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-better-npm-completion/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-better-npm-completion/default.nix
new file mode 100644
index 000000000000..d9a813bbbfdd
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-better-npm-completion/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-better-npm-completion";
+  version = "unstable-2019-11-19";
+
+  src = fetchFromGitHub {
+    owner = "lukechilds";
+    repo = "zsh-better-npm-completion";
+    rev = "0a7cf042415324ec38a186fdcbc9af163f0d7e69";
+    sha256 = "16z7k5n1rcl9i61lrm7i5dsqsmhvdp1y4y5ii6hv2xpp470addgy";
+  };
+
+  strictDeps = true;
+  installPhase = ''
+    install -Dm 0644 zsh-better-npm-completion.plugin.zsh $out/share/zsh-better-npm-completion
+  '';
+
+  meta = with lib; {
+    description = "Better completion for npm";
+    homepage = "https://github.com/lukechilds/zsh-better-npm-completion";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.gerschtli ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-clipboard/clipboard.plugin.zsh b/nixpkgs/pkgs/shells/zsh/zsh-clipboard/clipboard.plugin.zsh
new file mode 100644
index 000000000000..f1f190ec70c3
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-clipboard/clipboard.plugin.zsh
@@ -0,0 +1,40 @@
+_cb-yank() {
+  AA=$(clippaste 2>/dev/null) && CUTBUFFER="$AA"
+  zle yank
+}
+_cb-kill-line() {
+  zle kill-line
+  printf "%s" "$CUTBUFFER" | clipcopy 2>/dev/null
+}
+_cb-kill-whole-line() {
+  zle kill-whole-line
+  printf "%s" "$CUTBUFFER" | clipcopy 2>/dev/null
+}
+_cb-kill-word() {
+  zle kill-word
+  printf "%s" "$CUTBUFFER" | clipcopy 2>/dev/null
+}
+_cb-backward-kill-word() {
+  zle backward-kill-word
+  printf "%s" "$CUTBUFFER" | clipcopy 2>/dev/null
+}
+_cb-copy-region-as-kill() {
+  ## https://unix.stackexchange.com/questions/19947/
+  zle copy-region-as-kill
+  zle set-mark-command -n -1
+  printf "%s" "$CUTBUFFER" | clipcopy 2>/dev/null
+}
+
+zle -N _cb-yank
+zle -N _cb-kill-line
+zle -N _cb-kill-whole-line
+zle -N _cb-kill-word
+zle -N _cb-backward-kill-word
+zle -N _cb-copy-region-as-kill
+
+bindkey '^y'   _cb-yank
+bindkey '^k'   _cb-kill-line
+bindkey '^u'   _cb-kill-whole-line
+bindkey '\ed'  _cb-kill-word
+bindkey '\e^?' _cb-backward-kill-word
+bindkey '\ew'  _cb-copy-region-as-kill
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-clipboard/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-clipboard/default.nix
new file mode 100644
index 000000000000..312731e7cb16
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-clipboard/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, lib }:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-clipboard";
+  version = "1.0";
+
+  dontUnpack = true;
+  strictDeps = true;
+  dontBuild = true;
+
+  installPhase = ''
+    install -D -m0444 -T ${./clipboard.plugin.zsh} $out/share/zsh/plugins/clipboard/clipboard.plugin.zsh
+  '';
+
+  meta = with lib; {
+    description = "Ohmyzsh plugin that integrates kill-ring with system clipboard";
+    longDescription = ''
+      Ohmyzsh plugin that integrates kill-ring with system clipboard.
+
+      Key bindings for C-y, C-k, C-u, M-d, M-backspace and M-w are rebound.
+      Behaviour of these keys should not be changed.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ bb2020 ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-command-time/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-command-time/default.nix
new file mode 100644
index 000000000000..c10b67c2b3de
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-command-time/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+# To make use of this plugin, need to add
+#   programs.zsh.interactiveShellInit = ''
+#     source ${pkgs.zsh-command-time}/share/zsh/plugins/command-time/command-time.plugin.zsh
+#     ZSH_COMMAND_TIME_COLOR="yellow"
+#     ZSH_COMMAND_TIME_MIN_SECONDS=3
+#     ZSH_COMMAND_TIME_ECHO=1
+#   '';
+
+stdenv.mkDerivation {
+  version = "2018-04-30";
+  pname = "zsh-command-time";
+
+  src = fetchFromGitHub {
+    owner = "popstas";
+    repo = "zsh-command-time";
+    rev = "afb4a4c9ae7ce64ca9d4f334a79a25e46daad0aa";
+    sha256 = "1bvyjgz6bhgg1nwr56r50p6fblgah6yiql55pgm5abnn2h876fjq";
+  };
+
+  strictDeps = true;
+  dontUnpack = true;
+
+  installPhase = ''
+    install -Dm0444 $src/command-time.plugin.zsh --target-directory=$out/share/zsh/plugins/command-time
+  '';
+
+  meta = with lib; {
+    description = "Plugin that output time: xx after long commands";
+    homepage = "https://github.com/popstas/zsh-command-time";
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-completions/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-completions/default.nix
new file mode 100644
index 000000000000..1873c38fb9a1
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-completions/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-completions";
+  version = "0.35.0";
+
+  src = fetchFromGitHub {
+    owner = "zsh-users";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-GFHlZjIHUWwyeVoCpszgn4AmLPSSE8UVNfRmisnhkpg=";
+  };
+
+  strictDeps = true;
+  installPhase = ''
+    install -D --target-directory=$out/share/zsh/site-functions src/*
+
+    # tmuxp install it so avoid collision
+    rm $out/share/zsh/site-functions/_tmuxp
+  '';
+
+  meta = {
+    description = "Additional completion definitions for zsh";
+    homepage = "https://github.com/zsh-users/zsh-completions";
+    license = lib.licenses.free;
+
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.olejorgenb ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-deer/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-deer/default.nix
new file mode 100644
index 000000000000..0d3a6bc9ee61
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-deer/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchFromGitHub, perl }:
+
+stdenv.mkDerivation rec {
+  pname = "deer";
+  version = "1.4";
+
+  src = fetchFromGitHub {
+    owner = "Vifon";
+    repo = "deer";
+    rev = "v${version}";
+    sha256 = "1xnbnbi0zk2xsyn8dqsmyxqlfnl36pb1wwibnlp0dxixw6sfymyl";
+  };
+
+  strictDeps = true;
+
+  prePatch = ''
+    substituteInPlace deer \
+      --replace " perl " " ${perl}/bin/perl "
+  '';
+
+  patches = [ ./realpath.patch ];
+
+  installPhase = ''
+    mkdir -p $out/share/zsh/site-functions/
+    cp deer $out/share/zsh/site-functions/
+  '';
+
+  meta = with lib; {
+    description = "Ranger-like file navigation for zsh";
+    homepage = "https://github.com/Vifon/deer";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.vyp ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-deer/realpath.patch b/nixpkgs/pkgs/shells/zsh/zsh-deer/realpath.patch
new file mode 100644
index 000000000000..03850d7e5c12
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-deer/realpath.patch
@@ -0,0 +1,28 @@
+From ceadb2f11119143af4f590ea6b05a531483219b5 Mon Sep 17 00:00:00 2001
+From: xd1le <elisp.vim@gmail.com>
+Date: Wed, 30 Aug 2017 17:27:20 +1000
+Subject: [PATCH] use realpath instead of python to calculate relative path
+
+---
+ deer | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/deer b/deer
+index 3d89dea..804a871 100644
+--- a/deer
++++ b/deer
+@@ -259,10 +259,7 @@ deer-get-relative()
+ {
+     local TMP
+     TMP=${1:-${DEER_DIRNAME%/}/$DEER_BASENAME[$DEER_DIRNAME]}
+-    TMP="`python -c '
+-import sys, os
+-print(os.path.relpath(sys.argv[1], sys.argv[2]))
+-' $TMP ${DEER_STARTDIR:-$PWD}`"
++    TMP="`realpath --relative-to=${DEER_STARTDIR:-$PWD} $TMP`"
+     print -R $TMP:q
+ }
+ 
+-- 
+2.14.1
+
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-defer/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-defer/default.nix
new file mode 100644
index 000000000000..e21a254af52a
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-defer/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-defer";
+  version = "unstable-2022-06-13";
+
+  src = fetchFromGitHub {
+    owner = "romkatv";
+    repo = pname;
+    rev = "57a6650ff262f577278275ddf11139673e01e471";
+    sha256 = "sha256-/rcIS2AbTyGw2HjsLPkHtt50c2CrtAFDnLuV5wsHcLc=";
+  };
+
+  strictDeps = true;
+  dontConfigure = true;
+  dontBuild = true;
+  installPhase = ''
+    mkdir -p $out/share/zsh-defer
+    cp zsh-defer* $out/share/zsh-defer
+  '';
+
+  meta = with lib; {
+    description = "Deferred execution of zsh commands";
+    homepage = "https://github.com/romkatv/zsh-defer";
+    license = licenses.gpl3Only;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.vinnymeller ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-edit/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-edit/default.nix
new file mode 100644
index 000000000000..9c734c928c24
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-edit/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, lib, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-edit";
+  version = "unstable-2022-05-05";
+
+  src = fetchFromGitHub {
+    owner = "marlonrichert";
+    repo = "zsh-edit";
+    rev = "4a8fa599792b6d52eadbb3921880a40872013d28";
+    sha256 = "PI4nvzB/F0mHlc0UZJdD49vjzB6pXhhJYNTSmBhY8iU=";
+  };
+
+  strictDeps = true;
+
+  dontBuild = true;
+
+  installPhase = ''
+    outdir=$out/share/zsh/${pname}
+    install -D zsh-edit.plugin.zsh $outdir/zsh-edit.plugin.zsh
+    install -D _bind $outdir/_bind
+    install -d $outdir/functions
+    install -D functions/{,.edit}* $outdir/functions
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/marlonrichert/zsh-edit";
+    description = "A set of powerful extensions to the Zsh command line editor";
+    license = licenses.mit;
+    maintainers = with maintainers; [ deejayem ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-f-sy-h/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-f-sy-h/default.nix
new file mode 100644
index 000000000000..0e18eaa95838
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-f-sy-h/default.nix
@@ -0,0 +1,32 @@
+{ stdenvNoCC, lib, fetchFromGitHub }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "zsh-f-sy-h";
+  version = "1.67";
+
+  src = fetchFromGitHub {
+    owner = "z-shell";
+    repo = "F-Sy-H";
+    rev = "v${version}";
+    sha256 = "0bcsc4kgda577fs3bnvymmxdz3z5mf19pn8ngfqsklabnf79f5nf";
+  };
+
+  strictDeps = true;
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    plugindir="$out/share/zsh/site-functions"
+
+    mkdir -p "$plugindir"
+    cp -r -- F-Sy-H.plugin.zsh chroma functions share themes "$plugindir"/
+  '';
+
+  meta = with lib; {
+    description = "Feature-rich Syntax Highlighting for Zsh";
+    homepage = "https://github.com/z-shell/F-Sy-H";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mrfreezeex ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-fast-syntax-highlighting/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-fast-syntax-highlighting/default.nix
new file mode 100644
index 000000000000..68f09828b456
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-fast-syntax-highlighting/default.nix
@@ -0,0 +1,31 @@
+{ stdenvNoCC, lib, fetchFromGitHub }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "zsh-fast-syntax-highlighting";
+  version = "1.55";
+
+  src = fetchFromGitHub {
+    owner = "zdharma-continuum";
+    repo = "fast-syntax-highlighting";
+    rev = "v${version}";
+    sha256 = "0h7f27gz586xxw7cc0wyiv3bx0x3qih2wwh05ad85bh2h834ar8d";
+  };
+
+  strictDeps = true;
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    plugindir="$out/share/zsh/site-functions"
+
+    mkdir -p "$plugindir"
+    cp -r -- {,_,-,.}fast-* *chroma themes "$plugindir"/
+  '';
+
+  meta = with lib; {
+    description = "Syntax-highlighting for Zshell";
+    homepage = "https://github.com/zdharma-continuum/fast-syntax-highlighting";
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-forgit/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-forgit/default.nix
new file mode 100644
index 000000000000..2cdb274eda8b
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-forgit/default.nix
@@ -0,0 +1,56 @@
+{ stdenv
+, lib
+, bash
+, coreutils
+, findutils
+, fetchFromGitHub
+, fzf
+, git
+, gnugrep
+, gnused
+, makeWrapper
+}:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-forgit";
+  version = "23.09.0";
+
+  src = fetchFromGitHub {
+    owner = "wfxr";
+    repo = "forgit";
+    rev = version;
+    sha256 = "sha256-WvJxjEzF3vi+YPVSH3QdDyp3oxNypMoB71TAJ7D8hOQ=";
+  };
+
+  strictDeps = true;
+
+  postPatch = ''
+    substituteInPlace forgit.plugin.zsh \
+      --replace "\$INSTALL_DIR/bin/git-forgit" "$out/bin/git-forgit"
+  '';
+
+  dontBuild = true;
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D bin/git-forgit $out/bin/git-forgit
+    install -D completions/_git-forgit $out/share/zsh/site-functions/_git-forgit
+    install -D completions/git-forgit.zsh $out/share/zsh/${pname}/git-forgit.zsh
+    install -D forgit.plugin.zsh $out/share/zsh/${pname}/forgit.plugin.zsh
+    wrapProgram $out/bin/git-forgit \
+      --prefix PATH : ${lib.makeBinPath [ bash coreutils findutils fzf git gnugrep gnused ]}
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/wfxr/forgit";
+    description = "A utility tool powered by fzf for using git interactively";
+    license = licenses.mit;
+    maintainers = with maintainers; [ deejayem ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-fzf-history-search/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-fzf-history-search/default.nix
new file mode 100644
index 000000000000..c6d32f8d7612
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-fzf-history-search/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, stdenvNoCC
+, fetchFromGitHub
+}:
+
+stdenvNoCC.mkDerivation {
+  pname = "zsh-fzf-history-search";
+  version = "unstable-2023-03-08";
+
+  src = fetchFromGitHub {
+    owner = "joshskidmore";
+    repo = "zsh-fzf-history-search";
+    rev = "d1aae98ccd6ce153c97a5401d79fd36418cd2958";
+    hash = "sha256-4Dp2ehZLO83NhdBOKV0BhYFIvieaZPqiZZZtxsXWRaQ=";
+  };
+
+  dontConfigure = true;
+  dontBuild = true;
+  strictDeps = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D zsh-fzf-history-search*.zsh  --target-directory=$out/share/zsh-fzf-history-search
+
+    runHook postInstall
+  '';
+
+  meta = {
+    description = "A simple zsh plugin that replaces Ctrl+R with an fzf-driven select which includes date/times";
+    homepage = "https://github.com/joshskidmore/zsh-fzf-history-search";
+    license = lib.licenses.mit;
+    platforms = lib.platforms.unix;
+    maintainers = with lib.maintainers; [ janik ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-fzf-tab/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-fzf-tab/default.nix
new file mode 100644
index 000000000000..d84dc2233562
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-fzf-tab/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, lib, fetchFromGitHub, ncurses }:
+
+let
+  INSTALL_PATH="${placeholder "out"}/share/fzf-tab";
+in stdenv.mkDerivation rec {
+  pname = "zsh-fzf-tab";
+  version = "unstable-2023-06-11";
+
+  src = fetchFromGitHub {
+    owner = "Aloxaf";
+    repo = "fzf-tab";
+    rev = "c2b4aa5ad2532cca91f23908ac7f00efb7ff09c9";
+    sha256 = "sha256-gvZp8P3quOtcy1Xtt1LAW1cfZ/zCtnAmnWqcwrKel6w=";
+  };
+
+  strictDeps = true;
+  buildInputs = [ ncurses ];
+
+  postConfigure = ''
+    pushd modules
+    ./configure --disable-gdbm --without-tcsetpgrp
+    popd
+  '';
+
+  postBuild = ''
+    pushd modules
+    make -j$NIX_BUILD_CORES
+    popd
+  '';
+
+  installPhase = ''
+     mkdir -p ${INSTALL_PATH}
+     cp -r lib ${INSTALL_PATH}/lib
+     install -D fzf-tab.zsh ${INSTALL_PATH}/fzf-tab.zsh
+     install -D fzf-tab.plugin.zsh ${INSTALL_PATH}/fzf-tab.plugin.zsh
+     install -D modules/Src/aloxaf/fzftab.so ${INSTALL_PATH}/modules/Src/aloxaf/fzftab.so
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/Aloxaf/fzf-tab";
+    description = "Replace zsh's default completion selection menu with fzf!";
+    license = licenses.mit;
+    maintainers = with maintainers; [ vonfry ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-git-prompt/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-git-prompt/default.nix
new file mode 100644
index 000000000000..f9e5633476ab
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-git-prompt/default.nix
@@ -0,0 +1,70 @@
+# zsh-git-prompt -- Informative git prompt for zsh
+#
+# Usage: to enable this plugin for all users, you could
+# add it to configuration.nix like this:
+#
+#   programs.zsh.interactiveShellInit = ''
+#     source ${pkgs.zsh-git-prompt}/share/zsh-git-prompt/zshrc.sh
+#   '';
+#
+# Or you can install it globally but only enable it in individual
+# users' ~/.zshrc files:
+#
+#   source /run/current-system/sw/share/zsh-git-prompt/zshrc.sh
+#
+# Or if installed locally:
+#
+#   source ~/.nix-profile/share/zsh-git-prompt/zshrc.sh
+#
+# Either way, you then have to set a prompt that incorporates
+# git_super_status, for example:
+#
+#   PROMPT='%B%m%~%b$(git_super_status) %# '
+#
+# More details are in share/doc/zsh-git-prompt/README.md, once
+# installed.
+#
+{ fetchFromGitHub
+, python3
+, git
+, lib
+, haskellPackages
+}:
+
+haskellPackages.callPackage
+  ({ mkDerivation, base, HUnit, parsec, process, QuickCheck }:
+   mkDerivation rec {
+     pname = "zsh-git-prompt";
+     version = "0.4z";  # While we await a real 0.5 release.
+     src = fetchFromGitHub {
+       owner = "starcraftman";
+       repo = "zsh-git-prompt";
+       rev = "11b83ba3b85d14c66cf2ab79faefab6d838da28e";
+       sha256 = "04aylsjfb03ckw219plkzpyiq4j9g66bjxa5pa56h1p7df6pjssb";
+     };
+     prePatch = ''
+        substituteInPlace zshrc.sh                       \
+          --replace ':-"python"' ':-"haskell"'           \
+          --replace 'python '    '${python3.interpreter} ' \
+          --replace 'git '       '${git}/bin/git '
+     '';
+     preCompileBuildDriver = "cd src";
+     postInstall = ''
+        cd ..
+        gpshare=$out/share/${pname}
+        gpdoc=$out/share/doc/${pname}
+        mkdir -p $gpshare/src $gpdoc
+        cp README.md $gpdoc
+        cp zshrc.sh gitstatus.py $gpshare
+        mv $out/bin $gpshare/src/.bin
+     '';
+     isLibrary = false;
+     isExecutable = true;
+     libraryHaskellDepends = [ base parsec process QuickCheck ];
+     executableHaskellDepends = libraryHaskellDepends;
+     testHaskellDepends = [HUnit] ++ libraryHaskellDepends;
+     homepage = "https://github.com/olivierverdier/zsh-git-prompt#readme";
+     description = "Informative git prompt for zsh";
+     license = lib.licenses.mit;
+     maintainers = [lib.maintainers.league];
+   }) {}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-history-search-multi-word/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-history-search-multi-word/default.nix
new file mode 100644
index 000000000000..30d26c967662
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-history-search-multi-word/default.nix
@@ -0,0 +1,31 @@
+{ stdenvNoCC, lib, fetchFromGitHub }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "zsh-history-search-multi-word";
+  version = "unstable-2021-11-13";
+
+  src = fetchFromGitHub {
+    owner = "zdharma-continuum";
+    repo = "history-search-multi-word";
+    rev = "5b44d8cea12351d91fbdc3697916556f59f14b8c";
+    sha256 = "11r2mmy6bg3b6pf6qc0ml3idh333cj8yz754hrvd1sc4ipfkkqh7";
+  };
+
+  strictDeps = true;
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    plugindir="$out/share/zsh/${pname}"
+
+    mkdir -p "$plugindir"
+    cp -r -- history-* hsmw-* "$plugindir"/
+  '';
+
+  meta = with lib; {
+    description = "Multi-word, syntax highlighted history searching for Zsh";
+    homepage = "https://github.com/zdharma-continuum/history-search-multi-word";
+    license = with licenses; [ gpl3 mit ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-history-substring-search/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-history-substring-search/default.nix
new file mode 100644
index 000000000000..4b2aea76a7b7
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-history-substring-search/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, lib, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-history-substring-search";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "zsh-users";
+    repo = "zsh-history-substring-search";
+    rev = "v${version}";
+    sha256 = "0vjw4s0h4sams1a1jg9jx92d6hd2swq4z908nbmmm2qnz212y88r";
+  };
+
+  strictDeps = true;
+  installPhase = ''
+    install -D zsh-history-substring-search.zsh \
+      "$out/share/zsh-history-substring-search/zsh-history-substring-search.zsh"
+  '';
+
+  meta = with lib; {
+    description = "Fish shell history-substring-search for Zsh";
+    homepage = "https://github.com/zsh-users/zsh-history-substring-search";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ qyliss ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-history/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-history/default.nix
new file mode 100644
index 000000000000..6693f466216c
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-history/default.nix
@@ -0,0 +1,37 @@
+{ lib, fetchFromGitHub, buildGoModule, installShellFiles, nixosTests }:
+
+buildGoModule rec {
+  pname = "zsh-history";
+  version = "2019-12-10";
+
+  src = fetchFromGitHub {
+    owner = "b4b4r07";
+    repo = "history";
+    rev = "8da016bd91b0c2eb53c9980f00eee6abdbb097e2";
+    sha256 = "13n643ik1zjvpk8h9458yd9ffahhbdnigmbrbmpn7b7g23wqqsi3";
+  };
+
+  vendorHash = "sha256-n5QFN1B2GjbzylFuW9Y4r0+ioIJlfKwcGK8X3ZwKLI8=";
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  doCheck = false;
+
+  postInstall = ''
+    install -d $out/share
+    cp -r "$NIX_BUILD_TOP/source/misc/"* "$out/share"
+    installShellCompletion --zsh --name _history $out/share/zsh/completions/_history
+  '';
+
+  passthru.tests = {
+    zsh-history-shell-integration = nixosTests.zsh-history;
+  };
+
+  meta = with lib; {
+    description = "A CLI to provide enhanced history for your ZSH shell";
+    homepage = "https://github.com/b4b4r07/history";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+    mainProgram = "history";
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-nix-shell/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-nix-shell/default.nix
new file mode 100644
index 000000000000..8ae87386c259
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-nix-shell/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub, bash }:
+
+# To make use of this derivation, use
+# `programs.zsh.interactiveShellInit = "source ${pkgs.zsh-nix-shell}/share/zsh-nix-shell/nix-shell.plugin.zsh";`
+
+stdenv.mkDerivation rec {
+  pname = "zsh-nix-shell";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "chisui";
+    repo = "zsh-nix-shell";
+    rev = "v${version}";
+    sha256 = "sha256-oQpYKBt0gmOSBgay2HgbXiDoZo5FoUKwyHSlUrOAP5E=";
+  };
+
+  strictDeps = true;
+  buildInputs = [ bash ];
+  installPhase = ''
+    install -D nix-shell.plugin.zsh --target-directory=$out/share/zsh-nix-shell
+    install -D scripts/* --target-directory=$out/share/zsh-nix-shell/scripts
+  '';
+
+  meta = with lib; {
+    description = "zsh plugin that lets you use zsh in nix-shell shell";
+    homepage = src.meta.homepage;
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ aw ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-powerlevel10k/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-powerlevel10k/default.nix
new file mode 100644
index 000000000000..be1d69e3e2e3
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-powerlevel10k/default.nix
@@ -0,0 +1,59 @@
+{ lib, stdenv, fetchFromGitHub, substituteAll, pkgs, bash }:
+
+
+let
+  # match gitstatus version with given `gitstatus_version`:
+  # https://github.com/romkatv/powerlevel10k/blob/master/gitstatus/build.info
+  gitstatus = pkgs.gitstatus.overrideAttrs (oldAtttrs: rec {
+    version = "1.5.4";
+
+    src = fetchFromGitHub {
+      owner = "romkatv";
+      repo = "gitstatus";
+      rev = "refs/tags/v${version}";
+      hash = "sha256-mVfB3HWjvk4X8bmLEC/U8SKBRytTh/gjjuReqzN5qTk=";
+    };
+  });
+in
+stdenv.mkDerivation rec {
+  pname = "powerlevel10k";
+  version = "1.19.0";
+
+  src = fetchFromGitHub {
+    owner = "romkatv";
+    repo = "powerlevel10k";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+hzjSbbrXr0w1rGHm6m2oZ6pfmD6UUDBfPd7uMg5l5c=";
+  };
+
+  strictDeps = true;
+  buildInputs = [ bash ];
+
+  patches = [
+    (substituteAll {
+      src = ./gitstatusd.patch;
+      gitstatusdPath = "${gitstatus}/bin/gitstatusd";
+    })
+  ];
+
+  installPhase = ''
+    install -D powerlevel10k.zsh-theme --target-directory=$out/share/zsh-powerlevel10k
+    install -D powerlevel9k.zsh-theme --target-directory=$out/share/zsh-powerlevel10k
+    install -D config/* --target-directory=$out/share/zsh-powerlevel10k/config
+    install -D internal/* --target-directory=$out/share/zsh-powerlevel10k/internal
+    cp -R gitstatus $out/share/zsh-powerlevel10k/gitstatus
+  '';
+
+  meta = {
+    changelog = "https://github.com/romkatv/powerlevel10k/releases/tag/v${version}";
+    description = "A fast reimplementation of Powerlevel9k ZSH theme";
+    longDescription = ''
+      To make use of this derivation, use
+      `programs.zsh.promptInit = "source ''${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme";`
+    '';
+    homepage = "https://github.com/romkatv/powerlevel10k";
+    license = lib.licenses.mit;
+    platforms = lib.platforms.unix;
+    maintainers = with lib.maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-powerlevel10k/gitstatusd.patch b/nixpkgs/pkgs/shells/zsh/zsh-powerlevel10k/gitstatusd.patch
new file mode 100644
index 000000000000..3d1c1eaa36d4
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-powerlevel10k/gitstatusd.patch
@@ -0,0 +1,13 @@
+diff --git a/gitstatus/gitstatus.plugin.zsh b/gitstatus/gitstatus.plugin.zsh
+index b469072..eb1e3be 100644
+--- a/gitstatus/gitstatus.plugin.zsh
++++ b/gitstatus/gitstatus.plugin.zsh
+@@ -44,6 +44,8 @@
+ 
+ [[ -o 'interactive' ]] || 'return'
+ 
++GITSTATUS_DAEMON=@gitstatusdPath@
++
+ # Temporarily change options.
+ 'builtin' 'local' '-a' '_gitstatus_opts'
+ [[ ! -o 'aliases'         ]] || _gitstatus_opts+=('aliases')
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-powerlevel9k/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-powerlevel9k/default.nix
new file mode 100644
index 000000000000..35d5aa48b0c1
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-powerlevel9k/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation {
+  pname = "powerlevel9k";
+  version = "2017-11-10";
+  src = fetchFromGitHub {
+    owner = "bhilburn";
+    repo = "powerlevel9k";
+    rev = "87acc51acab3ed4fd33cda2386abed6f98c80720";
+    sha256 = "0v1dqg9hvycdkcvklg2njff97xwr8rah0nyldv4xm39r77f4yfvq";
+  };
+
+  strictDeps = true;
+  installPhase= ''
+    install -D powerlevel9k.zsh-theme --target-directory=$out/share/zsh-powerlevel9k
+    install -D functions/* --target-directory=$out/share/zsh-powerlevel9k/functions
+  '';
+
+  meta = {
+    description = "A beautiful theme for zsh";
+    longDescription = ''
+      To make use of this derivation, use
+      `programs.zsh.promptInit = "source ''${pkgs.zsh-powerlevel9k}/share/zsh-powerlevel9k/powerlevel9k.zsh-theme";`
+    '';
+    homepage = "https://github.com/bhilburn/powerlevel9k";
+    license = lib.licenses.mit;
+
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.pierrechevalier83 ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-prezto/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-prezto/default.nix
new file mode 100644
index 000000000000..7c7ba87d848d
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-prezto/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, fetchFromGitHub, unstableGitUpdater, bash }:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-prezto";
+  version = "unstable-2023-09-12";
+
+  src = fetchFromGitHub {
+    owner = "sorin-ionescu";
+    repo = "prezto";
+    rev = "5ac930d96be3a51730f7d9d7330f28d9c9c36e0a";
+    sha256 = "tyroeGADhBRCQ9/WqNSqMV7kvFUPdC2fcs/B5G5qYhI=";
+    fetchSubmodules = true;
+  };
+
+  strictDeps = true;
+  buildInputs = [ bash ];
+
+  postPatch = ''
+    # make zshrc aware of where zsh-prezto is installed
+    sed -i -e "s|\''${ZDOTDIR:\-\$HOME}/.zprezto/|$out/share/zsh-prezto/|g" runcoms/zshrc
+  '';
+
+  installPhase = ''
+    mkdir -p $out/share/zsh-prezto
+    cp -R ./ $out/share/zsh-prezto
+  '';
+
+  passthru.updateScript = unstableGitUpdater {};
+
+  meta = with lib; {
+    description = "The configuration framework for Zsh";
+    longDescription = ''
+      Prezto is the configuration framework for Zsh; it enriches
+      the command line interface environment with sane defaults,
+      aliases, functions, auto completion, and prompt themes.
+    '';
+    homepage = "https://github.com/sorin-ionescu/prezto";
+    license = licenses.mit;
+    maintainers = with maintainers; [ holymonson ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-syntax-highlighting/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-syntax-highlighting/default.nix
new file mode 100644
index 000000000000..86723354ba6c
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-syntax-highlighting/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchFromGitHub, zsh }:
+
+# To make use of this derivation, use the `programs.zsh.enableSyntaxHighlighting` option
+
+stdenv.mkDerivation rec {
+  version = "0.7.1";
+  pname = "zsh-syntax-highlighting";
+
+  src = fetchFromGitHub {
+    owner = "zsh-users";
+    repo = "zsh-syntax-highlighting";
+    rev = version;
+    sha256 = "03r6hpb5fy4yaakqm3lbf4xcvd408r44jgpv4lnzl9asp4sb9qc0";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ zsh ];
+
+  installFlags = [ "PREFIX=$(out)" ];
+
+  meta = with lib; {
+    description = "Fish shell like syntax highlighting for Zsh";
+    homepage = "https://github.com/zsh-users/zsh-syntax-highlighting";
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.loskutov ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-system-clipboard/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-system-clipboard/default.nix
new file mode 100644
index 000000000000..6e875b6ee086
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-system-clipboard/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, lib, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-system-clipboard";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "kutsan";
+    repo = "zsh-system-clipboard";
+    rev = "v${version}";
+    sha256 = "09lqav1mz5zajklr3xa0iaivhpykv3azkjb7yj9wyp0hq3vymp8i";
+  };
+
+  strictDeps = true;
+  installPhase = ''
+    install -D zsh-system-clipboard.zsh $out/share/zsh/${pname}/zsh-system-clipboard.zsh
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/kutsan/zsh-system-clipboard";
+    description = "A plugin that adds key bindings support for ZLE (Zsh Line Editor) clipboard operations for vi emulation keymaps";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ _0qq ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-vi-mode/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-vi-mode/default.nix
new file mode 100644
index 000000000000..372dedcf5d87
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-vi-mode/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-vi-mode";
+  version = "0.10.0";
+
+  src = fetchFromGitHub {
+    owner = "jeffreytse";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-QE6ZwwM2X0aPqNnbVrj0y7w9hmuRf0H1j8nXYwyoLo4=";
+  };
+
+  strictDeps = true;
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/share/${pname}
+    cp *.zsh $out/share/${pname}/
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/jeffreytse/zsh-vi-mode";
+    license = licenses.mit;
+    description = "A better and friendly vi(vim) mode plugin for ZSH.";
+    maintainers = with maintainers; [ kyleondy ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-you-should-use/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-you-should-use/default.nix
new file mode 100644
index 000000000000..b3db825bbba6
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-you-should-use/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "zsh-you-should-use";
+  version = "1.7.3";
+
+  src = fetchFromGitHub {
+    owner = "MichaelAquilina";
+    repo = pname;
+    rev = version;
+    sha256 = "1dz48rd66priqhxx7byndqhbmlwxi1nfw8ik25k0z5k7k754brgy";
+  };
+
+  strictDeps = true;
+  dontBuild = true;
+
+  installPhase = ''
+    install -D you-should-use.plugin.zsh $out/share/zsh/plugins/you-should-use/you-should-use.plugin.zsh
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/MichaelAquilina/zsh-you-should-use";
+    license = licenses.gpl3;
+    description = "ZSH plugin that reminds you to use existing aliases for commands you just typed";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/shells/zsh/zsh-z/default.nix b/nixpkgs/pkgs/shells/zsh/zsh-z/default.nix
new file mode 100644
index 000000000000..a03b81cb6bfd
--- /dev/null
+++ b/nixpkgs/pkgs/shells/zsh/zsh-z/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenvNoCC, fetchFromGitHub }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "zsh-z";
+  version = "unstable-2021-02-15";
+
+  src = fetchFromGitHub {
+    owner = "agkozak";
+    repo = pname;
+    rev = "595c883abec4682929ffe05eb2d088dd18e97557";
+    sha256 = "sha256-HnwUWqzwavh/Qox+siOe5lwTp7PBdiYx+9M0NMNFx00=";
+  };
+
+  strictDeps = true;
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/share/zsh-z
+    cp _zshz zsh-z.plugin.zsh $out/share/zsh-z
+  '';
+
+  meta = with lib; {
+    description = "Jump quickly to directories that you have visited frequently in the past, or recently";
+    homepage = "https://github.com/agkozak/zsh-z";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.evalexpr ];
+  };
+}