{ lib, pkgs, config, ... }: let inherit (lib) mkIf mkEnableOption mkOption types; cfg = config.chuj.stuff.fish; user = config.chuj.system.user; in { options.chuj.stuff.fish = { enable = mkEnableOption "fish"; aliases = mkOption { type = types.attrs; default = {}; }; abbrs = mkOption { type = types.attrs; default = {}; }; functions = mkOption { type = types.attrs; default = {}; }; }; config = mkIf cfg.enable { environment.systemPackages = [ pkgs.fish ]; programs.fish.enable = true; users.users.${user}.shell = pkgs.fish; programs.fish.promptInit = '' ${lib.getExe pkgs.any-nix-shell} fish --info-right | source ''; home-manager.users.${user}.programs.fish = { enable = true; shellAliases = let XDG_DATA_HOME = config.home-manager.users.${user}.xdg.dataHome; yt-dlp = lib.getExe pkgs.yt-dlp; curl = lib.getExe pkgs.curl; wget = lib.getExe pkgs.wget; xclip = lib.getExe pkgs.xclip; in { "ytmp3" = "${yt-dlp} -o '%(title)s.%(ext)s' -x --audio-format mp3"; "myip" = "${curl} ifconfig.me"; "wget" = "${wget} --hsts-file='${XDG_DATA_HOME}/wget-hsts'"; "2clip" = "${xclip} -selection clipboard"; } // cfg.aliases; shellAbbrs = { "ls" = "eza -lhs type"; "cp" = "cp -v"; "mv" = "mv -v"; } // cfg.abbrs; shellInit = '' set -g __fish_git_prompt_char_stateseparator "|" set -g __fish_git_prompt_char_cleanstate "" set -g __fish_git_prompt_char_dirtystate "+" set -g __fish_git_prompt_char_invalidstate "x" set -g __fish_git_prompt_char_stagedstate "*" set -g __fish_git_prompt_char_stashstate "\$" set -g __fish_git_prompt_char_untrackedfiles "%" set -g __fish_git_prompt_char_upstream_ahead "^" set -g __fish_git_prompt_char_upstream_behind "v" set -g __fish_git_prompt_char_upstream_diverged "<>" set -g __fish_git_prompt_char_upstream_equal "=" # set __fish_git_prompt_char_upstream_prefix "" ''; functions = let readlink = lib.getExe' pkgs.coreutils "readlink"; which = lib.getExe pkgs.which; curl = lib.getExe pkgs.curl; fortune = lib.getExe (pkgs.fortune.override { withOffensive = true; }); in { "WHICH" = "${readlink} -f $(${which} $argv[1])"; "0x0" = ''${curl} -F"file=@$argv[1]" https://0x0.st''; "fish_greeting" = "${fortune}"; "fish_prompt" = '' # name: Informative Vcs # author: Mariusz Smykula # function fish_prompt --description 'Write out the prompt' set -l last_pipestatus $pipestatus set -lx __fish_last_status $status # Export for __fish_print_pipestatus. if not set -q __fish_git_prompt_show_informative_status set -g __fish_git_prompt_show_informative_status 1 end if not set -q __fish_git_prompt_hide_untrackedfiles set -g __fish_git_prompt_hide_untrackedfiles 1 end if not set -q __fish_git_prompt_color_branch set -g __fish_git_prompt_color_branch magenta --bold end if not set -q __fish_git_prompt_showupstream set -g __fish_git_prompt_showupstream informative end if not set -q __fish_git_prompt_color_dirtystate set -g __fish_git_prompt_color_dirtystate blue end if not set -q __fish_git_prompt_color_stagedstate set -g __fish_git_prompt_color_stagedstate yellow end if not set -q __fish_git_prompt_color_invalidstate set -g __fish_git_prompt_color_invalidstate red end if not set -q __fish_git_prompt_color_untrackedfiles set -g __fish_git_prompt_color_untrackedfiles $fish_color_normal end if not set -q __fish_git_prompt_color_cleanstate set -g __fish_git_prompt_color_cleanstate green --bold end set -l color_cwd set -l suffix if functions -q fish_is_root_user; and fish_is_root_user if set -q fish_color_cwd_root set color_cwd $fish_color_cwd_root else set color_cwd $fish_color_cwd end set suffix '#' else set color_cwd $fish_color_cwd set suffix '$' end # PWD set_color $color_cwd echo -n (prompt_pwd) set_color normal printf '%s ' (fish_vcs_prompt) set -l status_color (set_color $fish_color_status) set -l statusb_color (set_color --bold $fish_color_status) set -l prompt_status (__fish_print_pipestatus "[" "]" "|" "$status_color" "$statusb_color" $last_pipestatus) echo -n $prompt_status set_color normal echo -n "$suffix " # end ''; } // cfg.functions; }; }; }