b89f941b20
If the user tries to run a program that doesn't exist from Bash, the program name is looked up in a database that maps to Nix package names. If it is found, we print out a message like: $ pdflatex The program ‘pdflatex’ is currently not installed. It is provided by several packages. You can install it by typing one of the following: nix-env -i tetex nix-env -i texlive-core If the environment variable $NIX_AUTO_INSTALL is set, the command is installed and executed automatically: $ hello --version The program ‘hello’ is currently not installed. It is provided by the package ‘hello’, which I will now install for you. installing `hello-2.8' hello (GNU hello) 2.8 Copyright (C) 2011 Free Software Foundation, Inc. ... To use this, you must currently manually put the SQLite programs database in /var/lib/nixos/programs.sqlite. In the future, this file should be provided as part of the NixOS channel so it gets updated automatically. To get a test version: $ curl http://nixos.org/~eelco/programs.sqlite.xz | xz -d > /var/lib/nixos/programs.sqlite
49 lines
1.2 KiB
Nix
49 lines
1.2 KiB
Nix
# This module provides suggestions of packages to install if the user
|
|
# tries to run a missing command in Bash. This is implemented using a
|
|
# SQLite database that maps program names to Nix package names (e.g.,
|
|
# "pdflatex" is mapped to "tetex").
|
|
|
|
{ config, pkgs, ... }:
|
|
|
|
with pkgs.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 ]);
|
|
};
|
|
|
|
in
|
|
|
|
{
|
|
|
|
environment.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 /var/lib/nixos/programs.sqlite ]; then
|
|
# Run the helper program.
|
|
$p "$1"
|
|
# Retry the command if we just installed it.
|
|
if [ $? = 126 ]; then
|
|
"$@"
|
|
fi
|
|
else
|
|
echo "$1: command not found" >&2
|
|
fi
|
|
}
|
|
'';
|
|
|
|
environment.systemPackages = [ commandNotFound ];
|
|
|
|
# TODO: tab completion for uninstalled commands! :-)
|
|
|
|
}
|