#!/usr/bin/env bash # =========================================================================== # Stage 04: Shell Configuration (zsh, oh-my-zsh, powerlevel10k) # Deploys .zshrc, .p10k.zsh, and .zshrc.local (from config/shell/). # =========================================================================== # On the Pop machine, Julian uses: # - zsh as default shell # - oh-my-zsh with powerlevel10k theme (lean style, 1 line) # - Plugin: git, zsh-autosuggestions # - Custom aliases: bt-reset (Bluetooth) # - 17 environment variables (API keys) # - NVM integration # - Ctrl+Backspace → backward-kill-word # # API keys go into ~/.zshrc.local (NOT tracked in this repo). # See config/shell/zshrc.local.example for the template. # =========================================================================== # ---- Install zsh ---- info "Installing zsh..." if command -v zsh &>/dev/null; then ok "zsh already installed: $(zsh --version | head -1)" else pkg_install zsh 2>/dev/null fi # ---- Install oh-my-zsh ---- info "Installing Oh My Zsh..." if [ -d "$HOME/.oh-my-zsh" ]; then ok "Oh My Zsh already installed." else # Non-interactive install (no chsh prompt) sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended 2>/dev/null || { warn "Oh My Zsh install failed; trying without unattended flag." # Fallback: set ZSH and clone directly export ZSH="$HOME/.oh-my-zsh" git clone --depth=1 https://github.com/ohmyzsh/ohmyzsh.git "$ZSH" 2>/dev/null || true } ok "Oh My Zsh installed." fi # ---- Install Powerlevel10k theme ---- info "Installing Powerlevel10k theme..." if [ -d "${ZSH:-$HOME/.oh-my-zsh}/custom/themes/powerlevel10k" ]; then ok "Powerlevel10k already installed." else git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \ "${ZSH:-$HOME/.oh-my-zsh}/custom/themes/powerlevel10k" 2>/dev/null || warn "p10k clone failed." fi # ---- Install zsh-autosuggestions plugin ---- info "Installing zsh-autosuggestions plugin..." if [ -d "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" ]; then ok "zsh-autosuggestions already installed." else git clone --depth=1 https://github.com/zsh-users/zsh-autosuggestions \ "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" 2>/dev/null || warn "clone failed." fi # ---- Deploy .zshrc ---- info "Deploying .zshrc..." CONFIG_DIR="${SCRIPT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}/config" if [ -f "$HOME/.zshrc" ]; then # Backup existing cp "$HOME/.zshrc" "$HOME/.zshrc.bak.$(date +%Y%m%d)" 2>/dev/null warn "Backed up existing .zshrc to .zshrc.bak.$(date +%Y%m%d)" fi cp "${CONFIG_DIR}/shell/zshrc" "$HOME/.zshrc" ok ".zshrc deployed." # ---- Deploy .p10k.zsh ---- info "Deploying .p10k.zsh..." if [ -f "$HOME/.p10k.zsh" ]; then cp "$HOME/.p10k.zsh" "$HOME/.p10k.zsh.bak.$(date +%Y%m%d)" 2>/dev/null warn "Backed up existing .p10k.zsh" fi cp "${CONFIG_DIR}/shell/p10k.zsh" "$HOME/.p10k.zsh" ok ".p10k.zsh deployed." # ---- Deploy .zshrc.local (secrets template) ---- # This file should contain your API keys. The example file has placeholders. # It is NOT sourced by default. To enable, uncomment the "source ~/.zshrc.local" # line in your deployed .zshrc. info "Installing .zshrc.local example..." if [ ! -f "$HOME/.zshrc.local" ]; then cp "${CONFIG_DIR}/shell/zshrc.local.example" "$HOME/.zshrc.local" warn "Created ~/.zshrc.local from example. EDIT IT with your API keys." else ok ".zshrc.local already exists (keeping existing)." fi # ---- Change default shell to zsh ---- info "Setting zsh as default shell..." if [ "$SHELL" != "$(which zsh)" ]; then # Try chsh directly first, fallback to sudo chsh (for non-interactive provisioning) if chsh -s "$(which zsh)" 2>/dev/null; then ok "Default shell set to zsh. Log out and back in to activate." elif sudo chsh -s "$(which zsh)" "$USER" 2>/dev/null; then ok "Default shell set to zsh via sudo. Log out and back in to activate." else warn "Could not change shell (chsh). Run manually: chsh -s \"$(which zsh)\"" fi else ok "zsh is already the default shell." fi ok "Stage 04 complete: shell configured."