438 lines
13 KiB
Bash
Executable File
438 lines
13 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ============================================================================
|
|
# ADLee's Dotfiles Installation Script
|
|
# ============================================================================
|
|
# Quick install: curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/dotfiles/main/install.sh | bash
|
|
# Or: git clone https://github.com/YOUR_USERNAME/dotfiles.git && cd dotfiles && ./install.sh
|
|
|
|
set -e
|
|
|
|
# ============================================================================
|
|
# Configuration
|
|
# ============================================================================
|
|
|
|
DOTFILES_REPO="https://github.com/YOUR_USERNAME/dotfiles.git"
|
|
DOTFILES_DIR="$HOME/.dotfiles"
|
|
BACKUP_DIR="$HOME/.dotfiles_backup_$(date +%Y%m%d_%H%M%S)"
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# ============================================================================
|
|
# Helper Functions
|
|
# ============================================================================
|
|
|
|
print_header() {
|
|
echo -e "\n${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
|
echo -e "${BLUE}║${NC} ADLee's Dotfiles Installation ${BLUE}║${NC}"
|
|
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}\n"
|
|
}
|
|
|
|
print_step() {
|
|
echo -e "${GREEN}==>${NC} $1"
|
|
}
|
|
|
|
print_success() {
|
|
echo -e "${GREEN}✓${NC} $1"
|
|
}
|
|
|
|
print_warning() {
|
|
echo -e "${YELLOW}⚠${NC} $1"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}✗${NC} $1"
|
|
}
|
|
|
|
ask_yes_no() {
|
|
local prompt="$1"
|
|
local default="${2:-y}"
|
|
|
|
if [[ "$default" == "y" ]]; then
|
|
prompt="$prompt [Y/n]: "
|
|
else
|
|
prompt="$prompt [y/N]: "
|
|
fi
|
|
|
|
read -p "$prompt" response
|
|
response=${response:-$default}
|
|
|
|
[[ "$response" =~ ^[Yy]$ ]]
|
|
}
|
|
|
|
# ============================================================================
|
|
# Installation Functions
|
|
# ============================================================================
|
|
|
|
detect_os() {
|
|
print_step "Detecting operating system"
|
|
|
|
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
|
if [ -f /etc/os-release ]; then
|
|
. /etc/os-release
|
|
OS=$ID
|
|
OS_VERSION=$VERSION_ID
|
|
fi
|
|
print_success "Detected: Linux ($OS)"
|
|
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
|
OS="macos"
|
|
print_success "Detected: macOS"
|
|
else
|
|
OS="unknown"
|
|
print_warning "Unknown OS: $OSTYPE"
|
|
fi
|
|
}
|
|
|
|
install_dependencies() {
|
|
print_step "Installing dependencies"
|
|
|
|
case "$OS" in
|
|
ubuntu|debian)
|
|
sudo apt-get update
|
|
sudo apt-get install -y git curl zsh
|
|
;;
|
|
fedora|rhel|centos)
|
|
sudo dnf install -y git curl zsh
|
|
;;
|
|
arch)
|
|
sudo pacman -Sy --noconfirm git curl zsh
|
|
;;
|
|
macos)
|
|
if ! command -v brew &> /dev/null; then
|
|
print_warning "Homebrew not found. Installing..."
|
|
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
fi
|
|
brew install git curl zsh
|
|
;;
|
|
*)
|
|
print_warning "Please install git, curl, and zsh manually"
|
|
;;
|
|
esac
|
|
|
|
print_success "Dependencies installed"
|
|
}
|
|
|
|
clone_or_update_dotfiles() {
|
|
print_step "Setting up dotfiles repository"
|
|
|
|
if [ -d "$DOTFILES_DIR" ]; then
|
|
print_warning "Dotfiles directory already exists"
|
|
if ask_yes_no "Update existing dotfiles?"; then
|
|
cd "$DOTFILES_DIR"
|
|
#git pull origin main
|
|
print_success "Dotfiles updated"
|
|
fi
|
|
else
|
|
#git clone "$DOTFILES_REPO" "$DOTFILES_DIR"
|
|
print_success "Dotfiles cloned to $DOTFILES_DIR"
|
|
fi
|
|
}
|
|
|
|
backup_existing_configs() {
|
|
print_step "Backing up existing configurations"
|
|
|
|
local files_to_backup=(
|
|
".zshrc"
|
|
".bashrc"
|
|
".gitconfig"
|
|
".vimrc"
|
|
".tmux.conf"
|
|
)
|
|
|
|
local backup_needed=false
|
|
|
|
for file in "${files_to_backup[@]}"; do
|
|
if [ -f "$HOME/$file" ] && [ ! -L "$HOME/$file" ]; then
|
|
if [ "$backup_needed" = false ]; then
|
|
mkdir -p "$BACKUP_DIR"
|
|
backup_needed=true
|
|
fi
|
|
cp "$HOME/$file" "$BACKUP_DIR/"
|
|
print_success "Backed up: $file"
|
|
fi
|
|
done
|
|
|
|
if [ "$backup_needed" = true ]; then
|
|
print_success "Backups saved to: $BACKUP_DIR"
|
|
else
|
|
print_success "No backups needed"
|
|
fi
|
|
}
|
|
|
|
install_oh_my_zsh() {
|
|
print_step "Installing oh-my-zsh"
|
|
|
|
if [ -d "$HOME/.oh-my-zsh" ]; then
|
|
print_warning "oh-my-zsh already installed"
|
|
else
|
|
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
|
|
print_success "oh-my-zsh installed"
|
|
fi
|
|
}
|
|
|
|
link_dotfiles() {
|
|
print_step "Linking dotfiles"
|
|
|
|
# Link zshrc
|
|
if [ -f "$DOTFILES_DIR/zsh/.zshrc" ]; then
|
|
ln -sf "$DOTFILES_DIR/zsh/.zshrc" "$HOME/.zshrc"
|
|
print_success "Linked: .zshrc"
|
|
fi
|
|
|
|
# Link adlee theme
|
|
if [ -f "$DOTFILES_DIR/zsh/themes/adlee.zsh-theme" ]; then
|
|
ln -sf "$DOTFILES_DIR/zsh/themes/adlee.zsh-theme" "$HOME/.oh-my-zsh/themes/adlee.zsh-theme"
|
|
print_success "Linked: adlee.zsh-theme"
|
|
fi
|
|
|
|
# Link gitconfig
|
|
if [ -f "$DOTFILES_DIR/git/.gitconfig" ]; then
|
|
ln -sf "$DOTFILES_DIR/git/.gitconfig" "$HOME/.gitconfig"
|
|
print_success "Linked: .gitconfig"
|
|
fi
|
|
|
|
# Link vimrc
|
|
if [ -f "$DOTFILES_DIR/vim/.vimrc" ]; then
|
|
ln -sf "$DOTFILES_DIR/vim/.vimrc" "$HOME/.vimrc"
|
|
print_success "Linked: .vimrc"
|
|
fi
|
|
|
|
# Link tmux.conf
|
|
if [ -f "$DOTFILES_DIR/tmux/.tmux.conf" ]; then
|
|
ln -sf "$DOTFILES_DIR/tmux/.tmux.conf" "$HOME/.tmux.conf"
|
|
print_success "Linked: .tmux.conf"
|
|
fi
|
|
|
|
# Link bin scripts
|
|
if [ -d "$DOTFILES_DIR/bin" ]; then
|
|
mkdir -p "$HOME/.local/bin"
|
|
for script in "$DOTFILES_DIR/bin"/*; do
|
|
if [ -f "$script" ]; then
|
|
ln -sf "$script" "$HOME/.local/bin/$(basename "$script")"
|
|
chmod +x "$HOME/.local/bin/$(basename "$script")"
|
|
fi
|
|
done
|
|
print_success "Linked: bin scripts"
|
|
fi
|
|
}
|
|
|
|
set_zsh_default() {
|
|
print_step "Setting zsh as default shell"
|
|
|
|
if [ "$SHELL" != "$(which zsh)" ]; then
|
|
if ask_yes_no "Set zsh as your default shell?"; then
|
|
chsh -s "$(which zsh)"
|
|
print_success "Default shell changed to zsh (restart required)"
|
|
fi
|
|
else
|
|
print_success "zsh is already your default shell"
|
|
fi
|
|
}
|
|
|
|
install_espanso() {
|
|
print_step "Installing espanso (text expander)"
|
|
|
|
if command -v espanso &> /dev/null; then
|
|
print_warning "espanso already installed"
|
|
return 0
|
|
fi
|
|
|
|
case "$OS" in
|
|
ubuntu|debian)
|
|
# Install required dependencies
|
|
sudo apt-get install -y wget
|
|
|
|
# Download and install espanso
|
|
ESPANSO_VERSION="2.2.1"
|
|
wget "https://github.com/espanso/espanso/releases/download/v${ESPANSO_VERSION}/espanso-debian-x11-amd64.deb" -O /tmp/espanso.deb
|
|
sudo apt install /tmp/espanso.deb
|
|
rm /tmp/espanso.deb
|
|
|
|
# Register espanso as a systemd service
|
|
espanso service register
|
|
print_success "espanso installed (X11 version)"
|
|
;;
|
|
fedora|rhel|centos)
|
|
sudo dnf install -y wget
|
|
ESPANSO_VERSION="2.2.1"
|
|
wget "https://github.com/espanso/espanso/releases/download/v${ESPANSO_VERSION}/espanso-fedora-x11-amd64.rpm" -O /tmp/espanso.rpm
|
|
sudo dnf install /tmp/espanso.rpm
|
|
rm /tmp/espanso.rpm
|
|
espanso service register
|
|
print_success "espanso installed"
|
|
;;
|
|
arch)
|
|
# Check if paru is installed, if not try to install it
|
|
if ! command -v paru &> /dev/null; then
|
|
print_warning "paru not found, attempting to install..."
|
|
|
|
# Install dependencies for building paru
|
|
sudo pacman -S --needed --noconfirm base-devel git
|
|
|
|
# Clone and build paru
|
|
cd /tmp
|
|
git clone https://aur.archlinux.org/paru.git
|
|
cd paru
|
|
makepkg -si --noconfirm
|
|
cd ~
|
|
rm -rf /tmp/paru
|
|
|
|
print_success "paru installed"
|
|
fi
|
|
|
|
# Install espanso using paru
|
|
paru -S --noconfirm espanso-bin
|
|
espanso service register
|
|
print_success "espanso installed"
|
|
;;
|
|
macos)
|
|
brew tap espanso/espanso
|
|
brew install espanso
|
|
espanso service register
|
|
print_success "espanso installed"
|
|
;;
|
|
*)
|
|
print_warning "Please install espanso manually from: https://espanso.org/install/"
|
|
return 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
link_espanso_config() {
|
|
print_step "Linking espanso configuration"
|
|
|
|
if [ -d "$DOTFILES_DIR/espanso" ]; then
|
|
# Backup existing espanso config if it exists and is not a symlink
|
|
if [ -d "$HOME/.config/espanso" ] && [ ! -L "$HOME/.config/espanso" ]; then
|
|
if [ "$backup_needed" = false ]; then
|
|
mkdir -p "$BACKUP_DIR"
|
|
fi
|
|
mv "$HOME/.config/espanso" "$BACKUP_DIR/espanso"
|
|
print_success "Backed up existing espanso config"
|
|
fi
|
|
|
|
# Remove old symlink if it exists
|
|
[ -L "$HOME/.config/espanso" ] && rm "$HOME/.config/espanso"
|
|
|
|
# Create .config directory if it doesn't exist
|
|
mkdir -p "$HOME/.config"
|
|
|
|
# Create symlink
|
|
ln -sf "$DOTFILES_DIR/espanso" "$HOME/.config/espanso"
|
|
print_success "Linked: espanso config"
|
|
|
|
# Restart espanso if it's running
|
|
if command -v espanso &> /dev/null; then
|
|
espanso restart 2>/dev/null || true
|
|
print_success "Restarted espanso service"
|
|
fi
|
|
else
|
|
print_warning "No espanso config found in dotfiles"
|
|
fi
|
|
}
|
|
|
|
install_optional_tools() {
|
|
print_step "Optional tools"
|
|
|
|
# espanso - text expander
|
|
if ! command -v espanso &> /dev/null; then
|
|
if ask_yes_no "Install espanso (text expander)?"; then
|
|
install_espanso
|
|
fi
|
|
fi
|
|
|
|
# fzf - fuzzy finder
|
|
if ! command -v fzf &> /dev/null; then
|
|
if ask_yes_no "Install fzf (fuzzy finder)?"; then
|
|
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
|
|
~/.fzf/install --all
|
|
print_success "fzf installed"
|
|
fi
|
|
fi
|
|
|
|
# bat - better cat
|
|
if ! command -v bat &> /dev/null && ! command -v batcat &> /dev/null; then
|
|
if ask_yes_no "Install bat (better cat)?"; then
|
|
case "$OS" in
|
|
ubuntu|debian)
|
|
sudo apt-get install -y bat
|
|
;;
|
|
fedora|rhel|centos)
|
|
sudo dnf install -y bat
|
|
;;
|
|
arch)
|
|
sudo pacman -S --noconfirm bat
|
|
;;
|
|
macos)
|
|
brew install bat
|
|
;;
|
|
esac
|
|
print_success "bat installed"
|
|
fi
|
|
fi
|
|
|
|
# eza - better ls
|
|
if ! command -v eza &> /dev/null; then
|
|
if ask_yes_no "Install eza (better ls)?"; then
|
|
case "$OS" in
|
|
ubuntu|debian)
|
|
sudo apt-get install -y eza
|
|
;;
|
|
fedora|rhel|centos)
|
|
sudo dnf install -y eza
|
|
;;
|
|
arch)
|
|
sudo pacman -S --noconfirm eza
|
|
;;
|
|
macos)
|
|
brew install eza
|
|
;;
|
|
esac
|
|
print_success "eza installed"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# ============================================================================
|
|
# Main Installation Flow
|
|
# ============================================================================
|
|
|
|
main() {
|
|
print_header
|
|
|
|
detect_os
|
|
|
|
if ask_yes_no "Install/update dotfiles?"; then
|
|
install_dependencies
|
|
clone_or_update_dotfiles
|
|
backup_existing_configs
|
|
install_oh_my_zsh
|
|
link_dotfiles
|
|
link_espanso_config
|
|
set_zsh_default
|
|
install_optional_tools
|
|
|
|
echo
|
|
print_success "Installation complete!"
|
|
echo
|
|
echo -e "${BLUE}Next steps:${NC}"
|
|
echo " 1. Restart your terminal or run: exec zsh"
|
|
echo " 2. Your old configs are backed up in: $BACKUP_DIR"
|
|
echo " 3. Customize ~/.zshrc as needed"
|
|
echo
|
|
echo -e "${BLUE}To update dotfiles in the future:${NC}"
|
|
echo " cd ~/.dotfiles && git pull && ./install.sh"
|
|
echo
|
|
else
|
|
print_warning "Installation cancelled"
|
|
exit 0
|
|
fi
|
|
}
|
|
|
|
# Run main function
|
|
main "$@"
|