144 lines
8.1 KiB
Fish
144 lines
8.1 KiB
Fish
# =============================================================================
|
|
# config.fish — Fish Shell Configuration & Dotfiles Manager
|
|
# Version: 1.0.0
|
|
# =============================================================================
|
|
#
|
|
# This file is the entry point for every Fish shell session. It handles:
|
|
#
|
|
# 1. BASIC SETUP — PATH, environment variables, editor
|
|
# 2. VERSIONING — a single source-of-truth version number
|
|
# 3. DOTFILES MANAGEMENT — create, update, and track ~/.tmux.conf and
|
|
# other common config files through the `dotfiles` command
|
|
# 4. SELF-UPDATE — pull the latest version of this very config from a
|
|
# remote Git repository and re-apply all managed dotfiles
|
|
# 5. EXTENSIBILITY — modular structure via conf.d/ and functions/ that
|
|
# Fish auto-loads; no manual sourcing required
|
|
#
|
|
# The heavy lifting lives in ~/.config/fish/functions/dotfiles.fish, which
|
|
# Fish loads automatically when you first run `dotfiles`. Templates for
|
|
# managed dotfiles live in ~/.config/fish/dotfiles/.
|
|
#
|
|
# ── Quick start ────────────────────────────────────────────────────────────
|
|
#
|
|
# dotfiles help # Show all subcommands
|
|
# dotfiles version # Show the current version of this framework
|
|
# dotfiles status # Compare managed dotfiles against their templates
|
|
# dotfiles init # Create ~/.tmux.conf, ~/.gitconfig, etc.
|
|
# dotfiles sync # Git-pull updates and re-apply everything
|
|
# dotfiles publish # Bump version, commit local changes, push to repo
|
|
#
|
|
# =============================================================================
|
|
|
|
|
|
# ══════════════════════════════════════════════════════════════════════════════
|
|
# SECTION 1 — Version & Core Constants
|
|
# ══════════════════════════════════════════════════════════════════════════════
|
|
#
|
|
# These values form the single source of truth for the entire framework.
|
|
# DOTFILES_DIR holds the template files; DOTFILES_BACKUP_DIR holds backups
|
|
# and the last-update-check timestamp.
|
|
|
|
set -g DOTFILES_VERSION "1.0.5"
|
|
|
|
# --- Remote repository (set this to enable auto-updates) --------------------
|
|
# Example:
|
|
# dotfiles repo https://github.com/yourname/dotfiles
|
|
#
|
|
# Until you set this, `dotfiles sync` will show a reminder but won't fail.
|
|
set -gx DOTFILES_REPO_URL ""
|
|
set -gx DOTFILES_REPO_BRANCH "main"
|
|
|
|
# --- Paths ------------------------------------------------------------------
|
|
# __fish_config_dir is a built-in Fish variable that points to
|
|
# ~/.config/fish — we use it instead of hard-coding the path.
|
|
set -gx DOTFILES_DIR "$__fish_config_dir/dotfiles"
|
|
set -gx DOTFILES_BACKUP_DIR "$__fish_config_dir/backups"
|
|
|
|
# --- Auto-update interval ---------------------------------------------------
|
|
# How often (in days) to remind you that updates are available when a new
|
|
# interactive shell starts. Set to 0 to disable the nag.
|
|
set -g DOTFILES_AUTO_UPDATE_INTERVAL_DAYS 7
|
|
|
|
# ──────────────────────────────────────────────────────────────────────────────
|
|
# Version stamp embedded in the file itself for quick verification.
|
|
# When you run `dotfiles version`, it reads this constant — no external file
|
|
# to keep in sync.
|
|
# ──────────────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
# ══════════════════════════════════════════════════════════════════════════════
|
|
# SECTION 2 — PATH & Environment
|
|
# ══════════════════════════════════════════════════════════════════════════════
|
|
|
|
# fish_add_path is idempotent — it won't add a directory that's already on PATH.
|
|
fish_add_path "$HOME/.local/bin"
|
|
fish_add_path "$HOME/bin"
|
|
|
|
# Preferred editor (used by `dotfiles edit` among other things).
|
|
set -q EDITOR; or set -gx EDITOR "nano"
|
|
|
|
# Preferred file pager.
|
|
set -q PAGER; or set -gx PAGER "less"
|
|
|
|
|
|
# ══════════════════════════════════════════════════════════════════════════════
|
|
# SECTION 3 — Dotfiles Infrastructure
|
|
# ══════════════════════════════════════════════════════════════════════════════
|
|
|
|
# Create the required directories on every login so they are always present
|
|
# even when the repo is cloned fresh.
|
|
for dir in "$DOTFILES_DIR" "$DOTFILES_BACKUP_DIR"
|
|
if not test -d "$dir"
|
|
mkdir -p "$dir"
|
|
end
|
|
end
|
|
|
|
|
|
# ══════════════════════════════════════════════════════════════════════════════
|
|
# SECTION 4 — Interactive Session: Prompt, Welcome, Auto-Update Nag
|
|
# ══════════════════════════════════════════════════════════════════════════════
|
|
#
|
|
# Everything below this guard runs only in interactive (i.e. human-facing)
|
|
# shells, never in scripts.
|
|
|
|
if status is-interactive
|
|
|
|
# ── 4a. Welcome message (shown once per login) ────────────────────────
|
|
# Set DOTFILES_SUPPRESS_WELCOME=1 in your environment to silence this.
|
|
if not set -q DOTFILES_SUPPRESS_WELCOME
|
|
echo "fish: dotfiles v$DOTFILES_VERSION — run 'dotfiles help' for commands"
|
|
end
|
|
|
|
# ── 4b. Periodic auto-update reminder ─────────────────────────────────
|
|
# Once every DOTFILES_AUTO_UPDATE_INTERVAL_DAYS, print a one-line
|
|
# reminder that updates may be available. The actual update is
|
|
# performed via `dotfiles sync` (manual, so you control the timing).
|
|
if test "$DOTFILES_AUTO_UPDATE_INTERVAL_DAYS" -gt 0
|
|
set -l last_check_file "$DOTFILES_BACKUP_DIR/.last_update_check"
|
|
|
|
# Determine days since last check
|
|
set -l days_ago 999
|
|
if test -f "$last_check_file"
|
|
set -l last_ts (command cat "$last_check_file")
|
|
set -l now_ts (date +%s)
|
|
# Use integer arithmetic: 86400 seconds in a day
|
|
set -l elapsed (math "$now_ts - $last_ts")
|
|
if test "$elapsed" -ge 0
|
|
set days_ago (math "$elapsed / 86400")
|
|
end
|
|
end
|
|
|
|
if test "$days_ago" -ge "$DOTFILES_AUTO_UPDATE_INTERVAL_DAYS"
|
|
echo "tip: run 'dotfiles sync' to check for dotfiles updates"
|
|
command date +%s >"$last_check_file"
|
|
end
|
|
end
|
|
|
|
# ── 4c. Prompt ─────────────────────────────────────────────────────────
|
|
# No custom fish_prompt defined here — Fish uses its built-in default
|
|
# which shows user@host in color, the working directory, git status,
|
|
# and pipestatus. To customise, define your own fish_prompt function
|
|
# in ~/.config/fish/functions/fish_prompt.fish.
|
|
|
|
end # status is-interactive
|