diff --git a/020_zsh_completions-chezmoi.sh b/020_zsh_completions-chezmoi.sh new file mode 100644 index 0000000..c728bf5 --- /dev/null +++ b/020_zsh_completions-chezmoi.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash + +# chezmoi completion zsh --output ~/.config/zsh/completions/_chezmoi + +# Save this file to: +# ~/.local/share/chezmoi/run_once_after_install-completions.sh +# (make sure it has +x in the source state) + +# Install chezmoi shell completions for bash, zsh, fish +# Idempotent — safe to run multiple times +# Works on Debian / Ubuntu (and derivatives) + +set -euo pipefail + +CHEZMOI_VERSION=$(chezmoi --version 2>/dev/null | awk '{print $2}' || echo "unknown") + +echo "Detected chezmoi version: ${CHEZMOI_VERSION:-not found}" +if [[ "$CHEZMOI_VERSION" == "unknown" ]]; then + echo "Error: chezmoi not found in PATH. Please install it first." + exit 1 +fi + +# ──────────────────────────────────────────────── +# Helper: generate and write completion if needed +# ──────────────────────────────────────────────── +install_completion() { + local shell="$1" + local dest="$2" + local dest_dir + + dest_dir=$(dirname "$dest") + + # Create directory if missing (common for fresh ~/.config/zsh/completions) + mkdir -p "$dest_dir" + + echo "→ Installing completion for $shell → $dest" + + # Generate fresh completion + if ! chezmoi completion "$shell" --output="$dest.tmp" 2>/dev/null; then + echo " Failed to generate $shell completion" + rm -f "$dest.tmp" + return 1 + fi + + # Only replace if different (keeps mtime unchanged when identical → nice for chezmoi itself) + if [[ -f "$dest" ]] && cmp -s "$dest.tmp" "$dest"; then + echo " Already up-to-date" + rm -f "$dest.tmp" + else + mv "$dest.tmp" "$dest" + echo " Written → $dest" + fi +} + +# ──────────────────────────────────────────────── +# bash completion (most common locations on Debian) +# ──────────────────────────────────────────────── +# Preferred: /usr/share/bash-completion/completions/ (system-wide) +# Fallback: ~/.local/share/bash-completion/completions/ (user-only) + +BASH_COMPLETION_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion/completions" +mkdir -p "$BASH_COMPLETION_DIR" + +install_completion bash "$BASH_COMPLETION_DIR/chezmoi" + +# Also try system-wide (requires sudo) — uncomment if you want it +# sudo install_completion bash /usr/share/bash-completion/completions/chezmoi + +# ──────────────────────────────────────────────── +# zsh completion +# ──────────────────────────────────────────────── +# Common user location (you already used this one) +ZSH_COMPLETION_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/zsh/completions" +install_completion zsh "$ZSH_COMPLETION_DIR/_chezmoi" + +# Make sure your .zshrc sources the directory (add if missing) +ZSHRC="$HOME/.zshrc" +if ! grep -q "fpath.*zsh/completions" "$ZSHRC" 2>/dev/null; then + echo "# Load completions (added by chezmoi install script)" >>"$ZSHRC" + echo 'fpath=("${XDG_CONFIG_HOME:-$HOME/.config}/zsh/completions" $fpath)' >>"$ZSHRC" + echo "autoload -Uz compinit && compinit" >>"$ZSHRC" + echo "→ Added zsh completions path to ~/.zshrc (reload with 'source ~/.zshrc')" +fi + +# ──────────────────────────────────────────────── +# fish completion +# ──────────────────────────────────────────────── +# Fish looks in ~/.config/fish/completions/ +FISH_COMPLETION_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/fish/completions" +install_completion fish "$FISH_COMPLETION_DIR/chezmoi.fish" + +echo "" +echo "Done! Completions installed for:" +echo " • bash → $BASH_COMPLETION_DIR/chezmoi" +echo " • zsh → $ZSH_COMPLETION_DIR/_chezmoi" +[[ -d "$FISH_COMPLETION_DIR" ]] && echo " • fish → $FISH_COMPLETION_DIR/chezmoi.fish" + +echo "" +echo "Next steps:" +echo " • Bash → open new terminal or run: source /etc/profile.d/bash_completion.sh" +echo " • Zsh → run: source ~/.zshrc (or open new terminal)" +echo " • Fish → open new terminal" +echo "" +echo "Test with: chezmoi "