mirror of
https://codeberg.org/tmayoff/.dotfiles.git
synced 2025-12-06 08:48:34 -05:00
133 lines
4.4 KiB
Nix
133 lines
4.4 KiB
Nix
{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 <path> <branch-name> [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 <path> <branch-name> [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 <path> <new-branch> <base-branch>"
|
|
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 <path>"
|
|
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;
|
|
}
|
|
];
|
|
};
|
|
}
|