Improve command-not-found
diff --git a/patches/nix-index/better-command-not-found.patch b/patches/nix-index/better-command-not-found.patch
new file mode 100644
index 0000000..a21b007
--- /dev/null
+++ b/patches/nix-index/better-command-not-found.patch
@@ -0,0 +1,162 @@
+From 5c53c16ed4634acca31c637c077363abacc7e3b4 Mon Sep 17 00:00:00 2001
+From: Skyler <skyler3665@gmail.com>
+Date: Thu, 15 Sep 2022 14:08:26 +0100
+Subject: [PATCH] Update command-not-found.sh
+
+---
+ command-not-found.sh | 129 +++++--------------------------------------
+ 1 file changed, 14 insertions(+), 115 deletions(-)
+
+diff --git a/command-not-found.sh b/command-not-found.sh
+index e542c49..ad87a91 100755
+--- a/command-not-found.sh
++++ b/command-not-found.sh
+@@ -1,134 +1,33 @@
+ #!/bin/sh
++# From https://gist.github.com/InternetUnexplorer/58e979642102d66f57188764bbf11701
+ 
+-# for bash 4
+-# this will be called when a command is entered
+-# but not found in the user’s path + environment
+ command_not_found_handle () {
+-
+-    # TODO: use "command not found" gettext translations
+-
+-    # taken from http://www.linuxjournal.com/content/bash-command-not-found
+-    # - do not run when inside Midnight Commander or within a Pipe
+     if [ -n "${MC_SID-}" ] || ! [ -t 1 ]; then
+         >&2 echo "$1: command not found"
+         return 127
+     fi
+ 
+-    toplevel=nixpkgs # nixpkgs should always be available even in NixOS
+-    cmd=$1
+-    attrs=$(@out@/bin/nix-locate --minimal --no-group --type x --type s --top-level --whole-name --at-root "/bin/$cmd")
+-    len=$(echo -n "$attrs" | grep -c "^")
++    echo -n "searching nix-index..."
++    ATTRS=$(@nix-locate@ --minimal --no-group --type x --type s --top-level --whole-name --at-root "/bin/$1")
+ 
+-    case $len in
++    case `echo -n "$ATTRS" | grep -c "^"` in
+         0)
+-            >&2 echo "$cmd: command not found"
+-            ;;
+-        1)
+-            # if only 1 package provides this, then we can invoke it
+-            # without asking the users if they have opted in with one
+-            # of 2 environment variables
+-
+-            # they are based on the ones found in
+-            # command-not-found.sh:
+-
+-            #   NIX_AUTO_INSTALL : install the missing command into the
+-            #                      user’s environment
+-            #   NIX_AUTO_RUN     : run the command transparently inside of
+-            #                      nix shell
+-
+-            # these will not return 127 if they worked correctly
+-
+-            if ! [ -z "${NIX_AUTO_INSTALL-}" ]; then
+-                >&2 cat <<EOF
+-The program '$cmd' is currently not installed. It is provided by
+-the package '$toplevel.$attrs', which I will now install for you.
+-EOF
+-                if [ -e "$HOME/.nix-profile/manifest.json" ]; then
+-                    nix profile install $toplevel#$attrs
+-                else
+-                    nix-env -iA $toplevel.$attrs
+-                fi
+-                if [ "$?" -eq 0 ]; then
+-                    $@ # TODO: handle pipes correctly if AUTO_RUN/INSTALL is possible
+-                    return $?
+-                else
+-                    >&2 cat <<EOF
+-Failed to install $toplevel.attrs.
+-$cmd: command not found
+-EOF
+-                fi
+-            elif ! [ -z "${NIX_AUTO_RUN-}" ]; then
+-                nix-build --no-out-link -A $attrs "<$toplevel>"
+-                if [ "$?" -eq 0 ]; then
+-                    # how nix-shell handles commands is weird
+-                    # $(echo $@) is need to handle this
+-                    nix-shell -p $attrs --run "$(echo $@)"
+-                    return $?
+-                else
+-                    >&2 cat <<EOF
+-Failed to install $toplevel.attrs.
+-$cmd: command not found
+-EOF
+-                fi
+-            else
+-                if [ -e "$HOME/.nix-profile/manifest.json" ]; then
+-                    >&2 cat <<EOF
+-The program '$cmd' is currently not installed. You can install it
+-by typing:
+-  nix profile install $toplevel#$attrs
+-
+-Or run it once with:
+-  nix run $toplevel#$attrs --command ...
+-EOF
+-                else
+-                    >&2 cat <<EOF
+-The program '$cmd' is currently not installed. You can install it
+-by typing:
+-  nix-env -iA $toplevel.$attrs
+-
+-Or run it once with:
+-  nix-shell -p $attrs --run ...
+-EOF
+-                fi
+-            fi
++            >&2 echo -ne "$(@tput@ el1)\r"
++            >&2 echo "$1: command not found"
+             ;;
+         *)
+-            >&2 cat <<EOF
+-The program '$cmd' is currently not installed. It is provided by
+-several packages. You can install it by typing one of the following:
+-EOF
+-
+-            # ensure we get each element of attrs
+-            # in a cross platform way
+-            while read attr; do
+-                if [ -e "$HOME/.nix-profile/manifest.json" ]; then
+-                    >&2 echo "  nix profile install $toplevel#$attr"
+-                else
+-                    >&2 echo "  nix-env -iA $toplevel.$attr"
+-                fi
+-            done <<< "$attrs"
+-
+-            >&2 cat <<EOF
+-
+-Or run it once with:
+-EOF
+-
+-            while read attr; do
+-                if [ -e "$HOME/.nix-profile/manifest.json" ]; then
+-                    >&2 echo "  nix run $toplevel#$attr --command ..."
+-                else
+-                    >&2 echo "  nix-shell -p $attr --run ..."
+-                fi
+-            done <<< "$attrs"
+-            ;;
++            >&2 echo -ne "$(@tput@ el1)\r"
++            >&2 echo "The program ‘$(@tput@ setaf 4)$1$(@tput@ sgr0)’ is currently not installed."
++            >&2 echo "You can use one of the following commands to open it in an ephemeral shell:"
++            while read ATTR; do
++                ATTR=$(echo "$ATTR" | sed 's|\.out$||') # Strip trailing '.out'
++                >&2 echo "  nix shell $(@tput@ setaf 12)nixpkgs#$(@tput@ setaf 4)$ATTR$(@tput@ sgr0)"
++            done <<< "$ATTRS"
+     esac
+ 
+-    return 127 # command not found should always exit with 127
++    return 127
+ }
+ 
+-# for zsh...
+-# we just pass it to the bash handler above
+-# apparently they work identically
+ command_not_found_handler () {
+     command_not_found_handle $@
+     return $?