#!/usr/bin/env dash # This was taken from the # `${pkgs.nix-index}/etc/profile.d/command-not-found.sh` file on 2024-02-28 # 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() { # 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=$(nix-locate --minimal --no-group --type x --type s --top-level --whole-name --at-root "/bin/$cmd") len=$(if [ -n "$attrs" ]; then echo "$attrs" | wc -l; else echo 0; fi) case "$len" in 0) eprintln "$cmd: command not found" ;; 1) # If only one package provides this, then we can invoke it # without asking the user. # These will not return 127 if they worked correctly. >&2 cat <<EOF The program '$cmd' is currently not installed. A shell will be opened with it. EOF if nix build "$toplevel#$attrs" --no-link; then nix shell "$toplevel#$attrs" return $? else >&2 cat <<EOF Failed to build: '$toplevel#$attrs' $cmd: command not found EOF fi ;; *) >&2 cat <<EOF The program '$cmd' is currently not installed. It is provided by several packages. You can run it once with: EOF awk --assign=toplevel="$toplevel" 'BEGIN{counter=0} {printf("%3s)", counter); printf(" nix shell %s#%s\n", toplevel, $1); counter+=1}' "$(ptmp "$attrs")" ;; esac return 127 # command not found should always exit with 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 $? }