131 lines
4.5 KiB
Nix
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;
|
|
};
|
|
};
|
|
}
|