aboutsummaryrefslogtreecommitdiffstats
path: root/modules/by-name/ni
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-05-16 16:47:23 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-05-16 16:48:21 +0200
commit01b7dbf69e52957c2f19d6169ef5862f8042c60d (patch)
tree42db8f6baa040696cb4d6befca0fa22c07842ea3 /modules/by-name/ni
parenthosts: Move to a `by-name` schema (diff)
downloadnixos-config-01b7dbf69e52957c2f19d6169ef5862f8042c60d.zip
modules/legacy/nix-index: Migrate to by-name
Diffstat (limited to 'modules/by-name/ni')
-rw-r--r--modules/by-name/ni/nix-index/command_not_found.sh74
-rw-r--r--modules/by-name/ni/nix-index/module.nix44
2 files changed, 118 insertions, 0 deletions
diff --git a/modules/by-name/ni/nix-index/command_not_found.sh b/modules/by-name/ni/nix-index/command_not_found.sh
new file mode 100644
index 00000000..5f7461e6
--- /dev/null
+++ b/modules/by-name/ni/nix-index/command_not_found.sh
@@ -0,0 +1,74 @@
+#!/usr/bin/env dash
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# 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 $?
+}
diff --git a/modules/by-name/ni/nix-index/module.nix b/modules/by-name/ni/nix-index/module.nix
new file mode 100644
index 00000000..06acfc8a
--- /dev/null
+++ b/modules/by-name/ni/nix-index/module.nix
@@ -0,0 +1,44 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+ config,
+ lib,
+ modules,
+ ...
+}: let
+ cfg = config.soispha.programs.nix-index;
+in {
+ options.soispha.programs.nix-index = {
+ enable = lib.mkEnableOption "nix-index";
+ };
+
+ config = lib.mkIf cfg.enable {
+ soispha.programs.zsh.integrations.nix-index = ./command_not_found.sh;
+ home-manager.users.soispha = {
+ imports = [
+ modules.nix-index-database.hmModules.nix-index
+ ];
+
+ programs.nix-index = {
+ enable = true;
+ symlinkToCacheHome = true;
+
+ # Handled by myself (and the script is overridden)
+ enableBashIntegration = false;
+ enableZshIntegration = false;
+ enableFishIntegration = false;
+ };
+
+ programs.nix-index-database = {
+ comma.enable = false;
+ };
+ };
+ };
+}