{ config, lib, pkgs, ... }: with lib; { meta.maintainers = [ hm.maintainers.kalhauge ]; options.programs.exa = { enable = mkEnableOption "exa, a modern replacement for ls"; enableAliases = mkEnableOption "recommended exa aliases (ls, ll…)"; extraOptions = mkOption { type = types.listOf types.str; default = [ ]; example = [ "--group-directories-first" "--header" ]; description = '' Extra command line options passed to exa. ''; }; icons = mkOption { type = types.bool; default = false; description = '' Display icons next to file names ( argument). ''; }; git = mkOption { type = types.bool; default = false; description = '' List each file's Git status if tracked or ignored ( argument). ''; }; package = mkPackageOption pkgs "exa" { }; }; config = let cfg = config.programs.exa; args = escapeShellArgs (optional cfg.icons "--icons" ++ optional cfg.git "--git" ++ cfg.extraOptions); aliases = { exa = "exa ${args}"; } // optionalAttrs cfg.enableAliases { ls = "exa"; ll = "exa -l"; la = "exa -a"; lt = "exa --tree"; lla = "exa -la"; }; in mkIf cfg.enable { home.packages = [ cfg.package ]; programs.bash.shellAliases = aliases; programs.zsh.shellAliases = aliases; programs.fish.shellAliases = aliases; programs.ion.shellAliases = aliases; }; }