nix/modules/stuff/fish.nix
2024-10-16 14:07:58 +02:00

131 lines
4.5 KiB
Nix

{ 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;
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 <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
'';
} // cfg.functions;
};
};
}