nix/modules/stuff/fish.nix
2024-10-16 11:40:24 +02:00

118 lines
4.3 KiB
Nix

{ 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 <mariuszs at gmail.com>
# 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
'';
};
};
};
}