diff options
author | Soispha <soispha@vhack.eu> | 2024-02-28 20:26:18 +0100 |
---|---|---|
committer | Soispha <soispha@vhack.eu> | 2024-02-28 20:26:18 +0100 |
commit | c733f3326a34a57dfab4c17da659316fdb6eab6a (patch) | |
tree | 1f94d7c4ad524649dfe207a25c0c3781b2909476 /hm/soispha/conf/zsh/config | |
parent | chore(hm/soispha/conf/taskwarrior/projects): Update (diff) | |
download | nixos-config-c733f3326a34a57dfab4c17da659316fdb6eab6a.zip |
feat(hm): Add nix-index and associated command_not_found_handler
Diffstat (limited to 'hm/soispha/conf/zsh/config')
-rw-r--r-- | hm/soispha/conf/zsh/config/command_not_found.sh | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/hm/soispha/conf/zsh/config/command_not_found.sh b/hm/soispha/conf/zsh/config/command_not_found.sh new file mode 100644 index 00000000..ae6de636 --- /dev/null +++ b/hm/soispha/conf/zsh/config/command_not_found.sh @@ -0,0 +1,64 @@ +#!/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=$(echo "$attrs" | wc -l) + + 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. + + 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 + counter=0 + while read -r attr; do + eprintln "$(printf "%3s" "$counter") nix shell $toplevel#$attr" + counter=$((counter + 1)) + done <"$(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 $? +} |