nix!: refactored homeModules

This commit is contained in:
Primrose 2024-10-12 00:55:42 +02:00
parent 1c48edddf4
commit e9f8ccd2b3
Signed by: primrose
GPG key ID: 4E887A4CA9714ADA
50 changed files with 14 additions and 41 deletions

View file

@ -0,0 +1,80 @@
{
pkgs,
hostname,
lib,
...
}:
{
programs.fish = {
shellAbbrs = lib.mkMerge [
{
## Docker
dc = "docker compose";
## Git
gaa = "git add (git rev-parse --show-toplevel)";
"ga." = "git add .";
gp = "git pull";
gP = "git push";
clone = "clone_to_repos";
## Editor
ts = "tmux_sessionizer";
v = "nvim";
":q" = "exit";
nhist = "sudo nix profile history --profile /nix/var/nix/profiles/system";
hhist = "nix profile history --profile ~/.local/state/nix/profiles/home-manager";
nwipe = "sudo nix profile wipe-history --profile /nix/var/nix/profiles/system --older-than 7d";
hwipe = "nix profile wipe-history --profile ~/.local/state/nix/profiles/home-manager --older-than 7d";
}
# TODO: move this out
(lib.mkIf pkgs.stdenv.isLinux {
ss = "sudo systemctl";
se = "SUDO_EDITOR=(which nvim) sudoedit";
ns = "sudo nixos-rebuild switch -L --flake ~/.dotfiles#${hostname}";
hs = "home-manager switch -L --flake ~/.dotfiles#${hostname}";
})
(lib.mkIf pkgs.stdenv.isDarwin {
ns = "darwin-rebuild switch -L --flake ~/.dotfiles#${hostname} --option sandbox false";
ndd = "nix develop -L --option sandbox false -c true"; # run the develop once without sandbox when needed
})
];
shellAliases = lib.mkMerge [
{
rm = "rm -I"; # idiot protection
tree = "tree -Cph";
restow = "cd ~/.dotfiles/ && stow -D . && stow -S . && prevd";
nix-shell = "nix-shell --run fish";
",," = "nix shell -c";
}
(lib.mkIf pkgs.stdenv.isLinux {
# idiot protection
chmod = "chmod --preserve-root";
chown = "chown --preserve-root";
})
(lib.mkIf pkgs.stdenv.isDarwin (
let
cmds = builtins.concatStringsSep ";";
in
{
reset_launchpad = cmds [
"defaults write com.apple.dock ResetLaunchPad -bool true"
"killall Dock"
];
add_spacer_tile = cmds [
"defaults write com.apple.dock persistent-apps -array-add '{tile-type=\"small-spacer-tile\";}"
"killall Dock"
];
}
))
];
};
}

View file

@ -0,0 +1,11 @@
for mode in default insert
bind --mode $mode \cg tmux_home
bind --mode $mode \cf tmux_sessionizer
end
# vi cursor style
fish_vi_key_bindings
set fish_cursor_default block
set fish_cursor_insert line
set fish_cursor_replace_one underscore
set fish_cursor_visual block

View file

@ -0,0 +1,100 @@
# Learn more: https://fishshell.com/docs/current/interactive.html
begin
# scope this in a bolck to not leak variables everywhere
set -l black 000000
set -l grey a0a1a7
set -l cyan 0184bc
set -l blue 4078f2
set -l purple a626a4
set -l green 50a14f
set -l orange e45649
set -l red ca1243
set -l brown 986801
set -l gold c18401
set -l accent 645199
set -l visual d0d0d0
###########
# General #
###########
# default color
set fish_color_normal $black
# commands like echo
set fish_color_command $blue
# keywords like if - this falls back on the command color if unset
set fish_color_keyword $purple
# quoted text like "abc"
set fish_color_quote $green
# IO redirections like >/dev/null
set fish_color_redirection $gold
# process separators like ; and &
set fish_color_end $black --bold
# syntax errors
set fish_color_error $black
# ordinary command parameters
set fish_color_param $red
# parameters that are filenames (if the file exists)
set fish_color_valid_path --italics
# options starting with “-”, up to the first “--” parameter
set fish_color_option $cyan
# comments like # important
set fish_color_comment $grey
# selected text in vi visual mode
set fish_color_selection --background=$visual
# parameter expansion operators like * and ~
set fish_color_operator $orange
# character escapes like \n and \x70
set fish_color_escape $purple
# autosuggestions (the proposed rest of a command)
set fish_color_autosuggestion $grey
# The current working directory in the default prompt
set fish_color_cwd $black
# The current working directory in the default prompt for the root user
set fish_color_cwd_root $red
# The username in the default prompt
set fish_color_user $grey
# The hostname in the default prompt
set fish_color_host $black
# the hostname in the default prompt for remote sessions (like ssh)
set fish_color_host_remote $red
# the last commands nonzero exit code in the default prompt
set fish_color_status $red
# the ^C indicator on a canceled command
set fish_color_cancel $accent --reverse
# history search matches and selected pager items (background only)
set fish_color_search_match --background $visual
#########
# Pager #
#########
# the progress bar at the bottom left corner
set fish_pager_color_progress --reverse $cyan
# the background color of a line
set fish_pager_color_background $black
# the prefix string, i.e. the string that is to be completed
set fish_pager_color_prefix $black
# the completion itself, i.e. the proposed rest of the string
set fish_pager_color_completion $grey
# the completion description
set fish_pager_color_description $grey
# background of the selected completion
set fish_pager_color_selected_background $black
# prefix of the selected completion
set fish_pager_color_selected_prefix
# suffix of the selected completion
set fish_pager_color_selected_completion $red
# description of the selected completion
set fish_pager_color_selected_description $gold
# ## Alternating colors
# # background of every second unselected completion
# set fish_pager_color_secondary_background --background=$tinted_bg
# # prefix of every second unselected completion
# set fish_pager_color_secondary_prefix
# # suffix of every second unselected completion
# set fish_pager_color_secondary_completion
# # description of every second unselected completion
# set fish_pager_color_secondary_description
end

View file

@ -0,0 +1,6 @@
# fzf preview theme (use delta instead of bat)
set -x fzf_preview_file_cmd 'delta'
# fd uses LS_COLORS
set -x LS_COLORS (vivid -m 24-bit generate one-light)
# fzf-fish search hidden files
set -x fzf_fd_opts --hidden --exclude=.git

View file

@ -0,0 +1,14 @@
# zh_TW
# set -x LANG zh_TW.UTF-8
# set -x LANGUAGE zh_TW
# set -x LC_ALL zh_TW.UTF-8
# fr_FR
# set -x LANG fr_FR.UTF-8
# set -x LANGUAGE fr_FR
# set -x LC_ALL fr_FR.UTF-8
# en_US
set -x LANG en_US.UTF-8
set -x LANGUAGE en_US
set -x LC_ALL en_US.UTF-8

View file

@ -0,0 +1,4 @@
# repo paths
set REPOS_PATH ~/repos
set UNIV_REPOS_PATH ~/univ-repos
set PLAYGROUND_PATH ~/playground

View file

@ -0,0 +1,105 @@
{
lib,
config,
pkgs,
...
}:
{
imports = [ ./aliasesAbbrs.nix ];
options.programs.fish.sourcePaths = lib.mkOption {
type = with lib.types; nonEmptyListOf str;
description = ''
Paths to be sourced idempotently at the start of a login-shell.
'';
};
config.xdg.configFile."fish/functions".source = lib.mkIf config.programs.fish.enable ./functions;
config.programs.fish =
let
readConfig = n: builtins.readFile ./conf.d/${n}.fish;
readConfigs = ns: builtins.concatStringsSep "\n" (map readConfig ns);
in
{
enable = true;
# We need to handle path idempotently, because fish in home-manager is
# unable to depend on nixos/nix-darwin configurations to figure out the profile.d/nix.sh
# to source.
#
# The hack is to make terminal emulators run fish as a login shell
# whenever fish should handle the path.
# tmux should NOT call fish as a login shell, because it would inherit the
# environment variables from its parent shell, which is a login shell.
loginShellInit = ''
begin
set ps ${builtins.concatStringsSep " " config.programs.fish.sourcePaths}
set -e fish_user_paths
for p in $ps
test -d $p && set --append fish_user_paths $p
end
end
'';
sourcePaths =
[
# Make sure wrapper comes first
# https://discourse.nixos.org/t/sudo-run-current-system-sw-bin-sudo-must-be-owned-by-uid-0-and-have-the-setuid-bit-set-and-cannot-chdir-var-cron-bailing-out-var-cron-permission-denied/20463/2
"/run/wrappers/bin"
# Make sure nixcpp with the specified version in the flake come first
"${config.nix.package}/bin"
"${config.home.homeDirectory}/.nix-profile/bin"
"/nix/profile/bin"
"${config.home.homeDirectory}/.local/state/nix/profile/bin"
"/etc/profiles/per-user/${config.home.username}/bin"
"/nix/var/nix/profiles/default/bin"
"/run/current-system/sw/bin"
]
# Add brew, but as fallback
++ (lib.lists.optional pkgs.stdenv.isDarwin "/opt/homebrew/bin");
shellInit = readConfig "shellInit";
interactiveShellInit = readConfigs [
"interactiveShellInit"
"bind"
"colorscheme"
"locale"
];
plugins = [
{
name = "fzf-fish";
src = pkgs.fetchFromGitHub {
owner = "PatrickF1";
repo = "fzf.fish";
rev = "v10.3";
hash = "sha256-T8KYLA/r/gOKvAivKRoeqIwE2pINlxFQtZJHpOy9GMM=";
};
}
{
name = "colored-man-pages";
src = pkgs.fetchFromGitHub {
owner = "PatrickF1";
repo = "colored_man_pages.fish";
rev = "f885c2507128b70d6c41b043070a8f399988bc7a";
sha256 = "sha256-ii9gdBPlC1/P1N9xJzqomrkyDqIdTg+iCg0mwNVq2EU=";
};
}
{
name = "sponge";
src = pkgs.fetchFromGitHub {
owner = "meaningful-ooo";
repo = "sponge";
sha256 = "sha256-MdcZUDRtNJdiyo2l9o5ma7nAX84xEJbGFhAVhK+Zm1w=";
rev = "1.1.0";
};
}
];
};
}

View file

@ -0,0 +1,15 @@
function ,
set ps
set os
for p in $argv
if not string match -q -- "--*" $p
set -a ps "nixpkgs#$p"
else
set -a os "$p"
end
end
set cmd "SHELL=(which fish) IN_NIX_SHELL=\"impure\" nix shell $os $ps"
echo "Executing `$cmd`..."
eval $cmd
end

View file

@ -0,0 +1,12 @@
function __tmux_attach_or_switch \
--description "Attach (not in tmux) or switch (in tmux) to a session"
### Arguments:
set session_name $argv[1]
if [ -z "$TMUX" ]
tmux attach-session -t $session_name
else
tmux switch-client -t $session_name
end
end

View file

@ -0,0 +1,15 @@
function __tmux_maybe_create \
--description "Create a tmux session with sensible defaults if it doesn't exist yet"
### Arguments:
set session_name $argv[1]
set session_dir $argv[2]
if pgrep tmux 2>&1 >/dev/null; or ! tmux has -t=$session_name 2>/dev/null
tmux \
new-session -ds $session_name -c $session_dir \; \
send-keys -t $session_name $EDITOR ENTER \; \
new-window -t $session_name -c $session_dir \; \
select-window -t $session_name:1
end
end

View file

@ -0,0 +1,11 @@
function __tmux_register_session \
--description "Register the session, if it's not set yet"
### Effects:
set last /tmp/TMUX_LAST
set this (tmux display-message -p '#S')
if [ ! -f "$last" ]; or [ (cat "$last") != "$this" ]
echo "$this" >"$last"
end
end

View file

@ -0,0 +1,13 @@
function clone_to_repos
if not count $argv >/dev/null
echo "Git url needed"
end
set name_repo (echo $argv | sed -E 's/.*[:\\/]([^\\/]+)\\/([^\\/]+?)(:?\\.git)$/\1 \2/')
set name (echo $name_repo | cut -d ' ' -f1)
set repo (echo $name_repo | cut -d ' ' -f2)
mkdir -p $REPOS_PATH/$name
git clone $argv $REPOS_PATH/$name/$repo
end

View file

@ -0,0 +1,12 @@
function fish_greeting
set_color --italics
switch $FISH_GREETING
case toh
cat ~/.quotes/toh/* | shuf -n 1
case fleabag
cat ~/.quotes/fleabag/* | shuf -n 1
case "*"
end
end

View file

@ -0,0 +1,29 @@
function fzf_pass
set selected \
(begin
fd -tf . $PASSWORD_STORE_DIR | sed "s|^$PASSWORD_STORE_DIR/\(.*\)\.gpg\$|\1|"
end | fzf)
if [ -z "$selected" ]
echo Nothing selected
echo exiting...
end
set mode \
(begin
echo "password"
echo "otp"
echo "all"
end | fzf)
switch "$mode"
case all
pass "$selected" | nvim +"setlocal buftype=nofile bufhidden=hide noswapfile"
case password
pass "$selected" -c
case otp
pass otp "$selected" -c
end
end

View file

@ -0,0 +1,5 @@
function snakecase
echo $argv | sed -E 's/[^A-Za-z0-9_\n]+/_/g' | sed -E 's/__+/_/g' | tr '[:upper:]' '[:lower:]'
end

View file

@ -0,0 +1,19 @@
function tmux_home \
--description "Take me back to ~"
set session_name home
if pgrep tmux 2>&1 >/dev/null
__tmux_register_session
end
if pgrep tmux 2>&1 >/dev/null; or ! tmux has -t=$session_name 2>/dev/null
tmux \
new-session -ds home \; \
new-window -t home \; \
select-window -t "home":1
end
__tmux_attach_or_switch $session_name
end

View file

@ -0,0 +1,16 @@
function tmux_last \
--description "Toggle the last tmux session"
set tmux_last /tmp/TMUX_LAST
if [ ! -f $tmux_last ]
echo "Last session is not yet set"
return 1
end
set session_name (cat $tmux_last)
__tmux_register_session
__tmux_maybe_create $session_name /tmp
__tmux_attach_or_switch $session_name
end

View file

@ -0,0 +1,48 @@
function tmux_sessionizer \
--description "Manage tmux sessions in specific folders with fzf"
set selected \
(begin
fd . $REPOS_PATH $UNIV_REPOS_PATH --exact-depth 2 --type d
fd . $PLAYGROUND_PATH --exact-depth 1 --type d
# Special mode to create a playground
echo "play"
echo "dotfiles"
end 2> /dev/null | sed -e "s|^$HOME|~|" | fzf)
set selected (echo $selected | sed -e "s|^~|$HOME|")
if [ -z "$selected" ]
commandline --function repaint
return 0
end
# derive session name based on selected path
# dots are meaningful in tmux, remove them
set session_name (echo $selected | tr . _)
# fixup special cases, override derived session_name if necessary
# this should be id for non-special cases
switch $selected
case play
read -P "Give it a name: " name
if [ -z "$name" ]
return 0
end
set name (snakecase "$name")
set selected ~/playground/$name
set session_name (echo $selected | tr . _)
mkdir -p $selected
case dotfiles
set selected ~/.dotfiles
set session_name dotfiles
end
# effects
__tmux_register_session $session_name
__tmux_maybe_create $session_name $selected
__tmux_attach_or_switch $session_name
end

View file

@ -0,0 +1,10 @@
function update_dotfiles
cd ~/.dotfiles/
git reset --hard
git pull --set-upstream origin main
git submodule update --init
prevd
restow
end