From 4e92d7a7556df38faba9ae775bf46953e29f5534 Mon Sep 17 00:00:00 2001 From: aibrash Date: Wed, 28 Oct 2026 11:39:32 +0500 Subject: [PATCH] Make the rice shareable: appearance-only default, --with-shell, --layouts, --restore, 07-input and 99-personal split - default install: SwayFX + DMS + kitty + fonts/theme + hotkeys/screenshots only - zsh/tmux/CLI tools behind --with-shell; personal apps/autostart/mouse speed removed from the repo - keyboard layouts prompt/--layouts, user-editable files (07-input.conf, dms/settings.json) never overwritten - --restore (oldest backup), unique backup dirs, README rewritten for strangers, private URL removed Co-Authored-By: Claude Sonnet 5.5 --- .config/dms/settings.json | 1 - .config/sway/config | 5 +- .config/sway/config.d/06-mouse.conf | 4 - .config/sway/config.d/07-input.conf | 16 +++ .config/sway/config.d/10-appearance.conf | 8 -- .config/sway/config.d/60-autostart.conf | 5 - .config/sway/doctor.sh | 12 +- README.md | 116 +++++++++--------- examples/99-personal.conf.example | 12 ++ install.sh | 144 ++++++++++++++--------- 10 files changed, 186 insertions(+), 137 deletions(-) delete mode 100644 .config/sway/config.d/06-mouse.conf create mode 100644 .config/sway/config.d/07-input.conf delete mode 100644 .config/sway/config.d/60-autostart.conf create mode 100644 examples/99-personal.conf.example diff --git a/.config/dms/settings.json b/.config/dms/settings.json index 81e1ffb..164ac1c 100644 --- a/.config/dms/settings.json +++ b/.config/dms/settings.json @@ -136,7 +136,6 @@ "audioVisualizerEnabled": true, "scrollTitleEnabled": true, "dashOptions": {}, - "batteryChargeLimit": 80, "controlCenterColumns": 9, "controlCenterWidgets": [ { diff --git a/.config/sway/config b/.config/sway/config index 4a15b57..3c3edcf 100644 --- a/.config/sway/config +++ b/.config/sway/config @@ -216,9 +216,6 @@ include ~/.config/sway/config.d/*.conf -input "type:keyboard" { - xkb_layout "us,ru" - xkb_options "grp:alt_shift_toggle,grp_led:scroll" -} +# Keyboard, touchpad: see config.d/07-input.conf diff --git a/.config/sway/config.d/06-mouse.conf b/.config/sway/config.d/06-mouse.conf deleted file mode 100644 index 9a62903..0000000 --- a/.config/sway/config.d/06-mouse.conf +++ /dev/null @@ -1,4 +0,0 @@ -# Mouse sensitivity: -1 (slowest) .. 1 (fastest), 0 is default. Touchpad is set in 10-appearance.conf -input type:pointer { - pointer_accel -0.5 -} diff --git a/.config/sway/config.d/07-input.conf b/.config/sway/config.d/07-input.conf new file mode 100644 index 0000000..4b86d58 --- /dev/null +++ b/.config/sway/config.d/07-input.conf @@ -0,0 +1,16 @@ +# Input devices: edit freely. install.sh --layouts "us,de" rewrites the keyboard line. +# Keep a Latin layout FIRST: the hotkeys are bound with --to-code and work on the other layouts too. +input "type:keyboard" { + xkb_layout "us,ru" + xkb_options "grp:alt_shift_toggle,grp_led:scroll" +} + +input type:touchpad { + tap enabled + tap_button_map lrm + natural_scroll enabled + dwt enabled + middle_emulation enabled +} + +# Mouse / touchpad speed (-1 slowest .. 1 fastest) goes into your own config.d/99-personal.conf diff --git a/.config/sway/config.d/10-appearance.conf b/.config/sway/config.d/10-appearance.conf index 0ce68be..275d264 100644 --- a/.config/sway/config.d/10-appearance.conf +++ b/.config/sway/config.d/10-appearance.conf @@ -32,14 +32,6 @@ exec_always sh -c 'pkill -x nm-applet; exec nm-applet --indicator' bindsym --to-code $mod+Shift+x exec ~/.config/sway/lock.sh # Touchpad -input type:touchpad { - tap enabled - tap_button_map lrm - natural_scroll enabled - dwt enabled - middle_emulation enabled - pointer_accel 0.3 -} # Window rules for_window [app_id="pavucontrol|nm-connection-editor|blueman-manager"] floating enable, resize set 700 500, border pixel 2 diff --git a/.config/sway/config.d/60-autostart.conf b/.config/sway/config.d/60-autostart.conf deleted file mode 100644 index 8474492..0000000 --- a/.config/sway/config.d/60-autostart.conf +++ /dev/null @@ -1,5 +0,0 @@ -# Autostart (xdg-autostart does not run under sway). Delayed so the DMS tray is ready; -# guarded against duplicates and against apps that are not installed on this machine. -exec sh -c 'sleep 5; flatpak info com.nextcloud.desktopclient.nextcloud >/dev/null 2>&1 && ! pgrep -f "[n]extcloud.*--background" >/dev/null && flatpak run com.nextcloud.desktopclient.nextcloud --background' -exec sh -c 'sleep 5; flatpak info org.remmina.Remmina >/dev/null 2>&1 && ! pgrep -f "[R]emmina.* -i" >/dev/null && flatpak run org.remmina.Remmina -i' -exec sh -c 'sleep 8; command -v geary >/dev/null && ! pgrep -x geary >/dev/null && geary --gapplication-service' diff --git a/.config/sway/doctor.sh b/.config/sway/doctor.sh index 0faa6dc..f221a59 100755 --- a/.config/sway/doctor.sh +++ b/.config/sway/doctor.sh @@ -41,12 +41,14 @@ fc-list 2>/dev/null | grep -qi "JetBrains Mono" && ok "JetBrains Mono" || bad "J fc-list 2>/dev/null | grep -qiE "Font ?Awesome" && ok "Font Awesome" || warn "Font Awesome missing (some icons)" { [ -d /usr/share/themes/adw-gtk3-dark ] || [ -d "$HOME/.local/share/themes/adw-gtk3-dark" ]; } && ok "adw-gtk3 theme" || warn "adw-gtk3 theme missing (GTK apps will not follow the palette)" -section "Terminal and shell tools" -for t in kitty zsh tmux git fzf zoxide eza bat fd rg ncdu lazygit; do - have "$t" || { [ "$t" = fd ] && have fdfind; } && ok "$t" || warn "$t missing" +section "Terminal" +have kitty && ok "kitty" || bad "kitty missing" +section "Optional shell setup (install.sh --with-shell)" +opt() { printf ' \033[2m--\033[0m %s\n' "$*"; } +for t in zsh tmux git fzf zoxide eza bat fd rg ncdu lazygit; do + if have "$t" || { [ "$t" = fd ] && have fdfind; }; then ok "$t"; else opt "$t not installed (optional)"; fi done -[ -d "$HOME/.oh-my-zsh" ] && ok "oh-my-zsh" || warn "oh-my-zsh missing" -[ "$(basename "${SHELL:-}")" = zsh ] && ok "login shell is zsh" || warn "login shell is not zsh (run: chsh -s $(command -v zsh || echo /usr/bin/zsh))" +[ -d "$HOME/.oh-my-zsh" ] && ok "oh-my-zsh" || opt "oh-my-zsh not installed (optional)" section "Per-machine config" [ -f "$CFG/sway/config.d/05-outputs.conf" ] && ok "monitor layout (05-outputs.conf)" || warn "no monitor layout yet: run ~/.config/sway/outputs-setup.sh inside sway" diff --git a/README.md b/README.md index 8c8d5f2..b1beab3 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,46 @@ # sway-rising -Монохромный «стеклянный» райс для **SwayFX** на Fedora: blur, скруглённые углы, мягкое свечение у активного окна и **DankMaterialShell** (бар, лаунчер, панель управления с Wi-Fi / Bluetooth / VPN, уведомления, блокировка, обои) поверх sway. +«Стеклянный» райс для **Fedora**: матовый blur, скруглённые углы, мягкое свечение у активного окна, **SwayFX** (тайлинг-композитор) и **DankMaterialShell** (бар, лаунчер, панель управления с Wi-Fi / Bluetooth / VPN, уведомления, экран блокировки, обои), терминал **kitty** с красивой палитрой, удобные скриншоты и хоткеи. Ставится одной командой, откатывается одной командой. -## Что внутри +## Установка -| Путь | Что это | +Нужны: Fedora (лучше Workstation), `git`, интернет, `sudo`. + +```sh +git clone sway-rising && cd sway-rising +./install.sh --dry-run # необязательно: показать, что будет сделано, ничего не меняя +./install.sh +``` + +Скрипт спросит про два сторонних репозитория (COPR) для SwayFX и DMS и про раскладки клавиатуры, остальное делает сам. Без вопросов: `./install.sh --yes`. + +Перед началом ваши настройки **сохраняются в `~/rice-backup-<дата>`**. Ваши программы, `~/.zshrc`, tmux, ssh и браузер не трогаются. + +Что ставится: сессия sway (`SwayFX`, `sway-systemd`, порталы), `DankMaterialShell`, kitty, Nautilus, swaylock/swayidle, grim + swappy (скриншоты), шрифты JetBrains Mono и Font Awesome, тема `adw-gtk3`. + +Хочется ещё и zsh с oh-my-zsh, tmux и удобными утилитами (fzf, zoxide, eza, bat, fd, ripgrep, lazygit)? Добавьте `--with-shell`. + +После установки **выйдите и выберите на экране входа сессию «Sway»**. При первом запуске райс сам выберет обои и расставит ваши мониторы (ноутбук слева, внешние справа, масштаб подбирается по разрешению). + +Если на машине стоит Fedora Sway Spin, в ней есть обычный `sway`, который конфликтует с SwayFX: скрипт предупредит и подскажет команду `sudo dnf remove sway sway-config-fedora`. + +## Настройка под себя + +| Что | Как | |---|---| -| `.config/sway/config` | базовый конфиг sway (раскладки us/ru, хоткеи, `--to-code`: хоткеи работают и на русской раскладке) | -| `.config/sway/config.d/00-session.conf` | окружение и `sway-session.target`, чтобы работали порталы (демонстрация экрана, диалоги) | -| `.config/sway/config.d/05-outputs.conf.example` | пример раскладки мониторов; свой файл создаёт `outputs-setup.sh` | -| `.config/sway/config.d/06-mouse.conf` | чувствительность мыши | -| `.config/sway/config.d/10-appearance.conf` | цвета рамок и вкладок, отступы, тачпад, правила окон, idle | -| `.config/sway/config.d/20-swayfx.conf`, `21-dms-effects.conf` | эффекты SwayFX: blur, тени, скругления, прозрачность; blur для слоёв DMS | -| `.config/sway/config.d/30-workflow.conf` | scratchpad-терминал, скриншоты, шпаргалка, режим производительности | -| `.config/sway/config.d/50-dms.conf` | запуск DMS, буфер обмена, медиаклавиши (громкость, яркость, плеер) | -| `.config/sway/config.d/60-autostart.conf` | автозапуск Nextcloud, Remmina и Geary (xdg-autostart в sway не работает) | -| `.config/sway/screenshot.sh` | все режимы скриншотов (см. ниже) | -| `.config/sway/{lock,idle,cheatsheet}.sh` | блокировка (DMS, запасной swaylock), swayidle, шпаргалка по хоткеям | -| `.config/sway/outputs-setup.sh`, `firstrun.sh`, `doctor.sh` | раскладка мониторов под новое железо; первый запуск (обои, мониторы); проверка здоровья системы | -| `.config/dms/settings.json` | настройки DMS: виджеты бара (раскладка, VPN, температура, приватность), шрифты, панель управления | -| `.config/kitty/kitty.conf` | JetBrains Mono, палитра Tokyo Night, прозрачность, вкладки (`Ctrl+Shift+←/→`) и сплиты (`Ctrl+Alt+стрелки`); `Ctrl+C` копирует выделенное (без выделения прерывает), `Ctrl+V` вставляет | -| `.config/swappy/config` | редактор скриншотов (стрелки, текст, размытие) | -| `.config/swaylock/` | запасная блокировка, если DMS не запущен | -| `home/.tmux.conf`, `home/.zshrc`, `home/.oh-my-zsh/custom/sysadmin.zsh` | tmux, zsh, алиасы сисадмина; fzf / zoxide / eza подключаются сами | -| `wallpapers/` | любимые обои (кладутся в `~/.local/share/backgrounds`, дальше обоями управляет DMS) | +| Цвета, шрифты, виджеты бара, прозрачность | интерфейс DMS (значок настроек в панели `Super+N`) | +| Обои | интерфейс DMS: Settings → Wallpaper | +| Раскладки клавиатуры, тачпад | `~/.config/sway/config.d/07-input.conf` или `./install.sh --layouts "us,de"` | +| Мониторы и масштаб | `~/.config/sway/outputs-setup.sh` (с вопросами) или файл `config.d/05-outputs.conf` | +| Свои твики (скорость мыши, автозапуск программ) | `~/.config/sway/config.d/99-personal.conf`, пример: `examples/99-personal.conf.example`. Установщик такие файлы **никогда не трогает** | +| Хоткеи | `config` и `config.d/30-workflow.conf`; список всех: `Super+F1` | -Обои, уведомления, панель управления, лаунчер и бар обслуживает DMS. Waybar, swaync, dunst, rofi и сопутствующие скрипты убраны из репозитория. +Повторный запуск `./install.sh` безопасен: он обновит райс и заново сделает бэкап, а ваши `07-input.conf`, настройки DMS (`~/.config/dms/settings.json`) и все `99-*.conf` оставит как есть. + +## Откат и диагностика + +- **Вернуть всё как было:** `./install.sh --restore` (берёт самый старый бэкап, то есть состояние до райса; можно указать папку: `--restore ~/rice-backup-...`). Пакеты при этом остаются, убрать их: `sudo dnf remove swayfx dms`. +- **Проверка здоровья:** `./install.sh --check` (то же: `~/.config/sway/doctor.sh`) покажет, что установлено и что работает. Диагностика самого DMS: `dms doctor`. ## Скриншоты @@ -67,40 +82,29 @@ | `Super+C` | центрировать плавающее окно | | `Super+R` | режим изменения размера (`H/J/K/L`, `Esc`) | | `Super+S` / `Super+W` / `Super+E` | layout: stacking / tabbed / split | -| `Alt+Shift` | переключение раскладки (us / ru); первой в `xkb_layout` должна стоять `us` | +| `Alt+Shift` | переключение раскладки; все хоткеи работают на любой раскладке | -## Новый ноутбук за одну команду (Fedora) +## Что внутри -На свежей Fedora (Workstation или любой вариант с `git`): +| Путь | Что это | +|---|---| +| `install.sh` | установщик (Fedora): пакеты, бэкап, конфиги, `--restore`, `--check`, `--dry-run` | +| `.config/sway/config` | базовый конфиг sway; все хоткеи работают и на других раскладках (`bindsym --to-code`) | +| `.config/sway/config.d/00-session.conf` | окружение и `sway-session.target`, чтобы работали порталы (демонстрация экрана, диалоги) | +| `.config/sway/config.d/05-outputs.conf.example` | пример раскладки мониторов (свой файл создаёт `outputs-setup.sh`) | +| `.config/sway/config.d/07-input.conf` | клавиатура и тачпад | +| `.config/sway/config.d/10-appearance.conf` | цвета рамок и вкладок, отступы, правила окон, idle | +| `.config/sway/config.d/20-swayfx.conf`, `21-dms-effects.conf` | эффекты SwayFX: blur, тени, скругления, прозрачность; blur для слоёв DMS | +| `.config/sway/config.d/30-workflow.conf` | scratchpad-терминал, скриншоты, шпаргалка, режим производительности | +| `.config/sway/config.d/50-dms.conf` | запуск DMS, буфер обмена, медиаклавиши (громкость, яркость, плеер) | +| `.config/sway/screenshot.sh` | все режимы скриншотов (см. ниже) | +| `.config/sway/{lock,idle,cheatsheet,firstrun}.sh` | блокировка (DMS, запасной swaylock), swayidle, шпаргалка, первый запуск (обои и мониторы) | +| `.config/sway/outputs-setup.sh`, `doctor.sh` | раскладка мониторов под железо; проверка здоровья системы | +| `.config/dms/settings.json` | настройки DMS: тема, шрифты, виджеты бара (раскладка, VPN, температура, приватность), панель управления | +| `.config/kitty/kitty.conf` | JetBrains Mono, палитра Tokyo Night, прозрачность, вкладки (`Ctrl+Shift+←/→`) и сплиты (`Ctrl+Alt+стрелки`); `Ctrl+C` копирует выделенное (без выделения прерывает), `Ctrl+V` вставляет | +| `.config/swappy/config` | редактор скриншотов (стрелки, текст, размытие) | +| `.config/swaylock/` | запасная блокировка, если DMS не запущен | +| `home/` | только для `--with-shell`: `.zshrc`, `.tmux.conf`, алиасы (`ports`, `jce`, `dnfu`, `tm`) и автоподключение fzf / zoxide / eza | +| `wallpapers/` | обои (кладутся в `~/.local/share/backgrounds`, дальше обоями управляет DMS) | +| `examples/` | пример личных настроек | -```sh -git clone git@git.ibrash.duckdns.org:aibrash/sway-rising.git && cd sway-rising && ./install.sh --with-apps -``` - -Репозиторий клонируется по ssh, поэтому на новой машине сначала нужен ваш ключ (`~/.ssh/id_ed25519`) или ключ, добавленный на git-сервер. - -Скрипт спрашивает подтверждение перед каждым COPR и больше ни о чём не спрашивает. Без вопросов вообще: добавьте `--yes`. Без `--with-apps` ставится только сам райс и инструменты терминала. - -Что он делает: -1. Ставит пакеты через `dnf`: сессия sway (`sway-systemd`, порталы), kitty, nautilus, swaylock/swayidle, grim, swappy (аннотации скриншотов), шрифты JetBrains Mono и Font Awesome, тема `adw-gtk3`. -2. Подключает COPR `swayfx/swayfx` и `avengemedia/dms` и ставит SwayFX и DankMaterialShell. -3. Ставит CLI: zsh, tmux, fzf, zoxide, eza, bat, fd, ripgrep, ncdu, fastfetch, lazygit (бинарник с проверкой суммы), клонирует oh-my-zsh с плагинами. Опция `--with-tools` добавляет nmap, tcpdump, mtr, jq, btop, ansible. -4. С `--with-apps`: gimp, keepassxc, libreoffice, mpv, obs-studio, qbittorrent, shotcut, yt-dlp, godot, rclone, gparted, geary и ваши flatpak (Telegram, Chrome, Nextcloud, Remmina, DBeaver, Discord и другие). -5. **Делает бэкап** ваших конфигов в `~/rice-backup-<дата>` и копирует конфиги, обои (в `~/.local/share/backgrounds`), tmux и алиасы. Ваш `~/.zshrc` не трогает (его заменит только `--force-shell`). -6. Включает тему `adw-gtk3-dark` и проверяет конфиг (`sway -C`). - -После установки: выйти и выбрать на экране входа сессию **Sway**. При первом запуске `firstrun.sh` сам выберет обои в DMS и сгенерирует раскладку мониторов (ноутбук слева, внешние справа, масштаб подбирается по разрешению). Результат можно поправить: `~/.config/sway/outputs-setup.sh` (с вопросами) или файл `~/.config/sway/config.d/05-outputs.conf`. - -Тема DMS (цвета, шрифты, виджеты бара, прозрачность) хранится в `.config/dms/settings.json`: если вы меняете её в интерфейсе DMS, скопируйте файл обратно в репозиторий, чтобы изменения переехали на другие машины. - -**Что не переезжает** (личное или с отдельными репозиториями): -- `~/.ssh/config` и ключи, база KeePassXC, входы в Nextcloud, Telegram и браузеры; -- `docker-ce` и VS Code (ставятся из сторонних репозиториев), `tailscale`; -- город для виджета погоды в DMS, подключения NetworkManager и VPN; -- файл `05-outputs.conf` (свой на каждой машине). - -Проверка здоровья в любой момент: `./install.sh --check` (то же самое: `~/.config/sway/doctor.sh`). Показывает, что установлено, что работает, а что нет (DMS, порталы, шрифты, инструменты, раскладка мониторов, обои). - -Флаги: `--yes`, `--dry-run` (показать действия, ничего не менять), `--check`, `--no-packages`, `--no-dms`, `--no-shell`, `--with-tools`, `--with-apps`, `--force-shell`. Можно запускать повторно. - -DMS запускается из `config.d/50-dms.conf`, руками его запускать не нужно. Диагностика самого DMS: `dms doctor`. diff --git a/examples/99-personal.conf.example b/examples/99-personal.conf.example new file mode 100644 index 0000000..79d4cf0 --- /dev/null +++ b/examples/99-personal.conf.example @@ -0,0 +1,12 @@ +# Copy to ~/.config/sway/config.d/99-personal.conf. install.sh never touches 99-*.conf files. + +# Mouse / touchpad speed (-1 slowest .. 1 fastest) +input type:pointer { + pointer_accel -0.5 +} +input type:touchpad { + pointer_accel 0.3 +} + +# Autostart apps (xdg-autostart does not run under sway) +# exec sh -c 'sleep 5; command -v nextcloud >/dev/null && nextcloud --background' diff --git a/install.sh b/install.sh index 22c2cfb..5e90de1 100755 --- a/install.sh +++ b/install.sh @@ -1,17 +1,17 @@ #!/usr/bin/env bash -# sway-rising installer (Fedora): turns a fresh Fedora install into the full rice -# (SwayFX + DankMaterialShell, kitty, zsh/tmux, CLI tools, fonts, wallpapers, configs). +# sway-rising installer (Fedora): the "glass" look on SwayFX + DankMaterialShell, with kitty, +# fonts, wallpaper, hotkeys and screenshots. Your existing configs are backed up first. # # Usage: ./install.sh [options] # -y, --yes do not ask questions (non-interactive) # --dry-run print what would be done, change nothing # --check only run the health check and exit +# --restore [DIR] put your old configs back from a backup (default: the OLDEST ~/rice-backup-*, i.e. before the rice) +# --layouts L keyboard layouts, e.g. "us,de" (default: ask; "us,ru" with --yes) # --no-packages configs only, skip package installation # --no-dms do not install DankMaterialShell -# --no-shell skip zsh / oh-my-zsh / tmux / CLI tools -# --with-tools also install sysadmin tools (nmap, tcpdump, mtr, jq, ansible, btop) -# --with-apps also install the everyday apps (gimp, keepassxc, obs, ... and the flatpaks) -# --force-shell overwrite an existing ~/.zshrc (the old one is backed up) +# --with-shell also install zsh, oh-my-zsh, tmux and CLI tools (fzf, zoxide, eza, ...) with their configs +# --force-shell with --with-shell: replace an existing ~/.zshrc (the old one is backed up) # -h, --help set -euo pipefail @@ -20,22 +20,27 @@ CFG=${XDG_CONFIG_HOME:-$HOME/.config} WALLS=$HOME/.local/share/backgrounds STAMP=$(date +%F-%H%M%S) BACKUP=$HOME/rice-backup-$STAMP +n=1; while [ -e "$BACKUP" ]; do n=$((n+1)); BACKUP=$HOME/rice-backup-$STAMP-$n; done # never reuse a backup folder +MANAGED_DIRS=(sway swaylock kitty dms swappy) # configs this repo owns +PRESERVE=(sway/config.d/07-input.conf dms/settings.json) # meant to be edited by the user: installed only when missing +LEGACY_DIRS=(waybar rofi dunst swaync) # older versions of the rice; only backed up -YES=0; DRY=0; CHECK=0; PACKAGES=1; DMS=1; SHELLSETUP=1; TOOLS=0; APPS=0; FORCE_SHELL=0 -for a in "$@"; do - case $a in +YES=0; DRY=0; CHECK=0; RESTORE=0; RESTORE_DIR=""; PACKAGES=1; DMS=1; WITH_SHELL=0; FORCE_SHELL=0; LAYOUTS="" +while [ $# -gt 0 ]; do + case $1 in -y|--yes) YES=1 ;; --dry-run) DRY=1 ;; --check) CHECK=1 ;; + --restore) RESTORE=1; if [ $# -gt 1 ] && [ "${2#-}" = "$2" ]; then RESTORE_DIR=$2; shift; fi ;; + --layouts) [ $# -gt 1 ] || { echo "--layouts needs a value" >&2; exit 1; }; LAYOUTS=$2; shift ;; --no-packages) PACKAGES=0 ;; --no-dms) DMS=0 ;; - --no-shell) SHELLSETUP=0 ;; - --with-tools) TOOLS=1 ;; - --with-apps) APPS=1 ;; + --with-shell) WITH_SHELL=1 ;; --force-shell) FORCE_SHELL=1 ;; - -h|--help) sed -n '2,16p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; - *) echo "unknown option: $a (try --help)" >&2; exit 1 ;; + -h|--help) sed -n '2,15p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; + *) echo "unknown option: $1 (try --help)" >&2; exit 1 ;; esac + shift done say() { printf '\033[1;37m==>\033[0m %s\n' "$*"; } @@ -50,21 +55,12 @@ NOTES=() # follow-up hints for the user # ---------------------------------------------------------------- packages (Fedora names, all verified with dnf) CORE_PKGS=( sway-systemd dbus-tools # session target + env for portals - kitty swaylock swayidle grim swappy jq wl-clipboard brightnessctl libnotify - pavucontrol network-manager-applet nm-connection-editor wireplumber pipewire-pulseaudio - nautilus # file manager (Super+O) + kitty nautilus swaylock swayidle grim swappy jq wl-clipboard brightnessctl libnotify + network-manager-applet wireplumber pipewire-pulseaudio xdg-desktop-portal xdg-desktop-portal-wlr xdg-desktop-portal-gtk jetbrains-mono-fonts fontawesome-6-free-fonts adw-gtk3-theme ) SHELL_PKGS=(zsh tmux git curl fzf zoxide eza bat fd-find ripgrep ncdu fastfetch) -TOOLS_PKGS=(nmap tcpdump mtr jq btop ansible) -# --with-apps: everyday apps. docker-ce and VS Code come from third-party repos and are not installed here. -APP_PKGS=(geary gimp keepassxc libreoffice-writer libreoffice-calc libreoffice-impress mpv obs-studio - qbittorrent shotcut yt-dlp godot rclone gparted) -APP_FLATPAKS=(org.telegram.desktop com.google.Chrome com.nextcloud.desktopclient.nextcloud org.remmina.Remmina - com.github.tchx84.Flatseal io.dbeaver.DBeaverCommunity com.discordapp.Discord - com.moonlight_stream.Moonlight org.prismlauncher.PrismLauncher com.freerdp.FreeRDP - com.mattjakeman.ExtensionManager) check_fedora() { local ID="" ID_LIKE="" @@ -99,7 +95,7 @@ install_dms() { else warn "Skipping dms: no bar / control center / notifications will be started."; fi } -# lazygit is not in Fedora: official release binary, checksum verified +# lazygit is not in Fedora: official release binary, checksum verified (only with --with-shell) install_lazygit() { have lazygit && return 0 local arch; case $(uname -m) in x86_64) arch=x86_64 ;; aarch64) arch=arm64 ;; *) warn "lazygit: unsupported arch"; return 0 ;; esac @@ -118,16 +114,7 @@ install_lazygit() { rm -rf "$tmp" } -install_apps() { - say "Installing everyday apps (${#APP_PKGS[@]} rpm, ${#APP_FLATPAKS[@]} flatpak)" - dnf_install "${APP_PKGS[@]}" - if ! have flatpak; then dnf_install flatpak; fi - run sudo flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo || true - run sudo flatpak install -y --noninteractive flathub "${APP_FLATPAKS[@]}" || FAILED+=("some flatpaks") - NOTES+=("Not installed (third-party repos): docker-ce, VS Code, tailscale. Add their repos if you need them.") -} - -# ---------------------------------------------------------------- zsh / oh-my-zsh +# ---------------------------------------------------------------- zsh / oh-my-zsh (only with --with-shell) install_shell_extras() { local zsh_custom=$HOME/.oh-my-zsh/custom p if [ ! -d "$HOME/.oh-my-zsh" ]; then @@ -143,35 +130,55 @@ install_shell_extras() { } # ---------------------------------------------------------------- configs +choose_layouts() { + [ -n "$LAYOUTS" ] && return 0 + if [ "$YES" = 1 ] || [ ! -t 0 ] || [ "$DRY" = 1 ]; then return 0; fi # keep the shipped "us,ru" + read -r -p "Keyboard layouts, comma separated (first one must be Latin) [us,ru]: " LAYOUTS || LAYOUTS="" +} + +apply_layouts() { + [ -n "$LAYOUTS" ] && [ "$LAYOUTS" != "us,ru" ] || return 0 + if ! [[ $LAYOUTS =~ ^[a-z0-9_,()-]+$ ]]; then warn "Ignoring odd layout string '$LAYOUTS'"; return 0; fi + say "Keyboard layouts: $LAYOUTS" + if [ "$DRY" = 1 ]; then echo " [dry-run] set xkb_layout \"$LAYOUTS\" in config.d/07-input.conf"; return 0; fi + sed -i "s|xkb_layout \".*\"|xkb_layout \"$LAYOUTS\"|" "$CFG/sway/config.d/07-input.conf" +} + backup_and_copy_configs() { say "Backing up existing configs to $BACKUP" run mkdir -p "$BACKUP" local d - for d in sway swaylock kitty dms swappy waybar rofi dunst swaync; do # last four: legacy, only backed up + for d in "${MANAGED_DIRS[@]}" "${LEGACY_DIRS[@]}"; do if [ -e "$CFG/$d" ]; then run cp -a "$CFG/$d" "$BACKUP/"; fi done say "Copying configs to $CFG" run mkdir -p "$CFG" - # the machine-specific monitor layout ships only as 05-outputs.conf.example (see outputs-setup.sh) - if [ "$DRY" = 1 ]; then echo " [dry-run] cp -a $REPO/.config/. $CFG/"; else cp -a "$REPO/.config/." "$CFG/"; fi - run rm -f "$CFG/sway/config.d/40-bar.conf" # waybar is replaced by DMS; a stale file would start a second bar - run mkdir -p "$HOME/Pictures/Screenshots" + # files the user is meant to edit (keyboard, DMS theme) are installed only when missing; 99-*.conf are never in the repo + local kept=() f tmp + tmp=$(mktemp -d) + for f in "${PRESERVE[@]}"; do + if [ "$DRY" = 0 ] && [ -f "$CFG/$f" ]; then mkdir -p "$tmp/$(dirname "$f")"; cp -a "$CFG/$f" "$tmp/$f"; kept+=("$f"); fi + done + if [ "$DRY" = 1 ]; then echo " [dry-run] cp -a $REPO/.config/. $CFG/ (keeping existing: ${PRESERVE[*]})"; else cp -a "$REPO/.config/." "$CFG/"; fi + for f in "${kept[@]}"; do cp -a "$tmp/$f" "$CFG/$f"; NOTES+=("Kept your existing $f (not overwritten)"); done + rm -rf "$tmp" + run rm -f "$CFG/sway/config.d/40-bar.conf" # waybar is replaced by DMS; a stale file from an old version would start a second bar if [ "$DRY" = 0 ]; then chmod +x "$CFG"/sway/*.sh 2>/dev/null || true; fi + run mkdir -p "$HOME/Pictures/Screenshots" - if [ -d "$REPO/home" ]; then + if [ "$WITH_SHELL" = 1 ] && [ -d "$REPO/home" ]; then say "Copying shell/tmux files into $HOME (existing ones are backed up)" local f while IFS= read -r f; do if [ "$f" = ".zshrc" ] && [ -e "$HOME/.zshrc" ] && [ "$FORCE_SHELL" = 0 ]; then - NOTES+=("Your ~/.zshrc was kept. To use the rice's one: ./install.sh --force-shell (the old one is backed up)"); continue + NOTES+=("Your ~/.zshrc was kept. To use the rice's one: ./install.sh --with-shell --force-shell (the old one is backed up)"); continue fi if [ -e "$HOME/$f" ]; then run mkdir -p "$BACKUP/$(dirname "$f")"; run cp -a "$HOME/$f" "$BACKUP/$f"; fi run mkdir -p "$HOME/$(dirname "$f")" run cp -a "$REPO/home/$f" "$HOME/$f" done < <(cd "$REPO/home" && find . -type f | sed 's|^\./||') fi - install_wallpapers } @@ -184,7 +191,7 @@ install_wallpapers() { if [ "$DRY" = 1 ]; then echo " [dry-run] cp -n wallpapers/* $WALLS/"; else cp -n "$REPO"/wallpapers/* "$WALLS/"; fi } -# GTK theme: adw-gtk3 (DMS recolors it); only when the user has no choice of their own yet +# GTK theme: adw-gtk3 (DMS recolors it) apply_gtk_theme() { have gsettings || return 0 [ -d /usr/share/themes/adw-gtk3-dark ] || return 0 @@ -192,14 +199,13 @@ apply_gtk_theme() { run gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark' || true } - setup_outputs() { if [ -e "$CFG/sway/config.d/05-outputs.conf" ]; then say "Monitor layout already configured (05-outputs.conf)"; return 0; fi if [ -n "${SWAYSOCK:-}" ] && [ "$DRY" = 0 ]; then say "Generating the monitor layout" - if [ "$YES" = 1 ]; then "$CFG/sway/outputs-setup.sh" --auto || true; else "$CFG/sway/outputs-setup.sh" || true; fi + "$CFG/sway/outputs-setup.sh" --auto || true else - NOTES+=("Monitors: after logging into sway run ~/.config/sway/outputs-setup.sh (layout and scale for laptop + external screens)") + NOTES+=("Monitors: the first sway start generates the layout automatically; fine-tune with ~/.config/sway/outputs-setup.sh") fi } @@ -214,41 +220,71 @@ verify() { fi } +# ---------------------------------------------------------------- restore +restore_backup() { + local src=$RESTORE_DIR + # the oldest backup holds your configs from before the rice; newer ones hold earlier installs of the rice itself + [ -n "$src" ] || src=$(ls -d "$HOME"/rice-backup-* 2>/dev/null | sort | head -1 || true) + if [ -z "$src" ] || [ ! -d "$src" ]; then warn "No backup found (looked for $HOME/rice-backup-*)"; exit 1; fi + say "Restoring from $src" + ask "This replaces the rice configs in $CFG with the backed up ones. Continue?" || exit 0 + local e name d + for e in "$src"/* "$src"/.[!.]*; do + [ -e "$e" ] || continue + name=$(basename "$e") + case $name in + .*) run cp -a "$e" "$HOME/" ;; # shell/tmux files + *) run rm -rf "$CFG/$name"; run cp -a "$e" "$CFG/" ;; + esac + done + for d in "${MANAGED_DIRS[@]}"; do + [ -e "$src/$d" ] || NOTES+=("$d had no config before the install, so it was left as is: remove it with rm -rf $CFG/$d") + done + NOTES+=("Packages are not removed. To drop the rice: sudo dnf remove swayfx dms (then pick your old session at login)") +} + # ---------------------------------------------------------------- main if [ "$CHECK" = 1 ]; then exec "$REPO/.config/sway/doctor.sh"; fi if [ "$(id -u)" = 0 ]; then warn "Do not run as root; the script uses sudo where needed."; exit 1; fi +if [ "$RESTORE" = 1 ]; then + restore_backup + if [ ${#NOTES[@]} -gt 0 ]; then printf '\033[1mNext steps:\033[0m\n'; printf ' - %s\n' "${NOTES[@]}"; fi + exit 0 +fi + if check_fedora; then say "Fedora detected"; else warn "This installer is for Fedora. Packages are skipped, configs only."; PACKAGES=0 fi [ "$DRY" = 1 ] && say "DRY RUN: nothing will be changed" +choose_layouts if [ "$PACKAGES" = 1 ]; then say "Installing core packages (${#CORE_PKGS[@]})" dnf_install "${CORE_PKGS[@]}" install_swayfx if [ "$DMS" = 1 ]; then install_dms; fi - if [ "$SHELLSETUP" = 1 ]; then + if [ "$WITH_SHELL" = 1 ]; then say "Installing shell packages (${#SHELL_PKGS[@]})" dnf_install "${SHELL_PKGS[@]}" install_lazygit fi - if [ "$TOOLS" = 1 ]; then say "Installing sysadmin tools"; dnf_install "${TOOLS_PKGS[@]}"; fi - if [ "$APPS" = 1 ]; then install_apps; fi fi backup_and_copy_configs +apply_layouts if [ "$PACKAGES" = 1 ]; then apply_gtk_theme; fi -if [ "$SHELLSETUP" = 1 ]; then install_shell_extras; fi +if [ "$WITH_SHELL" = 1 ]; then install_shell_extras; fi setup_outputs verify echo -echo "Backup of your old configs: $BACKUP" +echo "Backup of your old configs: $BACKUP (undo with: ./install.sh --restore)" if [ ${#FAILED[@]} -gt 0 ]; then printf '\033[1;33mDid not work:\033[0m\n'; printf ' - %s\n' "${FAILED[@]}"; fi if [ ${#NOTES[@]} -gt 0 ]; then printf '\033[1mNext steps:\033[0m\n'; printf ' - %s\n' "${NOTES[@]}"; fi cat <