#!/usr/bin/env bash # themaster2009sf Hyprland dotfiles installer (Arch Linux) # Usage: curl -fsSL https://dots.themaster2009sf.ru/install.sh | bash # bash install.sh [--no-packages] [--yes] set -euo pipefail BASE_URL="https://dots.themaster2009sf.ru" ARCHIVE_URL="$BASE_URL/dotfiles.tar.gz" CONFIGS=(hypr waybar rofi kitty mako) WALL_DIR="$HOME/.local/share/wallpapers" WALLPAPER="$WALL_DIR/catppuccin-themaster.png" NO_PACKAGES=0 ASSUME_YES=0 if [ -t 1 ]; then C_R=$'\033[31m'; C_G=$'\033[32m'; C_Y=$'\033[33m'; C_M=$'\033[35m'; C_0=$'\033[0m' else C_R=""; C_G=""; C_Y=""; C_M=""; C_0="" fi info() { printf '%s==>%s %s\n' "$C_M" "$C_0" "$*"; } ok() { printf '%s ok%s %s\n' "$C_G" "$C_0" "$*"; } warn() { printf '%s !!%s %s\n' "$C_Y" "$C_0" "$*" >&2; } die() { printf '%serr%s %s\n' "$C_R" "$C_0" "$*" >&2; exit 1; } usage() { cat </dev/null; then read -r -p "$prompt [y/N] " reply /dev/null 2>&1 || die "Нужен curl." command -v tar >/dev/null 2>&1 || die "Нужен tar." TMP_DIR="$(mktemp -d)" cleanup() { rm -rf "$TMP_DIR"; } trap cleanup EXIT install_packages() { command -v sudo >/dev/null 2>&1 || die "Нужен sudo." local rofi_pkg="rofi-wayland" if ! pacman -Si rofi-wayland >/dev/null 2>&1; then rofi_pkg="rofi" fi local pkgs=(hyprland waybar "$rofi_pkg" kitty mako hyprlock hypridle hyprpaper hyprpolkitagent xdg-desktop-portal-hyprland grim slurp wl-clipboard brightnessctl playerctl pipewire wireplumber pavucontrol network-manager-applet ttf-jetbrains-mono-nerd noto-fonts noto-fonts-emoji qt5-wayland qt6-wayland git base-devel) info "Пакеты: ${pkgs[*]}" confirm "Установить пакеты через pacman?" || { warn "Пакеты пропущены."; return 0; } local noconfirm=() [ "$ASSUME_YES" -eq 1 ] && noconfirm=(--noconfirm) sudo pacman -Syu --needed "${noconfirm[@]}" "${pkgs[@]}" ok "Пакеты установлены" if ! command -v yay >/dev/null 2>&1; then info "Собираю yay-bin из AUR" git clone --depth 1 https://aur.archlinux.org/yay-bin.git "$TMP_DIR/yay-bin" (cd "$TMP_DIR/yay-bin" && makepkg -si "${noconfirm[@]}") ok "yay установлен" fi } backup_configs() { local stamp dest moved=0 stamp="$(date +%Y%m%d-%H%M%S)" dest="$HOME/.config-backup/$stamp" for c in "${CONFIGS[@]}"; do if [ -e "$HOME/.config/$c" ]; then mkdir -p "$dest" cp -a "$HOME/.config/$c" "$dest/" moved=1 fi done if [ "$moved" -eq 1 ]; then ok "Бэкап старых конфигов: $dest"; fi } install_configs() { info "Скачиваю $ARCHIVE_URL" curl -fsSL "$ARCHIVE_URL" -o "$TMP_DIR/dotfiles.tar.gz" tar -xzf "$TMP_DIR/dotfiles.tar.gz" -C "$TMP_DIR" local src="$TMP_DIR/hyprland-dots" [ -d "$src/config" ] || die "Архив повреждён: нет каталога config/" backup_configs mkdir -p "$HOME/.config" "$WALL_DIR" for c in "${CONFIGS[@]}"; do rm -rf "${HOME:?}/.config/$c" cp -r "$src/config/$c" "$HOME/.config/$c" done cp -f "$src"/wallpapers/*.png "$WALL_DIR/" # hyprpaper/hyprlock не раскрывают $HOME — подставляем абсолютный путь local esc esc="$(printf '%s' "$WALLPAPER" | sed 's/[&|\\]/\\&/g')" sed -i "s|@WALLPAPER@|$esc|g" "$HOME/.config/hypr/hyprpaper.conf" "$HOME/.config/hypr/hyprlock.conf" ok "Конфиги установлены в ~/.config, обои в $WALL_DIR" } info "themaster2009sf Hyprland dotfiles (Catppuccin Mocha)" if [ "$NO_PACKAGES" -eq 0 ]; then install_packages else info "--no-packages: пропускаю установку пакетов" fi confirm "Заменить ~/.config/{hypr,waybar,rofi,kitty,mako}? (старые будут в ~/.config-backup)" \ || die "Отменено." install_configs ok "Готово. Выйдите и выберите сессию Hyprland (или запустите 'Hyprland' из TTY)."