#!/bin/bash set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color log_info() { echo -e "${GREEN}▶${NC} $1"; } log_warn() { echo -e "${YELLOW}⚠${NC} $1"; } log_error() { echo -e "${RED}✗${NC} $1"; } # Detect OS if [ -f /etc/os-release ]; then . /etc/os-release OS=$ID VERSION=$VERSION_ID else log_error "Cannot detect OS. This script requires /etc/os-release" exit 1 fi log_info "Detected OS: $OS $VERSION" # Check if running on Debian/Ubuntu if [[ ! "$OS" =~ ^(debian|ubuntu)$ ]]; then log_warn "This script is optimized for Debian/Ubuntu. Detected: $OS" read -p "Continue anyway? (y/N) " -n 1 -r echo [[ ! $REPLY =~ ^[Yy]$ ]] && exit 1 fi log_info "Setting up dotfiles on $OS..." # Update package list log_info "Updating package list..." sudo apt-get update -qq # Install packages available via apt log_info "Installing packages via apt..." sudo apt-get install -y \ curl \ wget \ git \ zsh \ build-essential \ unzip \ fzf \ jq # Install chezmoi log_info "Installing chezmoi..." if ! command -v chezmoi &> /dev/null; then sh -c "$(curl -fsLS get.chezmoi.io)" -- -b "$HOME/.local/bin" export PATH="$HOME/.local/bin:$PATH" else log_info "chezmoi already installed" fi # Install zoxide log_info "Installing zoxide..." if ! command -v zoxide &> /dev/null; then curl -sS https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | bash else log_info "zoxide already installed" fi # Install neovim from apt (or PPA for latest version) log_info "Installing neovim..." if ! command -v nvim &> /dev/null; then # Try to install from apt first if apt-cache show neovim &> /dev/null; then sudo apt-get install -y neovim else # Fallback to manual installation log_warn "Installing neovim from GitHub releases..." curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz sudo rm -rf /opt/nvim sudo tar -C /opt -xzf nvim-linux64.tar.gz sudo ln -sf /opt/nvim-linux64/bin/nvim /usr/local/bin/nvim rm nvim-linux64.tar.gz fi else log_info "neovim already installed" fi # Install yazi log_info "Installing yazi..." if ! command -v yazi &> /dev/null; then YAZI_VERSION=$(curl -s https://api.github.com/repos/sxyazi/yazi/releases/latest | jq -r '.tag_name') curl -LO "https://github.com/sxyazi/yazi/releases/download/${YAZI_VERSION}/yazi-x86_64-unknown-linux-gnu.zip" unzip -q yazi-x86_64-unknown-linux-gnu.zip sudo mv yazi-x86_64-unknown-linux-gnu/yazi /usr/local/bin/ sudo mv yazi-x86_64-unknown-linux-gnu/ya /usr/local/bin/ rm -rf yazi-x86_64-unknown-linux-gnu yazi-x86_64-unknown-linux-gnu.zip else log_info "yazi already installed" fi # Clone and apply dotfiles log_info "Setting up dotfiles with chezmoi..." if [ -d "$HOME/.local/share/chezmoi" ]; then log_warn "Dotfiles already exist, updating..." chezmoi update else chezmoi init --apply https://github.com/nilh2a2/dotfiles.git fi log_info "✓ Setup complete!" echo "" echo "Please restart your shell or run: source ~/.zshrc"