{ lib, pkgs, config, hostname, ... }: let inherit (lib) mkIf mkEnableOption mkOption types mergeAttrs; cfg = config.chuj.stuff.fish; user = config.chuj.system.user; in { options.chuj.stuff.fish = { enable = mkEnableOption "fish"; extraAliases = mkOption { type = types.attrs; default = {}; }; }; config = let XDG_DATA_HOME = config.home-manager.users.${user}.xdg.dataHome; in mkIf cfg.enable { environment.systemPackages = [ pkgs.fish ]; programs.fish.enable = true; users.users.${user}.shell = pkgs.fish; programs.fish.promptInit = '' ${pkgs.any-nix-shell}/bin/any-nix-shell fish --info-right | source ''; home-manager.users.${user}.programs.fish = { enable = true; # todo: move some to abbrs shellAliases = mergeAttrs { "ls" = "${pkgs.eza}/bin/eza -lhs type"; "cp" = "cp -v"; "mv" = "mv -v"; "ytmp3" = "yt-dlp -o '%(title)s.%(ext)s' -x --audio-format mp3"; "myip" = "curl ifconfig.me"; "0x0" = ''curl -F"file=@$argv" https://0x0.st''; "wget" = "${pkgs.wget}/bin/wget --hsts-file='${XDG_DATA_HOME}/wget-hsts'"; # ulimit -n 4096 fixes the "too many open files" error i get sometimes when # updating the entire flake "rebuild" = "ulimit -n 4096 && sudo nixos-rebuild switch --flake ~/nix#${hostname} -v"; } cfg.extraAliases; shellAbbrs = { # todo: mkif xclip in pkgs "2clip" = "xclip -selection clipboard"; }; functions = { "fish_greeting" = "${(pkgs.fortune.override { withOffensive = true; })}/bin/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 ''; }; }; }; }