1
Files
flake-nixinator/home/modules/fish/default.nix

240 lines
8.6 KiB
Nix

{
config,
lib,
mylib,
pkgs,
...
}: let
inherit (config.modules) fish;
in {
options.modules.fish = import ./options.nix {inherit lib mylib;};
config = lib.mkIf fish.enable {
home.file.".config/fish/themes/catppuccin-latte.theme".text = ''
# name: 'Catppuccin Latte'
# url: 'https://github.com/catppuccin/fish'
# preferred_background: eff1f5
fish_color_normal 4c4f69
fish_color_command 1e66f5
fish_color_param dd7878
fish_color_keyword d20f39
fish_color_quote 40a02b
fish_color_redirection ea76cb
fish_color_end fe640b
fish_color_comment 8c8fa1
fish_color_error d20f39
fish_color_gray 9ca0b0
fish_color_selection --background=ccd0da
fish_color_search_match --background=ccd0da
fish_color_option 40a02b
fish_color_operator ea76cb
fish_color_escape e64553
fish_color_autosuggestion 9ca0b0
fish_color_cancel d20f39
fish_color_cwd df8e1d
fish_color_user 179299
fish_color_host_remote 40a02b
fish_color_host 1e66f5
fish_color_status d20f39
fish_pager_color_progress 9ca0b0
fish_pager_color_prefix ea76cb
fish_pager_color_completion 4c4f69
fish_pager_color_description 9ca0b0
'';
programs.fish = {
enable = true;
functions = {
nnncd = {
wraps = "nnn";
description = "support nnn quit and change directory";
body = ''
# Block nesting of nnn in subshells
if test -n "$NNNLVL" -a "$NNNLVL" -ge 1
echo "nnn is already running"
return
end
# The behaviour is set to cd on quit (nnn checks if NNN_TMPFILE is set)
# If NNN_TMPFILE is set to a custom path, it must be exported for nnn to
# see. To cd on quit only on ^G, remove the "-x" from both lines below,
# without changing the paths.
if test -n "$XDG_CONFIG_HOME"
set -x NNN_TMPFILE "$XDG_CONFIG_HOME/nnn/.lastd"
else
set -x NNN_TMPFILE "$HOME/.config/nnn/.lastd"
end
# Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn
# stty start undef
# stty stop undef
# stty lwrap undef
# stty lnext undef
# The command function allows one to alias this function to `nnn` without
# making an infinitely recursive alias
command nnn $argv
if test -e $NNN_TMPFILE
source $NNN_TMPFILE
rm $NNN_TMPFILE
end
'';
};
};
plugins = [
# Oh-my-fish plugins are stored in their own repositories, which
# makes them simple to import into home-manager.
# NOTE: Currently, HM ignores theme plugins
# {
# name = "Catppuccin Latte";
# src = pkgs.fetchFromGitHub {
# owner = "catppuccin";
# repo = "fish";
# rev = "91e6d6721362be05a5c62e235ed8517d90c567c9";
# sha256 = "sha256-l9V7YMfJWhKDL65dNbxaddhaM6GJ0CFZ6z+4R6MJwBA=";
# };
# }
];
shellInit = ''
set -e fish_greeting
yes | fish_config theme save "catppuccin-latte"
'';
shellAbbrs = let
# Only add " | bat" if bat is installed
batify = command: command + (lib.optionalString config.programs.bat.enable " | bat");
# Same as above but with args for bat
batifyWithArgs = command: args: command + (lib.optionalString config.programs.bat.enable (" | bat " + args));
# These can be used for my config.modules and for HM config.programs,
# as both of these add the package to home.packages
hasHomePackage = package: (mylib.modules.contains config.home.packages package);
# Only add fish abbr if package is installed
abbrify = package: abbr: (lib.optionalAttrs (hasHomePackage package) abbr);
in
lib.mkMerge [
# Abbrs that are always available are defined here.
{
# Shell basics
c = "clear";
q = "exit";
# Fish
h = batifyWithArgs "history" "-l fish"; # -l fish sets syntax highlighting to fish
listabbrs = batifyWithArgs "abbr" "-l fish";
# Tools
cd = "z"; # zoxide for quickjump to previously visited locations
b = "z -"; # jump to previous dir
mkdir = "mkdir -p"; # also create parents (-p)
blk = batify "lsblk -o NAME,LABEL,UUID,FSTYPE,SIZE,FSUSE%,MOUNTPOINT,MODEL";
grep = "grep --color=auto -E"; # grep with extended regex
watch = "watch -d -c -n 0.5";
n = "nnncd -a"; # Doesn't work with abbrify because I have nnn.override?
np = "nnncd -a -P p";
ssh = "kitty +kitten ssh";
# Systemd
failed = "systemctl --failed";
errors = "journalctl -p 3 -xb";
kernelerrors = "journalctl -p 3 -xb -k";
uniterrors = "journalctl -xb --unit=";
useruniterrors = "journalctl -xb --user-unit=";
# NFS shares
msusenet = "sudo mount.nfs4 192.168.86.20:/mnt/WD\\ Blue\\ Stripe\\ 2T/Usenet /media/Stash-Usenet";
mspicture = "sudo mount.nfs4 192.168.86.20:/mnt/WD\\ Blue\\ Stripe\\ 2T/Picture /media/Stash-Picture";
msvideo = "sudo mount.nfs4 192.168.86.20:/mnt/WD\\ Blue\\ Stripe\\ 2T/Video /media/Stash-Video";
msclips = "sudo mount.nfs4 192.168.86.20:/mnt/WD\\ Blue\\ Stripe\\ 2T/Clips /media/Stash-Clips";
mmovie = "sudo mount.nfs4 192.168.86.20:/mnt/SG\\ Exos\\ Mirror\\ 18TB/Movie /media/Movie";
mshow = "sudo mount.nfs4 192.168.86.20:/mnt/SG\\ Exos\\ Mirror\\ 18TB/Show /media/Show";
mmusic = "sudo mount.nfs4 192.168.86.20:/mnt/SG\\ Exos\\ Mirror\\ 18TB/Music /media/Music";
musenet = "sudo mount.nfs4 192.168.86.20:/mnt/SG\\ Exos\\ Mirror\\ 18TB/Usenet /media/Usenet";
# Disassemble
disassemble = "objdump -d -S -M intel";
}
# Abbrs only available if package is installed
(abbrify pkgs.btop {top = "btop";})
(abbrify pkgs.duf {
df = "duf";
disksummary = "duf";
})
(abbrify pkgs.eza {
ls = "eza --color=always --group-directories-first -F --git --icons=always"; # color-ls
lsl = "eza --color=always --group-directories-first -F -l --git --icons=always --octal-permissions";
lsa = "eza --color=always --group-directories-first -F -l -a --git --icons=always --octal-permissions";
tre = "eza --color=always --group-directories-first -F -T -L 2 ---icons=always";
})
(abbrify pkgs.fd {find = "fd";})
(abbrify pkgs.fzf {fuzzy = "fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'";})
(abbrify pkgs.gdu {
du = "gdu";
storageanalysis = "gdu";
})
(abbrify pkgs.git {
gs = "git status";
gcm = "git commit -m";
ga = "git add";
glg = "git log --graph --decorate --oneline";
gcl = "git clone";
})
(abbrify pkgs.gping {ping = "gping";})
(abbrify pkgs.lazygit {lg = "lazygit";})
(abbrify pkgs.ranger {r = "ranger --choosedir=$HOME/.rangerdir; set LASTDIR (cat $HOME/.rangerdir); cd $LASTDIR";})
(abbrify pkgs.rsync {
copy = "rsync -ahv --inplace --partial --info=progress2";
rsync = "rsync -ahv --inplace --partial --info=progress2";
})
(abbrify pkgs.sd {sed = "sd";})
(abbrify pkgs.yt-dlp {
mp4 = "yt-dlp -f 'bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b' --recode-video mp4"; # the -f options are yt-dlp defaults
mp3 = "yt-dlp -f 'ba' --extract-audio --audio-format mp3";
})
];
};
programs.starship = let
flavour = "latte"; # One of `latte`, `frappe`, `macchiato`, or `mocha`
in {
enable = true;
enableFishIntegration = config.modules.fish.enable;
settings =
{
# Other config here
format = "$all"; # Remove this line to disable the default prompt format
palette = "catppuccin_${flavour}";
}
// builtins.fromTOML (builtins.readFile
(pkgs.fetchFromGitHub
{
owner = "catppuccin";
repo = "starship";
rev = "3e3e54410c3189053f4da7a7043261361a1ed1bc";
sha256 = "sha256-soEBVlq3ULeiZFAdQYMRFuswIIhI9bclIU8WXjxd7oY=";
}
+ /palettes/${flavour}.toml));
};
};
}