diff --git a/profiles/shell.nix b/profiles/shell.nix index b0b4bd9..75389d9 100644 --- a/profiles/shell.nix +++ b/profiles/shell.nix @@ -82,7 +82,6 @@ # nix utils nix-output-monitor nix-top - nix-search-cli # nix-search nix-diff comma ]; diff --git a/users/pbsds/home/default.nix b/users/pbsds/home/default.nix index 7e284a5..8097e9e 100644 --- a/users/pbsds/home/default.nix +++ b/users/pbsds/home/default.nix @@ -106,7 +106,6 @@ nurl manix #comma # collides with nix-index-database - nix-search-cli # nix-search devenv nix-fast-build nix-eval-jobs diff --git a/users/pbsds/home/profiles/bashrc.d/nix-search.sh b/users/pbsds/home/profiles/bashrc.d/nix-search.sh index e857f8f..a2e10cc 100644 --- a/users/pbsds/home/profiles/bashrc.d/nix-search.sh +++ b/users/pbsds/home/profiles/bashrc.d/nix-search.sh @@ -1,6 +1,6 @@ nix-search() ( set -euo pipefail - flake="${1:-nixpkgs}" + local flake="${1:-nixpkgs}"; shift ||: trace(){ if [[ -t 2 ]]; then @@ -14,21 +14,25 @@ nix-search() ( command -v nix >/dev/null || die "ERROR: 'nix' not in PATH" command -v jq >/dev/null || die "ERROR: 'jq' not in PATH" command -v fzf >/dev/null || die "ERROR: 'fzf' not in PATH" - command -v bat >/dev/null || die "ERROR: 'fzf' not in PATH" + command -v bat >/dev/null || die "ERROR: 'bat' not in PATH" command -v tr >/dev/null || die "ERROR: 'tr' not in PATH" command -v sed >/dev/null || die "ERROR: 'sed' not in PATH" command -v grep >/dev/null || die "ERROR: 'grep' not in PATH" command -v sort >/dev/null || die "ERROR: 'sort' not in PATH" + if [[ -t 1 ]] && ! command -v gum >/dev/null; then + trace "WARNING: 'gum' not in PATH, no action menu will be provided" + fi - nixpkgs=$(nix eval "$flake"#path --json | jq . -r) # --raw hangs? - cache="${XDG_CACHE_HOME:-"$HOME/.cache"}/nix-search-sh" + # local nixpkgs=$(nix eval "$flake"#path --json | jq . -r) # --raw hangs? + local nixpkgs=$(nix flake metadata "$flake" --json | jq .path -r) + local cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}/nix-search-sh" - export storepath="$cache"/"${flake//"/"/--}"/path - export packages_json="$cache"/"${flake//"/"/--}"/packages.json - export packages_tsv="$cache"/"${flake//"/"/--}"/packages.tsv + export storepath="$cachedir"/"${flake//"/"/--}"/path + export packages_json="$cachedir"/"${flake//"/"/--}"/packages.json + export packages_tsv="$cachedir"/"${flake//"/"/--}"/packages.tsv if [[ ! -f "$storepath" || "$nixpkgs" != "$(cat "$storepath")" ]]; then - mkdir -p "$cache"/"$flake" + mkdir -p "$cachedir"/"$flake" # TODO: somehow inherit if user has configured allowUnfree and such in any file trace "Indexing..." @@ -59,7 +63,7 @@ nix-search() ( show-package() { local attrpath="$(head -n1 <<<"$1")" - printf "%s\n" "(toggle preview with 'alt-enter')" + printf "%s\n" "(toggle preview with 'alt-enter', scroll with '{shift,alt}-{up,down}')" printf "\n" grep -F -- $'--\t'"$attrpath"$'\t' "$packages_tsv" | cut -f4 | jq '. | [ @@ -80,18 +84,73 @@ nix-search() ( ' -r | bat --style=plain --language yaml --color=always } - # attrpaths=$( - cut <"$packages_tsv" -f2-3 | tr '\n' '\0' | tr '\t' '\n' \ - | fzf --read0 --print0 --gap 1 --reverse --bind 'ctrl-a:toggle-all' --bind 'alt-enter:toggle-preview' --multi --tiebreak=begin --preview "$(declare -f show-package); show-package {}" \ - | tr '\n\0' '\t\n' | cut -f1 - # ) + local fzf_config=( + --reverse + --bind 'ctrl-a:toggle-all' + --bind 'alt-enter:toggle-preview' + # --bind 'shift-page-up:preview-page-up' + # --bind 'shift-page-down:preview-page-down' + # --bind 'ctrl-page-up:preview-page-up' + # --bind 'ctrl-page-down:preview-page-down' + --bind 'alt-up:preview-up' + --bind 'alt-down:preview-down' + --bind 'shift-up:preview-page-up' + --bind 'shift-down:preview-page-down' + ) - # if [[ "$(wc -l <<<"$attrpaths")" -eq 1 ]]; then - # trace " nix profile install $flake#$attrpaths" - # trace " nix run $flake#$attrpaths" - # trace " nix shell $flake#$attrpaths^*" - # trace " nix-shell '<$flake>' -A $flake#$attrpaths" - # fi + local -a attributes + readarray -d $'\n' -t attributes < <( + cut <"$packages_tsv" -f2-3 | tr '\n' '\0' | tr '\t' '\n' \ + | fzf --read0 --print0 --gap 1 --multi --tiebreak=begin "${fzf_config[@]}" --preview "$(declare -f show-package); show-package {}" \ + | tr '\n\0' '\t\n' | cut -f1 + ) - # cat <<<"$attrpaths" + if [[ "${#attributes[@]}" -gt 0 ]]; then + if [[ ! -t 1 ]] || ! command -v gum >/dev/null; then + printf "%s\n" "${attributes[@]}" + else + local -a menu=( + "print : 'printf' the packages" + "print2 : 'printf' the packages with flake prefixed" + "build : 'nix-build' the packages" + "install : 'nix profile install' the packages" + # "enter : 'nix-shell' the packages and modify this environment" + "shell : 'nix shell ...' the packages" + "shell2 : 'nix shell ...^*' the packages" + "shell3 : 'nix-shell ...' the packages" + ) + case "$(gum choose "${menu[@]}" | cut -d' ' -f1)" in + print) + printf "%s\n" "${attributes[@]}" + ;; + print2) + printf "%s\n" "${attributes[@]/#/"$flake#"}" + ;; + build) + if command -v nom-build >/dev/null; then + eval "nom-build '$nixpkgs' ${attributes[*]/#/-A }" + else + eval "nix-build '$nixpkgs' ${attributes[*]/#/-A }" + fi + ;; + install) + nix profile install "${attributes[@]/#/"$flake#"}" + ;; + shell) + nix shell "${attributes[@]/#/"$flake#"}" + ;; + shell2) + local -a attributes_all=("${attributes[@]/%/'^*'}") + nix shell "${attributes_all[@]/#/"$flake#"}" + ;; + shell3) + eval "nix-shell '$nixpkgs' ${attributes[*]/#/-A }" + ;; + *) + die "unknown option" + exit 1 + ;; + esac + fi + fi )