diff --git a/assets/alacritty/README.md b/assets/alacritty/README.md new file mode 100644 index 0000000..ade03fe --- /dev/null +++ b/assets/alacritty/README.md @@ -0,0 +1,109 @@ +# Alacritty Theme Synchronization + +This directory contains the theme synchronization system for Alacritty that automatically switches between Catppuccin light and dark themes based on your macOS system theme. + +## Files + +- `catppuccin-light.yml` - Catppuccin Latte (light) theme colors +- `catppuccin-dark.yml` - Catppuccin Mocha (dark) theme colors +- `README.md` - This documentation + +## Scripts + +The theme synchronization scripts are located in `/scripts/`: + +- `detect-system-theme.sh` - Detects current macOS system theme (light/dark) +- `sync-alacritty-theme.sh` - Syncs Alacritty config with current system theme +- `monitor-theme-changes.sh` - Continuously monitors for theme changes +- `setup-alacritty-theme-sync.sh` - Setup script for initial configuration + +## Setup + +1. Run the setup script: + ```bash + ./scripts/setup-alacritty-theme-sync.sh + ``` + +2. Choose your preferred method for automatic theme switching: + +### Option 1: Manual Sync +Run the sync script whenever you want to update the theme: +```bash +./scripts/sync-alacritty-theme.sh +``` + +### Option 2: Background Monitoring +Run the monitor script in the background: +```bash +./scripts/monitor-theme-changes.sh & +``` + +### Option 3: LaunchAgent (Recommended) +Install as a system service that runs automatically: +```bash +cp assets/launchd/com.user.alacritty-theme-sync.plist ~/Library/LaunchAgents/ +launchctl load ~/Library/LaunchAgents/com.user.alacritty-theme-sync.plist +``` + +### Option 4: Shell Integration +Add to your Fish shell configuration: +```bash +echo 'source /Users/danny/dotfiles/scripts/sync-alacritty-theme.sh' >> ~/.config/fish/config.fish +``` + +## How It Works + +1. The system detects your current macOS theme using `defaults read -g AppleInterfaceStyle` +2. Based on the theme, it applies the appropriate Catppuccin color scheme: + - **Light theme** → Catppuccin Latte + - **Dark theme** → Catppuccin Mocha +3. The Alacritty configuration is updated with the new colors +4. Running Alacritty instances are restarted to apply the new theme + +## Theme Colors + +### Catppuccin Latte (Light) +- Background: `#eff1f5` (base) +- Foreground: `#4c4f69` (text) +- Accent colors optimized for light backgrounds + +### Catppuccin Mocha (Dark) +- Background: `#1e1e2e` (base) +- Foreground: `#cdd6f4` (text) +- Accent colors optimized for dark backgrounds + +## Troubleshooting + +### Theme not updating +- Check if Alacritty config file exists and is writable +- Verify the theme detection script works: `./scripts/detect-system-theme.sh` +- Check logs in `/tmp/alacritty-theme-sync.log` + +### LaunchAgent not working +- Check if the plist file is in the correct location +- Verify permissions: `ls -la ~/Library/LaunchAgents/` +- Check launchctl status: `launchctl list | grep alacritty` + +### Manual theme override +If you want to manually set a theme regardless of system setting: +```bash +# Force light theme +ALACRITTY_THEME=light ./scripts/sync-alacritty-theme.sh + +# Force dark theme +ALACRITTY_THEME=dark ./scripts/sync-alacritty-theme.sh +``` + +## Integration with NixOS + +The NixOS configuration in `nixos/home/danny/home.nix` provides the base Alacritty configuration. The theme sync scripts work on top of this configuration, dynamically updating the colors section while preserving all other settings. + +## Customization + +To customize the themes: + +1. Edit the color values in `catppuccin-light.yml` or `catppuccin-dark.yml` +2. Run the sync script to apply changes +3. The changes will persist until the next theme switch + +For more advanced customization, you can modify the sync script to use different theme files or add additional theme variants. diff --git a/assets/alacritty/catppuccin-dark.yml b/assets/alacritty/catppuccin-dark.yml new file mode 100644 index 0000000..8eaa383 --- /dev/null +++ b/assets/alacritty/catppuccin-dark.yml @@ -0,0 +1,30 @@ +# Catppuccin Mocha (Dark) theme for Alacritty +colors: + # Catppuccin Mocha palette + primary: + background: '0x1e1e2e' # base + foreground: '0xcdd6f4' # text + + cursor: + text: '0x1e1e2e' # base + cursor: '0xf5e0dc' # rosewater + + normal: + black: '0x45475a' # surface1 + red: '0xf38ba8' # red + green: '0xa6e3a1' # green + yellow: '0xf9e2af' # yellow + blue: '0x89b4fa' # blue + magenta: '0xf5c2e7' # pink + cyan: '0x94e2d5' # teal + white: '0xbac2de' # subtext1 + + bright: + black: '0x585b70' # surface2 + red: '0xf38ba8' # red + green: '0xa6e3a1' # green + yellow: '0xf9e2af' # yellow + blue: '0x89b4fa' # blue + magenta: '0xf5c2e7' # pink + cyan: '0x94e2d5' # teal + white: '0xa6adc8' # subtext0 diff --git a/assets/alacritty/catppuccin-light.yml b/assets/alacritty/catppuccin-light.yml new file mode 100644 index 0000000..bc574ae --- /dev/null +++ b/assets/alacritty/catppuccin-light.yml @@ -0,0 +1,30 @@ +# Catppuccin Latte (Light) theme for Alacritty +colors: + # Catppuccin Latte palette + primary: + background: '0xeff1f5' # base + foreground: '0x4c4f69' # text + + cursor: + text: '0xeff1f5' # base + cursor: '0xdc8a78' # rosewater + + normal: + black: '0x5c5f77' # surface1 + red: '0xd20f39' # red + green: '0x40a02b' # green + yellow: '0xdf8e1d' # yellow + blue: '0x1e40af' # blue + magenta: '0xea76cb' # pink + cyan: '0x179299' # teal + white: '0xacb0be' # subtext1 + + bright: + black: '0x6c6f85' # surface2 + red: '0xd20f39' # red + green: '0x40a02b' # green + yellow: '0xdf8e1d' # yellow + blue: '0x1e40af' # blue + magenta: '0xea76cb' # pink + cyan: '0x179299' # teal + white: '0xbcc0cc' # subtext0 diff --git a/assets/launchd/com.user.alacritty-theme-sync.plist b/assets/launchd/com.user.alacritty-theme-sync.plist new file mode 100644 index 0000000..c23206d --- /dev/null +++ b/assets/launchd/com.user.alacritty-theme-sync.plist @@ -0,0 +1,31 @@ + + + + + Label + com.user.alacritty-theme-sync + + ProgramArguments + + /Users/danny/dotfiles/scripts/sync-alacritty-theme.sh + + + StartInterval + 30 + + RunAtLoad + + + StandardOutPath + /tmp/alacritty-theme-sync.log + + StandardErrorPath + /tmp/alacritty-theme-sync-error.log + + EnvironmentVariables + + PATH + /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin + + + diff --git a/nixos/home/danny/home.nix b/nixos/home/danny/home.nix index 272206f..890b3f5 100644 --- a/nixos/home/danny/home.nix +++ b/nixos/home/danny/home.nix @@ -132,6 +132,7 @@ }; # Alacritty terminal configuration (managed by Home Manager) + # Note: Colors are managed by the theme sync script for dynamic switching programs.alacritty = { enable = true; settings = { @@ -153,8 +154,8 @@ program = "${pkgs.fish}/bin/fish"; }; }; + # Default colors (Catppuccin Mocha - will be overridden by theme sync) colors = { - # Catppuccin Mocha palette primary = { background = "0x1e1e2e"; foreground = "0xcdd6f4"; }; normal = { black = "0x45475a"; red = "0xf38ba8"; green = "0xa6e3a1"; yellow = "0xf9e2af"; diff --git a/scripts/detect-system-theme.sh b/scripts/detect-system-theme.sh new file mode 100755 index 0000000..39ccd67 --- /dev/null +++ b/scripts/detect-system-theme.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# Detect macOS system theme (light/dark mode) +# Returns "light" or "dark" + +# Get the current appearance setting +appearance=$(defaults read -g AppleInterfaceStyle 2>/dev/null) + +if [ "$appearance" = "Dark" ]; then + echo "dark" +else + echo "light" +fi diff --git a/scripts/monitor-theme-changes.sh b/scripts/monitor-theme-changes.sh new file mode 100755 index 0000000..2548680 --- /dev/null +++ b/scripts/monitor-theme-changes.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +# Monitor system theme changes and sync Alacritty theme +# This script runs continuously and only updates Alacritty when the theme changes + +set -e + +# Get the directory where this script is located +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SYNC_SCRIPT="$SCRIPT_DIR/sync-alacritty-theme.sh" + +# State file to track the last known theme +STATE_FILE="/tmp/alacritty-theme-state" + +# Function to get current theme +get_current_theme() { + "$SCRIPT_DIR/detect-system-theme.sh" +} + +# Function to get last known theme +get_last_theme() { + if [ -f "$STATE_FILE" ]; then + cat "$STATE_FILE" + else + echo "" + fi +} + +# Function to save current theme +save_theme() { + echo "$1" > "$STATE_FILE" +} + +# Initial sync +echo "Starting Alacritty theme monitor..." +CURRENT_THEME=$(get_current_theme) +echo "Current theme: $CURRENT_THEME" + +# Run initial sync +"$SYNC_SCRIPT" +save_theme "$CURRENT_THEME" + +# Monitor for changes +while true; do + sleep 5 # Check every 5 seconds + + NEW_THEME=$(get_current_theme) + LAST_THEME=$(get_last_theme) + + if [ "$NEW_THEME" != "$LAST_THEME" ]; then + echo "Theme changed from '$LAST_THEME' to '$NEW_THEME'" + "$SYNC_SCRIPT" + save_theme "$NEW_THEME" + fi +done diff --git a/scripts/setup-alacritty-theme-sync.sh b/scripts/setup-alacritty-theme-sync.sh new file mode 100755 index 0000000..905c7ae --- /dev/null +++ b/scripts/setup-alacritty-theme-sync.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +# Setup script for Alacritty theme synchronization +# This script installs the necessary components to sync Alacritty with system theme + +set -e + +# Get the directory where this script is located +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DOTFILES_DIR="$(dirname "$SCRIPT_DIR")" + +echo "Setting up Alacritty theme synchronization..." + +# Check if we're on macOS +if [[ "$OSTYPE" != "darwin"* ]]; then + echo "Error: This script is designed for macOS" + exit 1 +fi + +# Check if Alacritty is installed +if ! command -v alacritty >/dev/null 2>&1; then + echo "Warning: Alacritty is not installed or not in PATH" + echo "Please install Alacritty first: brew install alacritty" +fi + +# Create Alacritty config directory if it doesn't exist +ALACRITTY_CONFIG_DIR="$HOME/.config/alacritty" +mkdir -p "$ALACRITTY_CONFIG_DIR" + +# Check if Alacritty config exists +ALACRITTY_CONFIG="$ALACRITTY_CONFIG_DIR/alacritty.yml" +if [ ! -f "$ALACRITTY_CONFIG" ]; then + echo "Creating default Alacritty configuration..." + cat > "$ALACRITTY_CONFIG" << 'EOF' +# Alacritty configuration +# This file will be automatically updated by the theme sync script + +window: + padding: + x: 8 + y: 8 + dynamic_padding: true + decorations: buttonless + opacity: 0.95 + startup_mode: Fullscreen + option_as_alt: Both + +scrolling: + history: 10000 + multiplier: 3 + +font: + size: 13.0 + +cursor: + style: Block + unfocused_hollow: true + +terminal: + shell: + program: /bin/fish + +# Colors will be automatically managed by theme sync +colors: + primary: + background: '0x1e1e2e' + foreground: '0xcdd6f4' +EOF + echo "Created default Alacritty config at $ALACRITTY_CONFIG" +fi + +# Test the theme detection script +echo "Testing theme detection..." +CURRENT_THEME=$("$SCRIPT_DIR/detect-system-theme.sh") +echo "Current system theme: $CURRENT_THEME" + +# Test the sync script +echo "Testing theme synchronization..." +"$SCRIPT_DIR/sync-alacritty-theme.sh" + +echo "" +echo "Setup complete! Here's what was configured:" +echo "" +echo "1. Theme detection script: $SCRIPT_DIR/detect-system-theme.sh" +echo "2. Theme sync script: $SCRIPT_DIR/sync-alacritty-theme.sh" +echo "3. Theme monitor script: $SCRIPT_DIR/monitor-theme-changes.sh" +echo "4. Alacritty config: $ALACRITTY_CONFIG" +echo "" +echo "To enable automatic theme switching, you have several options:" +echo "" +echo "Option 1 - Manual sync (run when needed):" +echo " $SCRIPT_DIR/sync-alacritty-theme.sh" +echo "" +echo "Option 2 - Background monitoring (runs continuously):" +echo " $SCRIPT_DIR/monitor-theme-changes.sh &" +echo "" +echo "Option 3 - LaunchAgent (automatic startup):" +echo " cp $DOTFILES_DIR/assets/launchd/com.user.alacritty-theme-sync.plist ~/Library/LaunchAgents/" +echo " launchctl load ~/Library/LaunchAgents/com.user.alacritty-theme-sync.plist" +echo "" +echo "Option 4 - Add to shell profile (runs on terminal startup):" +echo " echo 'source $SCRIPT_DIR/sync-alacritty-theme.sh' >> ~/.config/fish/config.fish" +echo "" +echo "Current theme applied: $CURRENT_THEME" diff --git a/scripts/sync-alacritty-theme.sh b/scripts/sync-alacritty-theme.sh new file mode 100755 index 0000000..2e94b0b --- /dev/null +++ b/scripts/sync-alacritty-theme.sh @@ -0,0 +1,130 @@ +#!/bin/bash + +# Sync Alacritty theme with system theme +# This script detects the current system theme and updates Alacritty configuration accordingly + +set -e + +# Get the directory where this script is located +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DOTFILES_DIR="$(dirname "$SCRIPT_DIR")" + +# Paths +THEME_DETECTION_SCRIPT="$SCRIPT_DIR/detect-system-theme.sh" +LIGHT_THEME="$DOTFILES_DIR/assets/alacritty/catppuccin-light.yml" +DARK_THEME="$DOTFILES_DIR/assets/alacritty/catppuccin-dark.yml" + +# Alacritty config locations (try different possible locations) +ALACRITTY_CONFIG_LOCATIONS=( + "$HOME/.config/alacritty/alacritty.yml" + "$HOME/.alacritty.yml" + "$HOME/Library/Application Support/Alacritty/alacritty.yml" +) + +# Find the actual Alacritty config file +ALACRITTY_CONFIG="" +for location in "${ALACRITTY_CONFIG_LOCATIONS[@]}"; do + if [ -f "$location" ]; then + ALACRITTY_CONFIG="$location" + break + fi +done + +if [ -z "$ALACRITTY_CONFIG" ]; then + echo "Error: Could not find Alacritty configuration file" + echo "Tried locations:" + for location in "${ALACRITTY_CONFIG_LOCATIONS[@]}"; do + echo " - $location" + done + exit 1 +fi + +# Detect current system theme +if [ ! -f "$THEME_DETECTION_SCRIPT" ]; then + echo "Error: Theme detection script not found at $THEME_DETECTION_SCRIPT" + exit 1 +fi + +CURRENT_THEME=$("$THEME_DETECTION_SCRIPT") +echo "Current system theme: $CURRENT_THEME" + +# Determine which theme file to use +if [ "$CURRENT_THEME" = "light" ]; then + THEME_FILE="$LIGHT_THEME" + THEME_NAME="Catppuccin Latte (Light)" +elif [ "$CURRENT_THEME" = "dark" ]; then + THEME_FILE="$DARK_THEME" + THEME_NAME="Catppuccin Mocha (Dark)" +else + echo "Error: Unknown theme '$CURRENT_THEME'. Expected 'light' or 'dark'" + exit 1 +fi + +if [ ! -f "$THEME_FILE" ]; then + echo "Error: Theme file not found at $THEME_FILE" + exit 1 +fi + +echo "Applying theme: $THEME_NAME" + +# Create backup of current config +BACKUP_FILE="${ALACRITTY_CONFIG}.backup.$(date +%Y%m%d_%H%M%S)" +cp "$ALACRITTY_CONFIG" "$BACKUP_FILE" +echo "Backup created: $BACKUP_FILE" + +# Create a temporary file for the new config +TEMP_CONFIG=$(mktemp) + +# Function to merge theme colors into config +merge_theme() { + local config_file="$1" + local theme_file="$2" + local output_file="$3" + + # Use yq to merge the theme colors into the config + # If yq is not available, fall back to a simpler approach + if command -v yq >/dev/null 2>&1; then + # Use yq for proper YAML merging + yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1)' "$config_file" "$theme_file" > "$output_file" + else + # Fallback: simple approach that replaces the colors section + # This is less robust but works without yq + awk ' + BEGIN { in_colors = 0; colors_printed = 0 } + /^colors:/ { + in_colors = 1 + if (!colors_printed) { + print "colors:" + while ((getline line < "'"$theme_file"'") > 0) { + if (line ~ /^colors:/) continue + print " " line + } + close("'"$theme_file"'") + colors_printed = 1 + } + next + } + in_colors && /^[a-zA-Z]/ && !/^ / { in_colors = 0 } + !in_colors { print } + ' "$config_file" > "$output_file" + fi +} + +# Merge the theme into the config +merge_theme "$ALACRITTY_CONFIG" "$THEME_FILE" "$TEMP_CONFIG" + +# Replace the original config with the new one +mv "$TEMP_CONFIG" "$ALACRITTY_CONFIG" + +echo "Alacritty theme synchronized successfully!" +echo "Config file: $ALACRITTY_CONFIG" +echo "Applied theme: $THEME_NAME" + +# Optionally, send a signal to running Alacritty instances to reload config +# This requires Alacritty to be running with live config reload enabled +if command -v osascript >/dev/null 2>&1; then + # Try to reload Alacritty config using AppleScript + osascript -e 'tell application "Alacritty" to quit' 2>/dev/null || true + # Restart Alacritty (you might want to adjust this based on your setup) + open -a Alacritty 2>/dev/null || true +fi