#!/usr/bin/env bash # --- Helper functions --- log() { echo -e "\033[1;34m[INFO]\033[0m $*"; } # Define paths as they have not been defined by new bashrc yet! PANAMA_PATH="${PANAMA_PATH:-$HOME/.local/share/Panama}" PANAMA_BASH="${PANAMA_BASH:-$PANAMA_PATH/config/bash}" PANAMA_DOT="$PANAMA_PATH/config/dot" PANAMA_OLD="$PANAMA_PATH/config/old" CONFIG="$HOME/.config" # Make backup folder if it doesn't exist mkdir -p "$PANAMA_OLD" # --- Bashrc --- echo -e "\n--- Replacing .bashrc ---" # Backup existing .bashrc if it's a regular file if [ -f "$HOME/.bashrc" ] && [ ! -L "$HOME/.bashrc" ]; then log "Backing up existing .bashrc" mv "$HOME/.bashrc" "$PANAMA_OLD/.bashrc" fi # Remove old symlink if it exists and points somewhere else if [ -L "$HOME/.bashrc" ]; then log "Removing old .bashrc symlink" rm "$HOME/.bashrc" fi # Symlink Panama .bashrc file to ~/.bashrc log "Symlinking Panama .bashrc file to ~/.bashrc" ln -s "$PANAMA_BASH/.bashrc" "$HOME/.bashrc" # Each entry is symlinked as ~/.config/ -> $PANAMA_DOT/. # "forge" is the GNOME tiling extension; "hypr"/"quickshell"/"wofi" are the # Hyprland desktop. They coexist deliberately — the GNOME session keeps working # while Hyprland is being used, so you can log back into either. dirs=("espanso" "forge" "ghostty" "gtk-3.0" "gtk-4.0" "hypr" "kitty" "nvim" \ "quickshell" "tmux" "uwsm" "vicinae" "wofi" "xdg-desktop-portal") # --- Vim vimrc --- echo -e "\n--- Setting up vim ---" mkdir -p "$HOME/.vim" if [ -L "$HOME/.vim/vimrc" ]; then rm "$HOME/.vim/vimrc" log "Removed old symlink at ~/.vim/vimrc" fi if [ -f "$HOME/.vim/vimrc" ]; then mv "$HOME/.vim/vimrc" "$PANAMA_OLD/vimrc" log "Moved existing ~/.vim/vimrc to $PANAMA_OLD/vimrc" fi ln -s "$PANAMA_DOT/vim/vimrc" "$HOME/.vim/vimrc" log "Linked $PANAMA_DOT/vim/vimrc → ~/.vim/vimrc" for dir in "${dirs[@]}"; do echo -e "\n--- Setting up $dir ---" # Remove old symlink if it exists if [ -L "$CONFIG/$dir" ]; then rm "$CONFIG/$dir" log "Removed old symlink at $CONFIG/$dir" fi # Backup existing directory if it exists if [ -d "$CONFIG/$dir" ]; then mv "$CONFIG/$dir" "$PANAMA_OLD/$dir" log "Moved existing $dir config to $PANAMA_OLD/$dir" fi # Create symlink ln -s "$PANAMA_DOT/$dir" "$CONFIG/$dir" log "Linked $PANAMA_DOT/$dir → $CONFIG/$dir" done # kitty.conf ends with `include current-theme.conf`, and that file is generated # from the desktop colour scheme rather than committed -- it is machine state. # A fresh checkout therefore has no such file, and kitty starts by complaining # about a missing include and falling back to its stock colours. Seed it from # the scheme in settings.json (dark unless the user has chosen otherwise) so a # first launch is themed; ColorScheme.qml overwrites it on every change after. KITTY_THEME="$PANAMA_DOT/kitty/current-theme.conf" if [ -e "$KITTY_THEME" ]; then log "Keeping existing kitty theme at $KITTY_THEME" else scheme="dark" settings="${XDG_CONFIG_HOME:-$HOME/.config}/panama/settings.json" if [ -r "$settings" ]; then stored="$(jq -r '.colorScheme // "dark"' "$settings" 2>/dev/null || echo dark)" [ "$stored" = "light" ] && scheme="light" fi [ "$scheme" = "light" ] && theme="tokyonight-day" || theme="tokyonight-moon" cp "$PANAMA_DOT/kitty/themes/$theme.conf" "$KITTY_THEME" log "Seeded kitty $scheme theme ($theme) → $KITTY_THEME" fi # Vicinae 0.26 discovers user themes from its XDG data directory rather than # from ~/.config/vicinae. Keep the authored theme in Panama with the rest of # the launcher config and expose only that file at Vicinae's runtime path. VICINAE_THEME_DIR="$HOME/.local/share/vicinae/themes" VICINAE_THEME="$VICINAE_THEME_DIR/tokyonight-moon.toml" mkdir -p "$VICINAE_THEME_DIR" if [ -L "$VICINAE_THEME" ]; then rm "$VICINAE_THEME" fi if [ -e "$VICINAE_THEME" ]; then log "Keeping existing Vicinae theme at $VICINAE_THEME" else ln -s "$PANAMA_DOT/vicinae/themes/tokyonight-moon.toml" "$VICINAE_THEME" log "Linked Tokyo Night Moon theme → $VICINAE_THEME" fi # Panama-native applications live in the user data directory so launchers can # discover them alongside system desktop entries. Keep each authored file in # the repository and expose it with a narrow per-file symlink. # Panama ships its own application icons. Without these the desktop entries fall # back to a generic symbolic glyph, which is drawn for 16px toolbar use and # looks wrong beside full-colour application icons in the dock. PANAMA_ICON_DIR="$PANAMA_PATH/config/local/share/icons/hicolor/scalable/apps" USER_ICON_DIR="$HOME/.local/share/icons/hicolor/scalable/apps" mkdir -p "$USER_ICON_DIR" for icon_file in "$PANAMA_ICON_DIR"/*.svg; do [[ -e "$icon_file" ]] || continue icon_name="$(basename "$icon_file")" icon_target="$USER_ICON_DIR/$icon_name" if [[ -L "$icon_target" ]]; then rm "$icon_target" elif [[ -e "$icon_target" ]]; then mv "$icon_target" "$icon_target.bak" fi ln -s "$icon_file" "$icon_target" done gtk-update-icon-cache -f -t "$HOME/.local/share/icons/hicolor" 2>/dev/null || true PANAMA_APPLICATION_DIR="$PANAMA_PATH/config/local/share/applications" USER_APPLICATION_DIR="$HOME/.local/share/applications" mkdir -p "$USER_APPLICATION_DIR" for desktop_file in "$PANAMA_APPLICATION_DIR"/*.desktop; do [[ -e "$desktop_file" ]] || continue desktop_name="$(basename "$desktop_file")" desktop_target="$USER_APPLICATION_DIR/$desktop_name" if [[ -L "$desktop_target" ]]; then rm "$desktop_target" elif [[ -e "$desktop_target" ]]; then log "Keeping existing desktop entry at $desktop_target" continue fi ln -s "$desktop_file" "$desktop_target" log "Linked $desktop_name → $desktop_target" done