aboutsummaryrefslogtreecommitdiffstats
path: root/hm/soispha/conf/zsh/config
diff options
context:
space:
mode:
authorSoispha <soispha@vhack.eu>2024-02-28 20:26:18 +0100
committerSoispha <soispha@vhack.eu>2024-02-28 20:26:18 +0100
commitc733f3326a34a57dfab4c17da659316fdb6eab6a (patch)
tree1f94d7c4ad524649dfe207a25c0c3781b2909476 /hm/soispha/conf/zsh/config
parentchore(hm/soispha/conf/taskwarrior/projects): Update (diff)
downloadnixos-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.sh64
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 $?
+}