{pkgs, ...}: { programs.fish = { enable = true; interactiveShellInit = '' # Fix for fish 4.2.0+ embedded completions not loading with home-manager # See: https://github.com/nix-community/home-manager/issues/8178 set -p fish_complete_path ${pkgs.fish}/share/fish/completions set -gx EDITOR hx set -gx GIT_EDITOR $EDITOR set -gx DEBEMAIL "tyler@tylermayoff.com" fish_add_path $HOME/.local/bin if test -e $HOME/.config/fish/variables-$(hostname).fish source $HOME/.config/fish/variables-$(hostname).fish end bind \cz 'fg 2>/dev/null; commandline -f repaint' export GPG_TTY=$(tty) # Git worktree functions function gwn --description "Create new worktree with new branch" # Show help if requested if test (count $argv) -eq 1; and string match -qr '^(-h|--help|help)$' $argv[1] echo "Usage: gwn [base-branch]" echo "" echo "Create a new git worktree with a new branch" echo "" echo "Arguments:" echo " path Path where the worktree will be created" echo " branch-name Name of the new branch to create" echo " base-branch Optional base branch (will prompt with fzf if not provided)" echo "" echo "Examples:" echo " gwn ../feature my-feature # Interactive base branch selection" echo " gwn ../feature my-feature main # Create from main branch" return 0 end if test (count $argv) -lt 2 echo "Usage: gwn [base-branch]" echo "Run 'gwn --help' for more information" return 1 end set -l path $argv[1] set -l new_branch $argv[2] set -l base_branch "" # If base branch is provided, use it if test (count $argv) -ge 3 set base_branch $argv[3] else # Otherwise, offer to select one with fzf echo "Select base branch (or press ESC to use current branch):" set base_branch (git branch --all | grep -v HEAD | sed 's/^[ *]*//' | sed 's/remotes\/origin\///' | sort -u | fzf --prompt="Base branch (ESC for current): " --height=40%) end if test -n "$base_branch" git worktree add -b $new_branch $path $base_branch else git worktree add -b $new_branch $path end end function gwnb --description "Create new worktree with new branch based on another branch" if test (count $argv) -lt 3 echo "Usage: gwnb " return 1 end git worktree add -b $argv[2] $argv[1] $argv[3] end function gwc --description "Create worktree for existing branch" set -l branch $argv[1] set -l path $argv[1] # If no branch is specified, use fzf to select one if test (count $argv) -lt 1 set branch (git branch --all | grep -v HEAD | sed 's/^[ *]*//' | sed 's/remotes\/origin\///' | sort -u | fzf --prompt="Select branch: " --height=40%) if test -z "$branch" echo "No branch selected" return 1 end set path $branch end if test (count $argv) -ge 2 set path $argv[2] end git worktree add $path $branch end function gwrm --description "Remove worktree and delete branch" if test (count $argv) -lt 1 echo "Usage: gwrm " return 1 end set -l branch (git -C $argv[1] branch --show-current) git worktree remove $argv[1] and git branch -D $branch end function gwcd --description "CD to a worktree by selecting from list" set -l worktree (git worktree list | tail -n +2 | awk '{print $1}' | fzf) if test -n "$worktree" cd $worktree end end ''; shellInit = '' set -gx EDITOR hx set -gx GIT_EDITOR $EDITOR set -gx DEBEMAIL "tyler@tylermayoff.com" set -xg XDG_DATA_DIRS "$HOME/.nix-profile/share:$XDG_DATA_DIRS" fish_add_path $HOME/.local/bin if test -e $HOME/.config/fish/variables-$(hostname)fish source $HOME/.config/fish/variables-$(hostname).fish end ''; plugins = [ { name = "forgit"; src = pkgs.fishPlugins.forgit.src; } ]; }; }