# MiniServer shell functions, sourced by shell/bashrc # n opens Neovim in the current directory, or on the files given n() { if [ "$#" -eq 0 ]; then command nvim . ; else command nvim "$@"; fi; } # open a file or URL with its default app, detached from the terminal open() ( xdg-open "$@" > /dev/null 2>&1 & ) # compress makes .tar.gz (decompress is an alias for tar -xzf) compress() { tar -czf "${1%/}.tar.gz" "${1%/}"; } # SSH port forwarding # fip ... forward each localhost port to the same port on host # dip ... stop forwarding those ports # lip list active forwards fip() { (( $# < 2 )) && echo "Usage: fip [port2] ..." && return 1 local host="$1" shift for port in "$@"; do ssh -f -N -L "${port}:localhost:${port}" "$host" && echo "Forwarding localhost:$port -> $host:$port" done } dip() { (( $# == 0 )) && echo "Usage: dip [port2] ..." && return 1 for port in "$@"; do pkill -f "ssh.*-L ${port}:localhost:${port}" && echo "Stopped forwarding port $port" || echo "No forwarding on port $port" done } lip() { pgrep -af "ssh.*-L [0-9]+:localhost:[0-9]+" || echo "No active forwards" } # Git worktrees # ga create ../-- on a new branch and cd into it # gd from inside that worktree, remove it and its branch ga() { if [[ -z "$1" ]]; then echo "Usage: ga [branch name]" return 1 fi local branch="$1" local base="$(basename "$PWD")" local wt_path="../${base}--${branch}" git worktree add -b "$branch" "$wt_path" || return 1 command -v mise &> /dev/null && mise trust "$wt_path" cd "$wt_path" } gd() { local cwd base branch root worktree answer cwd="$(pwd)" worktree="$(basename "$cwd")" # split on first `--` root="${worktree%%--*}" branch="${worktree#*--}" # Protect against accidentally nuking a non-worktree directory if [[ "$root" == "$worktree" ]]; then echo "Not in a worktree made by ga (expected a -- directory)." return 1 fi read -rp "Remove worktree $worktree and branch $branch? [y/N] " answer [[ $answer == [yY]* ]] || return 0 cd "../$root" git worktree remove "$cwd" --force || return 1 git branch -D "$branch" }