3
0
Fork 0
forked from mirrors/nixpkgs

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
This commit is contained in:
makefu 2017-04-17 01:49:57 +02:00
parent f0fac3b578
commit 5a5db609e5
No known key found for this signature in database
GPG key ID: 36F7711F3FC0F225
2 changed files with 56 additions and 39 deletions

View file

@ -8,13 +8,14 @@
with lib; with lib;
let let
cfg = config.programs.command-not-found;
commandNotFound = pkgs.substituteAll { commandNotFound = pkgs.substituteAll {
name = "command-not-found"; name = "command-not-found";
dir = "bin"; dir = "bin";
src = ./command-not-found.pl; src = ./command-not-found.pl;
isExecutable = true; isExecutable = true;
inherit (pkgs) perl; inherit (pkgs) perl;
inherit (cfg) dbPath;
perlFlags = concatStrings (map (path: "-I ${path}/lib/perl5/site_perl ") perlFlags = concatStrings (map (path: "-I ${path}/lib/perl5/site_perl ")
[ pkgs.perlPackages.DBI pkgs.perlPackages.DBDSQLite pkgs.perlPackages.StringShellQuote ]); [ pkgs.perlPackages.DBI pkgs.perlPackages.DBDSQLite pkgs.perlPackages.StringShellQuote ]);
}; };
@ -22,50 +23,66 @@ let
in in
{ {
options.programs.command-not-found = {
programs.bash.interactiveShellInit = enable = mkEnableOption "command-not-found hook for interactive shell";
''
# This function is called whenever a command is not found. dbPath = mkOption {
command_not_found_handle() { default = "/nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite" ;
local p=/run/current-system/sw/bin/command-not-found description = ''
if [ -x $p -a -f /nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite ]; then Absolute path to programs.sqlite.
# Run the helper program.
$p "$@" By default this file will be provided by your channel
# Retry the command if we just installed it. (nixexprs.tar.xz).
if [ $? = 126 ]; then '';
"$@" 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 else
echo "$1: command not found" >&2
return 127 return 127
fi fi
else }
echo "$1: command not found" >&2 '';
return 127
fi
}
'';
programs.zsh.interactiveShellInit = programs.zsh.interactiveShellInit =
'' ''
# This function is called whenever a command is not found. # This function is called whenever a command is not found.
command_not_found_handler() { command_not_found_handler() {
local p=/run/current-system/sw/bin/command-not-found local p=${commandNotFound}
if [ -x $p -a -f /nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite ]; then if [ -x $p -a -f ${cfg.dbPath} ]; then
# Run the helper program. # Run the helper program.
$p "$@" $p "$@"
# Retry the command if we just installed it. # Retry the command if we just installed it.
if [ $? = 126 ]; then 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 fi
else }
# Indicate than there was an error so ZSH falls back to its default handler '';
return 127
fi
}
'';
environment.systemPackages = [ commandNotFound ]; environment.systemPackages = [ commandNotFound ];
};
# TODO: tab completion for uninstalled commands! :-)
} }

View file

@ -8,7 +8,7 @@ use Config;
my $program = $ARGV[0]; my $program = $ARGV[0];
my $dbPath = "/nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite"; my $dbPath = "@dbPath@";
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "") my $dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "")
or die "cannot open database `$dbPath'"; or die "cannot open database `$dbPath'";