From 821df406c9726270bf6faf35be95c56593080711 Mon Sep 17 00:00:00 2001
From: Mario Rodas <marsam@users.noreply.github.com>
Date: Sun, 20 Jan 2019 13:02:55 -0500
Subject: [PATCH] z-lua: add module

---
 modules/modules.nix        |  1 +
 modules/programs/z-lua.nix | 86 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+)
 create mode 100644 modules/programs/z-lua.nix

diff --git a/modules/modules.nix b/modules/modules.nix
index 5674588b6..e2fc86df7 100644
--- a/modules/modules.nix
+++ b/modules/modules.nix
@@ -86,6 +86,7 @@ let
     (loadModule ./programs/vim.nix { })
     (loadModule ./programs/vscode.nix { })
     (loadModule ./programs/vscode/haskell.nix { })
+    (loadModule ./programs/z-lua.nix { })
     (loadModule ./programs/zathura.nix { })
     (loadModule ./programs/zsh.nix { })
     (loadModule ./services/blueman-applet.nix { })
diff --git a/modules/programs/z-lua.nix b/modules/programs/z-lua.nix
new file mode 100644
index 000000000..245eff6a5
--- /dev/null
+++ b/modules/programs/z-lua.nix
@@ -0,0 +1,86 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+  cfg = config.programs.z-lua;
+
+  aliases = {
+    zz = "z -c";         # restrict matches to subdirs of $PWD
+    zi = "z -i";         # cd with interactive selection
+    zf = "z -I";         # use fzf to select in multiple matches
+    zb = "z -b";         # quickly cd to the parent directory
+    zh = "z -I -t .";    # fzf
+  };
+
+in
+
+{
+  meta.maintainers = [ maintainers.marsam ];
+
+  options.programs.z-lua = {
+    enable = mkEnableOption "z.lua";
+
+    options = mkOption {
+      type = types.listOf types.str;
+      default = [];
+      example = [ "enhanced" "once" "fzf" ];
+      description = ''
+        List of options to pass to z.lua.
+      '';
+    };
+
+    enableBashIntegration = mkOption {
+      default = true;
+      type = types.bool;
+      description = ''
+        Whether to enable Bash integration.
+      '';
+    };
+
+    enableZshIntegration = mkOption {
+      default = true;
+      type = types.bool;
+      description = ''
+        Whether to enable Zsh integration.
+      '';
+    };
+
+    enableFishIntegration = mkOption {
+      default = true;
+      type = types.bool;
+      description = ''
+        Whether to enable Fish integration.
+      '';
+    };
+
+    enableAliases = mkOption {
+      default = false;
+      type = types.bool;
+      description = ''
+        Whether to enable recommended z.lua aliases.
+      '';
+    };
+  };
+
+  config = mkIf cfg.enable {
+    home.packages = [ pkgs.z-lua ];
+
+    programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
+      eval "$(${pkgs.z-lua}/bin/z --init bash ${concatStringsSep " " cfg.options})"
+    '';
+
+    programs.zsh.initExtra = mkIf cfg.enableZshIntegration ''
+      eval "$(${pkgs.z-lua}/bin/z --init zsh ${concatStringsSep " " cfg.options})"
+    '';
+
+    programs.fish.shellInit = mkIf cfg.enableFishIntegration ''
+      source (${pkgs.z-lua}/bin/z --init fish ${concatStringsSep " " cfg.options} | psub)
+    '';
+
+    programs.bash.shellAliases = mkIf cfg.enableAliases aliases;
+
+    programs.zsh.shellAliases = mkIf cfg.enableAliases aliases;
+  };
+}