1{
2 config,
3 lib,
4 pkgs,
5 ...
6}:
7
8let
9 cfg = config.programs.bash;
10in
11{
12 options.programs.bash.completion = {
13 enable = lib.mkEnableOption "Bash completion for all interactive bash shells" // {
14 default = true;
15 };
16
17 package = lib.mkPackageOption pkgs "bash-completion" { };
18 };
19
20 imports = [
21 (lib.mkRenamedOptionModule
22 [ "programs" "bash" "enableCompletion" ]
23 [ "programs" "bash" "completion" "enable" ]
24 )
25 ];
26
27 config = lib.mkIf cfg.completion.enable {
28 programs.bash.promptPluginInit = ''
29 # Check whether we're running a version of Bash that has support for
30 # programmable completion. If we do, enable all modules installed in
31 # the system and user profile in obsolete /etc/bash_completion.d/
32 # directories. Bash loads completions in all
33 # $XDG_DATA_DIRS/bash-completion/completions/
34 # on demand, so they do not need to be sourced here.
35 if shopt -q progcomp &>/dev/null; then
36 . "${cfg.completion.package}/etc/profile.d/bash_completion.sh"
37 nullglobStatus=$(shopt -p nullglob)
38 shopt -s nullglob
39 for p in $NIX_PROFILES; do
40 for m in "$p/etc/bash_completion.d/"*; do
41 . "$m"
42 done
43 done
44 eval "$nullglobStatus"
45 unset nullglobStatus p m
46 fi
47 '';
48 };
49}