command-not-found: add options

add option to disable command-not-found as well as option to define dbPath.
Disabling this may remove the perl dependency for bash/zsh prompts

makefu 5a5db609 f0fac3b5

Changed files
+56 -39
nixos
modules
programs
+55 -38
nixos/modules/programs/command-not-found/command-not-found.nix
···
with lib;
let
-
commandNotFound = pkgs.substituteAll {
name = "command-not-found";
dir = "bin";
src = ./command-not-found.pl;
isExecutable = true;
inherit (pkgs) perl;
perlFlags = concatStrings (map (path: "-I ${path}/lib/perl5/site_perl ")
[ pkgs.perlPackages.DBI pkgs.perlPackages.DBDSQLite pkgs.perlPackages.StringShellQuote ]);
};
···
in
{
-
programs.bash.interactiveShellInit =
-
''
-
# This function is called whenever a command is not found.
-
command_not_found_handle() {
-
local p=/run/current-system/sw/bin/command-not-found
-
if [ -x $p -a -f /nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite ]; then
-
# Run the helper program.
-
$p "$@"
-
# Retry the command if we just installed it.
-
if [ $? = 126 ]; then
-
"$@"
else
return 127
fi
-
else
-
echo "$1: command not found" >&2
-
return 127
-
fi
-
}
-
'';
-
programs.zsh.interactiveShellInit =
-
''
-
# This function is called whenever a command is not found.
-
command_not_found_handler() {
-
local p=/run/current-system/sw/bin/command-not-found
-
if [ -x $p -a -f /nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite ]; then
-
# Run the helper program.
-
$p "$@"
-
# Retry the command if we just installed it.
-
if [ $? = 126 ]; then
-
"$@"
fi
-
else
-
# Indicate than there was an error so ZSH falls back to its default handler
-
return 127
-
fi
-
}
-
'';
-
environment.systemPackages = [ commandNotFound ];
-
-
# TODO: tab completion for uninstalled commands! :-)
}
···
with lib;
let
+
cfg = config.programs.command-not-found;
commandNotFound = pkgs.substituteAll {
name = "command-not-found";
dir = "bin";
src = ./command-not-found.pl;
isExecutable = true;
inherit (pkgs) perl;
+
inherit (cfg) dbPath;
perlFlags = concatStrings (map (path: "-I ${path}/lib/perl5/site_perl ")
[ pkgs.perlPackages.DBI pkgs.perlPackages.DBDSQLite pkgs.perlPackages.StringShellQuote ]);
};
···
in
{
+
options.programs.command-not-found = {
+
+
enable = mkEnableOption "command-not-found hook for interactive shell";
+
dbPath = mkOption {
+
default = "/nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite" ;
+
description = ''
+
Absolute path to programs.sqlite.
+
+
By default this file will be provided by your channel
+
(nixexprs.tar.xz).
+
'';
+
type = types.path;
+
};
+
};
+
+
config = mkIf cfg.enable {
+
programs.bash.interactiveShellInit =
+
''
+
# This function is called whenever a command is not found.
+
command_not_found_handle() {
+
local p=${commandNotFound}
+
if [ -x $p -a -f ${cfg.dbPath} ]; then
+
# Run the helper program.
+
$p "$@"
+
# Retry the command if we just installed it.
+
if [ $? = 126 ]; then
+
"$@"
+
else
+
return 127
+
fi
else
+
echo "$1: command not found" >&2
return 127
fi
+
}
+
'';
+
programs.zsh.interactiveShellInit =
+
''
+
# This function is called whenever a command is not found.
+
command_not_found_handler() {
+
local p=${commandNotFound}
+
if [ -x $p -a -f ${cfg.dbPath} ]; then
+
# Run the helper program.
+
$p "$@"
+
# Retry the command if we just installed it.
+
if [ $? = 126 ]; then
+
"$@"
+
fi
+
else
+
# Indicate than there was an error so ZSH falls back to its default handler
+
echo "$1: command not found" >&2
+
return 127
fi
+
}
+
'';
+
environment.systemPackages = [ commandNotFound ];
+
};
}
+1 -1
nixos/modules/programs/command-not-found/command-not-found.pl
···
my $program = $ARGV[0];
-
my $dbPath = "/nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite";
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "")
or die "cannot open database `$dbPath'";
···
my $program = $ARGV[0];
+
my $dbPath = "@dbPath@";
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "")
or die "cannot open database `$dbPath'";