1{
2 config,
3 lib,
4 pkgs,
5 ...
6}:
7let
8 inherit (lib.options) mkEnableOption mkPackageOption mkOption;
9 inherit (lib.modules) mkIf;
10 inherit (lib.meta) getExe;
11 inherit (lib.types) listOf str;
12 inherit (lib.strings) concatStringsSep;
13
14 cfg = config.programs.zoxide;
15
16 cfgFlags = concatStringsSep " " cfg.flags;
17
18in
19{
20 options.programs.zoxide = {
21 enable = mkEnableOption "zoxide, a smarter cd command that learns your habits";
22 package = mkPackageOption pkgs "zoxide" { };
23
24 enableBashIntegration = mkEnableOption "Bash integration" // {
25 default = true;
26 };
27 enableZshIntegration = mkEnableOption "Zsh integration" // {
28 default = true;
29 };
30 enableFishIntegration = mkEnableOption "Fish integration" // {
31 default = true;
32 };
33 enableXonshIntegration = mkEnableOption "Xonsh integration" // {
34 default = true;
35 };
36
37 flags = mkOption {
38 type = listOf str;
39 default = [ ];
40 example = [
41 "--no-cmd"
42 "--cmd j"
43 ];
44 description = ''
45 List of flags for zoxide init
46 '';
47 };
48
49 };
50
51 config = mkIf cfg.enable {
52 environment.systemPackages = [ cfg.package ];
53
54 programs = {
55 zsh.interactiveShellInit = mkIf cfg.enableZshIntegration ''
56 eval "$(${getExe cfg.package} init zsh ${cfgFlags} )"
57 '';
58 bash.interactiveShellInit = mkIf cfg.enableBashIntegration ''
59 eval "$(${getExe cfg.package} init bash ${cfgFlags} )"
60 '';
61 fish.interactiveShellInit = mkIf cfg.enableFishIntegration ''
62 ${getExe cfg.package} init fish ${cfgFlags} | source
63 '';
64 xonsh.config = ''
65 execx($(${getExe cfg.package} init xonsh ${cfgFlags}), 'exec', __xonsh__.ctx, filename='zoxide')
66 '';
67 };
68
69 };
70
71 meta.maintainers = with lib.maintainers; [ heisfer ];
72}