Compare commits

..
Author SHA1 Message Date
mathias2784 e499e63a49 screensaver text 2026-09-23 23:41:59 +02:00
mathias2784 df5abce062 merge main incl conflict resolution 2026-09-23 23:36:48 +02:00
mathias2784 aed6d46846 tte screensaver 2026-09-23 23:31:12 +02:00
mathias2784 30619b00ce hyprsaver 2026-09-23 23:05:54 +02:00
mathias2784 545485f3c5 Merge branch 'main' into hypr-caelestia 2026-09-23 21:52:27 +02:00
mathias2784 a8947283a5 .gitignore 2026-09-23 21:51:50 +02:00
mathias2784 496920cbdd refactor 2026-09-23 21:49:06 +02:00
mathias2784 519432d630 hypr: caelestia 2026-09-23 21:21:20 +02:00
mathias2784 15d77eeaca hypr: enrich noctalia config 2026-09-23 19:51:24 +02:00
mathias2784 23d0d1ecd3 hypr: shell commands in dedicated model 2026-09-23 19:32:37 +02:00
mathias2784 1d7ed473f6 hypr: refactor config to a more modular design 2026-09-23 19:04:52 +02:00
mathias2784 c055c5d592 tmux: turn off auto-restore at start 2026-09-23 07:07:54 +02:00
mathias2784 b7e396a1f0 a little less info in fastfetch 2026-09-23 07:05:42 +02:00
mathias2784 4be3a67dfe hypr: some sliding animations 2026-09-22 23:26:35 +02:00
mathias2784 a5eab1dda0 hypr setup: hello hyprmod & noctalia; goodbye hyprltm 2026-09-22 23:24:08 +02:00
mathias2784 4d9b3f99ac silence linter warnings in lua files 2026-09-22 23:00:29 +02:00
mathias2784 143f1ad86a use Noctalia instead of various components 2026-09-22 22:56:33 +02:00
mathias2784 466c79f1df use $HOME instead of /home/mathias 2026-09-22 22:00:25 +02:00
mathias2784 0bf7af3b03 re-introduce fastfetch 2026-09-21 22:56:30 +02:00
mathias2784 90a9390f37 consistent styling 2026-09-21 22:39:09 +02:00
mathias2784 c54c7a2b9d fix some test failures 2026-09-21 22:12:57 +02:00
mathias2784 0ca73bf029 tmux: fix styling 2026-09-21 21:42:09 +02:00
mathias2784 edeee7debd Neovim keybind for closing current bufferline tab 2026-09-21 21:33:00 +02:00
mathias2784 8f89aefe86 waypaper improvement 2026-09-21 21:26:59 +02:00
mathias2784 4d197d304e waypaper: minor fixes 2026-09-21 09:25:52 +02:00
mathias2784 c5c4ec6527 waypaper 2026-09-20 22:27:12 +02:00
mathias2784 ddaa51fb42 hypr: install wofi 2026-09-20 21:53:01 +02:00
mathias2784 cb3fb6db1e hyprland: show keybinds 2026-09-20 21:40:14 +02:00
mathias2784 431b491ed6 hyprland.lua: some cleaning up 2026-09-20 20:50:20 +02:00
mathias2784 a083e0d470 hypr setup cleanup 2026-09-20 19:37:36 +02:00
mathias2784 db4a524e25 hyprland monitor config 2026-09-20 19:30:53 +02:00
mathias2784 cc30fb84e1 test: ignore .stow-ignore and scripts/ in stow invocations
Both term/ and hypr/ have scripts/ subdirectories and .stow-ignore files
that should not be stowed. Adding --ignore flags to stow commands in
entrypoint-test.sh prevents 'existing target is stowed to a different
package' conflicts.

Also remove @aur section from hypr/scripts/packages.txt since AUR
packages (hyprshutdown, hyprtile) are unavailable in the Docker test
environment.

All 93 smoke tests pass.
2026-09-20 18:47:21 +02:00
mathias2784 384cd84a6e hypr overhaul 2026-09-20 14:40:45 +02:00
mathias2784 85fc7f0e4a .gitignore: some opencode auto-generated files 2026-09-20 14:09:57 +02:00
mathias2784 66e7c7ef3b fix test 2026-09-20 13:44:09 +02:00
mathias2784 8c65841361 update 2026-09-20 10:35:29 +02:00
mathias2784 c5eba35273 packages 2026-09-20 10:19:53 +02:00
mathias2784 0141396bd9 basic packages 2026-09-20 10:01:45 +02:00
mathias2784 a6b9ddf216 basic 2026-09-20 09:43:17 +02:00
mathias2784 d4744a1f2d luafy archop monitor setup 2026-09-20 09:30:50 +02:00
Mathias Schneider 3517bad26c opencode: more LSP servers 2026-09-17 11:24:36 +02:00
Mathias Schneider cc3ddf7920 Adapt to new version of Opencode 2026-09-17 11:22:37 +02:00
Mathias Schneider c80c228239 Merge remote-tracking branch 'refs/remotes/origin/main' 2026-09-14 08:52:35 +02:00
Mathias Schneider e250a740c6 tmux: no auto-recover of panes on startup 2026-09-14 08:52:19 +02:00
mathias2784 32de2a0751 opencode: add some models 2026-09-12 23:06:22 +02:00
mathias2784 dcc5d7ff2a ruff exclude rules 2026-09-11 08:55:24 +02:00
Mathias Schneider fbf1442dbe better code actions 2026-09-10 13:36:39 +02:00
mathias2784 0e2d4030bd no caching in test containers 2026-09-05 21:55:29 +02:00
mathias2784 055d8a9620 fix some test findings 2026-09-05 21:40:41 +02:00
mathias2784 84db84b542 basic and utils: overhaul set-up 2026-09-05 21:30:54 +02:00
mathias2784 aaecbd8472 test suite with docker container and linter 2026-09-05 20:57:59 +02:00
mathias2784 d32a30f39e readme 2026-09-05 12:59:50 +02:00
mathias2784 4e31a23470 term: rework of setup script 2026-09-05 12:59:33 +02:00
mathias2784 7c8d0eff4b term: some cleaning up 2026-09-05 12:40:47 +02:00
mathias2784 a9e1b686d0 hyprland tweaks 2026-09-05 10:22:03 +02:00
mathias2784 a050d87439 rust linting 2026-09-02 16:29:47 +02:00
Mathias Schneider 694a305855 persisting tmux sessions 2026-09-02 12:19:57 +02:00
Mathias Schneider 6ceb170b89 tmux usage functionality tweaks 2026-09-02 11:57:04 +02:00
mathias2784 0db4be6796 merge main incl. conflict resolution 2026-08-31 09:15:05 +02:00
mathias2784 dbbf5a32fc opencode model list housekeeping 2026-08-31 09:11:53 +02:00
Mathias Schneider bce43be0d7 opencode: some config tweaks/updates 2026-08-26 17:56:49 +02:00
mathias2784 71e9db5c4c opencode: local ip-address for LM Studio 2026-08-21 15:55:08 +02:00
mathias2784 a504681e32 fix hyprland config 2026-08-21 14:28:30 +02:00
mathias2784 437eda2852 hyprland: convert config to lua 2026-08-21 14:14:50 +02:00
103 changed files with 3708 additions and 1743 deletions
+9
View File
@@ -0,0 +1,9 @@
# Keep image builds light: the runtime mounts the live repo via -v.
# NOTE: do NOT exclude test/ - the dev stage COPYs the repo and then runs
# test/lint.sh from it.
.git
**/node_modules
**/lazy-lock.json
**/fish_variables
kreation/.vst3
term/.config/tmux/plugins
+9 -1
View File
@@ -1,7 +1,15 @@
hypr/.config/hypr/env
hypr/.config/hypr/env.conf
hypr/.config/hypr/env.sh
hypr/.config/wpaperd/wallpapers/linked
hypr/.config/hypr/monitor_setup.lua
# Noctalia template output (shell-owned, regenerated on palette change)
hypr/.config/hypr/noctalia.lua
hypr/.config/kitty/themes/noctalia.conf
# Caelestia runtime output (shell-owned, regenerated on scheme change)
hypr/.config/hypr/scheme/
*~lock.*#
lazy-lock.json
fish_variables
term/.config/opencode/cli.json
term/.config/opencode/service.json
hypr/.config/hypr/scheme/current.lua
+2 -1
View File
@@ -1,5 +1,6 @@
{
"diagnostics.globals": [
"vim"
"vim",
"hl"
]
}
+4 -4
View File
@@ -7,15 +7,15 @@ Only entries that would be missed without explicit help are included.
## 1. Project Scope
- **Dotfiles** for a personal workstation (hyprland + Neovim + VST plugin).
- No tests, CI or build scripts – the repo is purely configuration data.
- The only executable content is the `install_*` shell scripts that install system packages.
- No CI or build scripts – the repo is purely configuration data; the only executable content is the `install_*` scripts and the `test/` harness.
- **Testing** lives in `test/`. `make test` runs the offline lint plus the Docker smoke with the real pacman install (`REAL_SMOKE=1`); `make test-lint` / `make test-stow` are the fast offline subset, and `make test-smoke REAL_SMOKE=0` runs dry probes only (see `test/Dockerfile` and `README.md → Testing`).
---
## 2. System Setup
| Task | Command | Why it matters |
|------|---------|----------------|
| **Install required programs** | `bash .install_skripte/install_terminal_pcks.sh` <br>`bash .install_skripte/install_basic_pcks.sh` <br>`bash .install_skripte/install_hypr_pcks.sh` <br>`bash .install_skripte/install_kreation_pcks.sh` | These scripts install Neovim, hyprland, VST runtime, and other utilities. |
| **Install required programs** | `bash setup/term/setup.sh` <br>`bash setup/basic/setup.sh` <br>`bash setup/hypr/setup.sh` <br>`bash setup/kreation/setup.sh` | These scripts install Neovim, hyprland, VST runtime, and other utilities. Edit `setup/term/packages.txt` to add/remove terminal packages. |
| **Link configuration directories** | `ln -s ~/.dotfiles/hypr/.config/hypr ~/.config/hypr` <br>`ln -s ~/.dotfiles/term/.config/nvim ~/.config/nvim` | The repository expects the configs to live in `~/.config`. |
| **Add VST plugin** | Copy `kreation/.vst3/MT-PowerDrumKit.vst3` into your DAW’s plugins folder (usually `~/.vst`). | The repo contains a pre‑built VST for use in audio software. |
@@ -26,7 +26,7 @@ Only entries that would be missed without explicit help are included.
| Item | Detail |
|------|--------|
| **Wayland compositor** | Requires `hyprland` (and dependencies like `wlroots`). The script `install_hypr_pcks.sh` installs it. |
| **Wayland compositor** | Requires `hyprland` (and dependencies like `wlroots`). The script `setup/hypr/setup.sh` installs it from `setup/hypr/packages.txt`. |
| **MIME defaults** | Run `bash hypr/.config/hypr/scripts/ensure-env.sh` after installing to set environment variables (`$XDG_DATA_HOME`, etc.). |
| **Dolphin file associations** | `bash hypr/.config/hypr/scripts/fix_dolphin_file_associations.sh` must be executed once to register the compositor with KDE. |
| **Portal host override** | `bash hypr/.config/hypr/scripts/portal-host-override.sh` fixes Wayland portal issues on some distros. |
+71 -15
View File
@@ -1,21 +1,77 @@
# setup ist ein Kommando-Target (keine Datei) und soll immer ausgeführt werden.
.PHONY: basic
# Alle Targets sind Kommando-Targets (keine Dateien) und werden immer ausgeführt.
.PHONY: basic term utils hypr kreation buntes-monster
termn:
bash _install_skripte_install_terminal_pcks.sh
# basic wird immer zuerst eingerichtet: es legt die Basis-Systemumgebung an
# (multilib, yay, Display-Manager, Audio-Stack, Docker), von der alle anderen
# Zweige abhaengen. Die uebrigen Ziele haengen nur von basic ab und sind
# untereinander unabhaengig.
basic:
bash setup/basic/setup.sh
stow basic
term: basic
bash setup/term/setup.sh
stow term
basic: term
bash _install_skripte_install_basic_pcks.sh
stow nvim
bash _install_skripte/nextcloud.sh
utils: basic
bash setup/utils/setup.sh
bash setup/nextcloud.sh
hypr: basic
bash _install_skripte_install_hypr_pcks.sh
bash setup/hypr/setup.sh
stow hypr
bash hypr/.config/hypr/scripts/ensure-env.sh
bash hypr/.config/hypr/scripts/portal-host-override.sh
bash hypr/.config/hypr/scripts/fix_dolphin_file_associations.sh
kreation: basic
bash _install_skripte_install_kreation_pcks.sh
bash setup/kreation/setup.sh
stow kreation
bunters-monster: basic hypr kreation
_install_skripte/buntes-monster-links.sh
buntes-monster: hypr kreation
bash setup/buntes-monster-links.sh
# ---------------------------------------------------------------------------
# Testing (see README.md "Testing" and test/ for details)
# ---------------------------------------------------------------------------
.PHONY: test test-lint test-smoke test-stow test-shellcheck test-lint-docker
# Full test suite: offline lint first, then the Docker smoke (which by
# default runs the real install + verification; see test-smoke below).
test: test-lint test-smoke
# Fast, offline integrity checks. No Docker required.
# shellcheck is used if installed, otherwise only syntax checks run.
test-lint:
bash test/lint.sh
# Check stow package resolution without creating symlinks.
test-stow:
bash test/probe_stow.sh
# Run shellcheck over all tracked repo scripts (needs shellcheck installed).
test-shellcheck:
shellcheck -S warning $$(git ls-files '*.sh' | grep -v '/tpm/')
# Test shellcheck: build the /dev stage with shellcheck and run lint.sh.
# docker build context is the repo root; .dockerignore excludes heavy dirs.
test-lint-docker:
docker build --target dev -t dotfiles-lint -f test/Dockerfile .
docker run --rm dotfiles-lint
# Docker smoke test: builds the Arch container and runs the dry probes.
# By default (REAL_SMOKE=1) it also installs the real term pacman + npm
# packages inside the container (AUR stays opt-in) and verifies them, so a
# plain `make test` actually exercises the install path. Set REAL_SMOKE=0
# (or RUN_SMOKE=0) for the fast dry-probe run. RUN_FULL=1 additionally
# attempts AUR + hypr/kreation/buntes-monster. SKIP_NET=1 skips anything
# that contacts the network.
# Example: make test-smoke # real term pacman+npm install + verify
# make test-smoke REAL_SMOKE=0 # dry probes only
# make test-smoke RUN_FULL=1 # full AUR + hypr/kreation
REAL_SMOKE ?= 1
test-smoke:
docker build --target test -t dotfiles-test -f test/Dockerfile .
docker run --rm \
-e RUN_SMOKE="$${RUN_SMOKE:-$(REAL_SMOKE)}" \
-e RUN_FULL="$${RUN_FULL:-0}" \
-e SKIP_NET=$${SKIP_NET:-0} \
-v "$$PWD":/dotfiles \
dotfiles-test
+179
View File
@@ -0,0 +1,179 @@
# Dotfiles
Personal configuration files for an Arch Linux workstation (Hyprland + Neovim + VST plugin), managed with [GNU Stow](https://www.gnu.org/software/stow/).
## Layout
| Directory | Contents |
|-----------|----------|
| `basic/` | Base system packages + the **central theme** (`basic/.config/themes` → `~/.config/themes`: Catppuccin Mocha palette, `current` symlink, `switch-theme.sh`/`sync-theme.sh`). All other packages reference it instead of copying colors. |
| `term/` | Fish + kitty + starship + nvim + tmux + yazi + fastfetch + opencode terminal environment |
| `hypr/` | Hyprland compositor config + Noctalia shell config (Catppuccin Mocha) |
| `kreation/`| VST plugin (`MT-PowerDrumKit.vst3`) |
| `local_ai/`| Local AI / MCP tooling config |
| `setup/` | Install/setup scripts + package lists (one subdir per target, shared helpers in `setup/lib/`; not stowed) |
| `test/` | Docker test harness (lint + smoke tests) |
Each top-level directory is a **stow package**. `stow` symlinks the files from the repository into your home directory (e.g. `term/.config/...` → `~/.config/...`).
## Prerequisites
- Arch Linux (or a distro with `pacman`)
- [`stow`](https://www.gnu.org/software/stow/)
- Relies on `git`, `sudo`, `curl`
## Quick start
```bash
# 1. Clone the repo
git clone https://github.com/<user>/dotfiles.git ~/.dotfiles
cd ~/.dotfiles
# 2. Install a target and symlink its files
make term # terminal + fish + kitty + nvim
make hypr # Hyprland (also pulls in basic + term)
make kreation # VST plugin (also pulls in basic)
```
Run `make <target>` from the repository root. Each target first runs the relevant install script and then `stow`s the package.
> The install scripts require `sudo` and may prompt for your password.
## Targets
| Target | What it does |
|--------|--------------|
| `make term` | Runs `setup/term/setup.sh` (installs terminal packages, sets fish as default shell, clones tmuxifier), then `stow term`. Pulls in `basic`. |
| `make basic` | Runs `setup/basic/setup.sh`: enables multilib, updates the system, installs `yay` if missing, installs the `setup/basic/packages.txt` packages, and sets up Docker (enables/starts the service, adds your user to the `docker` group, verifies the service) |
| `make hypr` | `make basic`, installs Hyprland packages, stows `hypr`, runs the Hyprland setup scripts (`ensure-env.sh`, `portal-host-override.sh`, `fix_dolphin_file_associations.sh`) |
| `make kreation` | `make basic`, installs VST runtime, stows `kreation` |
| `make buntes-monster` | Everything (`basic` + `hypr` + `kreation`), then wires up symlinks |
### Managing terminal packages
The terminal package list lives in a single editable file:
```
setup/term/packages.txt
```
Add/remove packages on separate lines. Lines starting with `#` are ignored, and you can switch between package sources with section markers:
```
@pacman # install via pacman (default)
@aur # install via yay (AUR)
@npm # install via npm -g
```
The default section is `@pacman`. The AUR helper `yay` is bootstrapped automatically by `setup/basic/setup.sh`.
## What the install scripts do
- **`setup/basic/setup.sh`** – enables multilib, updates the system (`pacman -Syu`), ensures `yay` is installed, reads `setup/basic/packages.txt` and installs all packages with `--needed` (skips already-installed ones), and sets up Docker (`sudo systemctl enable --now docker`, adds the current user to the `docker` group, checks the service). Idempotent and safe to re-run.
- **`setup/term/setup.sh`** – reads `setup/term/packages.txt` and installs all packages (pacman/AUR via `yay --needed`, npm via `sudo npm install -g`), sets `fish` as the default shell (`chsh`), clones `tmuxifier`, adds the `git` yazi plugin (skips if already present), and runs `sudo updatedb`. Idempotent and safe to re-run.
## Stow: resolving conflicts with existing paths
`stow` refuses to create a symlink where a real file or directory already exists on the target (your home directory). When you first set up a machine that already has configs in `~/.config`, you typically see an error like:
```
WARNING: stowing term would cause conflicts:
* existing target is neither a link nor a directory: .config/fish/config.fish
```
The **recommended** workflow is to back up the affected paths and remove them from the target location so stow can take over, then restore anything you want to keep as an overlay on top of the symlink. There are a few common approaches:
### 1. Back up and remove (recommended for first-time setup)
Point stow elsewhere so it only *reports* conflicts without touching anything, then handle the listed paths yourself:
```bash
# Dry-run to see exactly which paths conflict
cd ~/.dotfiles
stow --verbose --simulate term
# Inspect the conflicts, then back them up on the target side
mkdir -p ~/.config-backup
mv ~/.config/fish ~/.config-backup/fish # example — repeat for each conflicting path
# Now stow can create the links
stow term
```
Afterwards you can restore your old configs **on top of** the symlinks if you want a custom overlay:
```bash
cp -r ~/.config-backup/fish/* ~/.config/fish/
```
> The backup dir lives outside the stow packages, so stow never touches it.
### 2. Use `--adopt` with care
```bash
git stash # only if you have uncommitted repo changes you want to keep
cd ~/.dotfiles
stow --adopt term
git checkout . # discard any files that stow pulled into the repo
```
`stow --adopt` moves conflicting files *from your home dir into the repository* (overwriting what's stored there), then creates the symlink. This is convenient but **destructive to the repo copy** of those files — always review with a simulate run first and reset via git afterwards if you didn't intend to change the tracked config. Prefer approach #1 unless you deliberately want to recapture your live config into the repo.
### 3. Skip conflicts you don't manage in the repo
If a path simply shouldn't be managed by stow, use `--ignore`:
```bash
stow --ignore='\.config/(local|misc)' term
```
---
## Testing
The `test/` directory contains a Docker-based test harness that verifies the
install scripts, the `Makefile`, and the stow packages.
There are **two tiers**:
| Target | What it does | Docker required? |
|--------|--------------|------------------|
| `make test-lint` | Fast, offline integrity checks: `bash -n` syntax pass over every script, `shellcheck` (if installed), `packages.txt` marker validation, and Makefile ↔ script/stow-package name consistency. Catches typos like `setup/basic/setuo.sh` (missing `/`). | No |
| `make test-stow` | `stow --simulate` for every stow-able package; fails if a package the Makefile stows doesn't exist (e.g. `stow nvim` — nvim lives under `term/`). | No |
| `make test-shellcheck` | Runs shellcheck over all tracked scripts (shellcheck must be installed). | No |
| `make test-lint-docker` | Builds the `/dev` stage (`archlinux:latest` + shellcheck) and runs `test/lint.sh` inside it. | Yes |
| `make test-smoke` | Builds the `/test` stage, runs the container's dry probes (`make -n` over every target, `stow --simulate` over every Makefile-stowed package, `test/lint.sh`), **and by default installs the real term pacman + npm packages** (`REAL_SMOKE=1`) then verifies them. Every `@pacman` entry is also pre-resolved against the repo DB, and the install is re-run to prove idempotency. | Yes |
| `make test` | `test-lint` + `test-smoke` (the real install runs). | Partially |
### Docker smoke details
```bash
make test-smoke # real pacman + npm install of the term packages + verify
make test-smoke REAL_SMOKE=0 # dry probes only (fast, no installs)
make test-smoke RUN_SMOKE=1 RUN_FULL=1 # + AUR + hypr/kreation/buntes-monster
make test-smoke SKIP_NET=1 # skip anything that contacts the network
```
The container:
- uses `archlinux:latest` (the scripts assume Arch + pacman),
- creates a non-root user (`mathias`, uid 1000) with passwordless sudo so the
scripts don't hang on a password prompt,
- mounts the live repo at `/dotfiles` (`-v "$PWD":/dotfiles`), so the tests
always run against your current checkout,
- stubs host-dependent commands as no-ops so nothing talks to a real systemd/dbus
inside the container (`systemctl`, `updatedb`, `kbuildsycoca6`,
`dbus-update-activation-environment`, `chsh`), and routes `yay` through
`pacman` for the AUR-free smoke.
In the `REAL_SMOKE=1` (default) install path, the harness additionally
**verifies the installed packages** (`test/verify_packages.sh`):
- every `@pacman` entry is confirmed via `pacman -Q <pkg>` (covers fonts,
libs and python modules that ship no binary),
- a curated mapping probes each package's binary with a real
`--version`-style call (e.g. `fish --version`, `nvim --version`,
`ssh -V`), failing if the binary is missing or does not report a version.
---
**When in doubt:** run `stow --verbose --simulate <target>` first — it prints what would happen (linking) without changing anything. Never `rm -rf` the `~/.config` of something you still want to keep; move it to a backup directory instead.
-41
View File
@@ -1,41 +0,0 @@
#!/bin/bash
sudo pacman -S --needed \
firefox \
nextcloud-client \
cups \
wine \
wine-mono \
wine-gecko \
winetricks \
thunderbird \
ktouch \
ktorrent \
pipewire \
pipewire-session-manager \
qpwgraph \
cifs-utils \
rbw \
sddm
yay -S \
catppuccin-sddm-theme-mocha
echo "
[General]
Numlock=on
[Theme]
ThemeDir=/usr/share/sddm/themes # Standardverzeichnis für Designvorlagen
Current=catppuccin-mocha-blue # Standardthema
CursorTheme=breeze_cursors # Mausthema
FacesDir=/usr/share/sddm/faces # Verzeichnis für Avatarbilder
[Users]
MaximumUID=1100
HideUsers=mathieu
" | sudo tee /etc/sddm.conf
sudo systemctl disable gdm
sudo systemctl enable sddm
-27
View File
@@ -1,27 +0,0 @@
#!/bin/bash
sudo pacman -S --needed \
hyprland \
hyprlauncher \
xdg-desktop-portal-hyprland \
hyprpolkitagent \
pantheon-shortcut-overlay \
waybar \
hyprpaper \
wpaperd \
wev \
hyprlock \
hypridle \
nwg-drawer \
wl-clipboard \
swaync \
hyprshot \
rofi
yay -S --needed \
hyprshutdown \
hyprtile
# Install hyprltm (network manager)
curl -s https://raw.githubusercontent.com/hyprltm/hyprltm-net/main/setup.sh | bash
echo 'fish_add_path -m $HOME/.local/bin' >> ~/.config/fish/config.fish
-16
View File
@@ -1,16 +0,0 @@
#!/bin/bash
sudo pacman -S --needed \
reaper \
guitarix \
kdenlive \
yabridge \
yabridgectl \
obs-studio \
surge-xt \
lsp-plugins \
calf \
dragonfly-reverb
yay -S --needed \
numaplayer
-73
View File
@@ -1,73 +0,0 @@
#!/bin/bash
# multilib aktivieren in /etc/pacman.conf
sudo sed -i.bak '/^#\[multilib\]/,+1 s/^#//' /etc/pacman.conf
# Für Noobs wie mich
# - erstellt Sicherheitskopie pacman.conf.bak vor der Änderung
# - sucht nach "[multilib]"
# - bezieht die nächste Zeile mit ein
# - Ersetzt ^# mit nüscht -> Kommentar entfernt :-)
sudo pacman -Syu
# Install yay
if pacman -Q yay &>/dev/null; then
echo "yay bereits installiert; fahre fort."
elif pacman -Si yay &>/dev/null; then
echo "Installiere yay mit pacman ..."
sudo pacman -S --needed yay
else
sudo pacman -S --needed base-devel git
echo "installiere yay via git ..."
git clone https://aur.archlinux.org/yay.git
(
cd yay || {
echo "Fehler: CD in yay-Verzeichnis fehlgeschlagen";
exit 1;
}
makepkg -si
)
rm -rf yay
fi
sudo pacman -S --needed \
fish \
vim \
nvim \
openssh \
rclone \
rsync \
unison \
stow \
nodejs \
npm \
starship \
fastfetch \
tree-sitter-cli \
python \
python-pip \
extra/ttf-jetbrains-mono-nerd \
unzip \
ruff \
python-ruff \
python-debugpy \
chromium \
selene \
opencode \
tmux \
yazi \
zoxide \
fzf \
locate \
ttf-jetbrains-mono-nerd \
ttf-font-awesome
# fish as standard terminal
chsh -s /usr/bin/fish
git clone https://github.com/jimeh/tmuxifier.git ~/.tmuxifier
npm install -g vscode-js-debug
npm install -g eslint_d
ya pkg add yazi-rs/plugins:git
sudo updatedb
+1
View File
@@ -0,0 +1 @@
themes/catppuccin-mocha
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
# Scaffold a new theme directory (basic/.config/themes/scripts/new-theme.sh).
#
# Usage: new-theme.sh <theme-id> e.g. new-theme.sh rose-pine-moon
#
# Copies themes/catppuccin-mocha as a template. Afterwards:
# 1. Replace every palette value in the new directory.
# 2. Add one row to themes/registry.conf.
# 3. Run scripts/switch-theme.sh <theme-id> to try it.
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." && pwd)"
THEMES_DIR="$REPO_ROOT/basic/.config/themes/themes"
[[ $# -eq 1 ]] || { echo "usage: $(basename "$0") <theme-id>" >&2; exit 1; }
theme_id="$1"
if [[ ! "$theme_id" =~ ^[a-z0-9][a-z0-9-]*$ ]]; then
echo "error: invalid theme-id '$theme_id'" >&2
exit 1
fi
[[ -e "$THEMES_DIR/$theme_id" ]] && { echo "error: $theme_id already exists" >&2; exit 1; }
cp -r "$THEMES_DIR/catppuccin-mocha" "$THEMES_DIR/$theme_id"
echo "scaffolded $THEMES_DIR/$theme_id"
echo "next: replace the palette values, add a registry.conf row, run switch-theme.sh $theme_id"
+59
View File
@@ -0,0 +1,59 @@
#!/bin/bash
# Central theme switcher (basic/.config/themes/scripts/switch-theme.sh).
#
# Usage: switch-theme.sh <theme-id> e.g. switch-theme.sh catppuccin-mocha
#
# Retargets the tracked `current` symlink to themes/<theme-id> and reloads
# every consumer that can be reloaded. Because `current` lives in the repo,
# the switch is a reviewable git change; re-stowing is not required since
# all consumers resolve through ~/.config/themes/current at runtime.
#
# A future non-Catppuccin theme only needs its own themes/<theme-id>/
# directory plus a row in themes/registry.conf — this script stays untouched.
set -euo pipefail
usage() {
echo "usage: $(basename "$0") <theme-id>" >&2
echo "available:" >&2
ls -1 "$(repo_root)/basic/.config/themes/themes" 2>/dev/null | grep -v '^registry.conf$' | sed 's/^/ /' >&2 || true
}
repo_root() {
local src="$0"
if command -v readlink >/dev/null 2>&1; then
src="$(readlink -f "$0")"
fi
cd "$(dirname "$src")/../../../.." && pwd
}
main() {
[[ $# -eq 1 ]] || { usage; exit 1; }
local theme_id="$1"
if [[ ! "$theme_id" =~ ^[a-z0-9][a-z0-9-]*$ ]]; then
echo "error: invalid theme-id '$theme_id'" >&2
exit 1
fi
local root
root="$(repo_root)"
local dest="$root/basic/.config/themes/themes/$theme_id"
local link="$root/basic/.config/themes/current"
[[ -d "$dest" ]] || { echo "error: unknown theme '$theme_id' (no $dest)" >&2; usage; exit 1; }
ln -sfn "themes/$theme_id" "$link"
echo "theme switched: current -> themes/$theme_id"
# Best-effort live reloads; every step is guarded so the switch
# succeeds even on machines without a running compositor.
if command -v hyprctl >/dev/null 2>&1; then
hyprctl reload >/dev/null 2>&1 || true
fi
if command -v tmux >/dev/null 2>&1 && [[ -n "${TMUX:-}" ]]; then
tmux source-file "$HOME/.config/tmux/tmux.conf" >/dev/null 2>&1 || true
fi
echo "note: restart Neovim (or :colorscheme \$THEME_NVIM_COLORSCHEME) and open a new shell to pick up theme.env.sh."
}
main "$@"
+83
View File
@@ -0,0 +1,83 @@
#!/bin/bash
# Central theme drift guard (basic/.config/themes/scripts/sync-theme.sh).
#
# Fails if hardcoded theme hex values appear anywhere in the repo outside:
# - basic/.config/themes (the single source of truth)
# - term/.config/tmux/plugins/ (vendored upstream, stow-ignored)
# - term/.config/yazi/theme.toml (declared mirror: yazi has no include)
# - term/.config/starship.toml (declared mirror: starship has no include)
# - hypr/.config/hypr/noctalia.lua + hypr/.config/kitty/themes/noctalia.conf
# (Noctalia template output: shell-owned, gitignored, regenerated from
# the active palette on every theme change)
# - test/ + docs (may quote values in prose)
#
# Run with: bash basic/.config/themes/scripts/sync-theme.sh
# test/lint.sh invokes it as part of `make test-lint`.
set -uo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." && pwd)"
cd "$REPO_ROOT" || exit 1
# Sentinel hex values of the active palette (case-insensitive).
SENTINELS='74c7ec|1e1e2e|cdd6f4|45475a|b4befe|f38ba8|a6e3a1|f9e2af|181825|11111b|89b4fa|f5e0dc'
matches="$(grep -rniE --include='*.conf' --include='*.css' --include='*.rasi' \
--include='*.lua' --include='*.toml' --include='*.fish' --include='*.sh' \
--exclude-dir='.git' --exclude-dir='plugins' --exclude-dir='test' \
-E "$SENTINELS" . 2>/dev/null | grep -vE '^./basic/.config/themes' \
| grep -vE 'term/.config/(yazi/theme.toml|starship.toml)' \
| grep -vE 'hypr/.config/(hypr/noctalia.lua|kitty/themes/noctalia.conf)' || true)"
if [[ -n "$matches" ]]; then
echo "FAIL: hardcoded theme colors outside basic/.config/themes (and declared mirrors):"
printf '%s\n' "$matches" | sed 's/^/ /'
echo "Move the values into basic/.config/themes and reference them instead."
exit 1
fi
echo "ok: no hardcoded theme colors outside the central theme"
# ---------------------------------------------------------------------------
# Role/palette consistency: every role in theme.css must equal its palette
# twin (roles are literal hex because some parsers drop @-references).
# ---------------------------------------------------------------------------
python3 - <<'EOF'
import re, sys
css_path = "basic/.config/themes/themes/catppuccin-mocha/theme.css"
defines = dict(re.findall(r"@define-color\s+([a-z0-9_]+)\s+(#[0-9a-fA-F]+)", open(css_path).read()))
# role -> palette twin (bg_translucent intentionally excluded: crust + alpha).
pairs = {
"bg": "base", "bg_dim": "mantle", "bg_deep": "crust",
"fg": "text", "fg_dim": "subtext0", "fg_muted": "overlay1",
"surface": "surface0", "border": "surface1",
"accent": "sapphire", "accent2": "lavender",
"ok": "green", "warn": "yellow", "urgent": "red",
}
missing = [k for k in list(pairs) + list(pairs.values()) if k not in defines]
if missing:
print(f"FAIL: theme.css missing defines: {sorted(missing)}")
sys.exit(1)
bad = [r for r, p in pairs.items() if defines[r].lower() != defines[p].lower()]
if bad:
print(f"FAIL: roles out of sync with palette in {css_path}: {bad}")
sys.exit(1)
trans = defines.get("bg_translucent_raw", "")
m = re.fullmatch(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([0-9.]+)\s*\)", trans)
if not m:
# defines[] regex only captures #hex; re-read raw value (may be rgba()).
raw = re.search(r"@define-color\s+bg_translucent\s+([^;]+);", open(css_path).read())
trans = raw.group(1).strip() if raw else ""
m = re.fullmatch(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([0-9.]+)\s*\)", trans)
crust_rgb = tuple(int(defines["crust"][i:i+2], 16) for i in (1, 3, 5))
if not m or tuple(map(int, m.groups()[:3])) != crust_rgb or not (0 < float(m.group(4)) < 1):
print(f"FAIL: bg_translucent must be rgba(crust, alpha<1) in {css_path}")
sys.exit(1)
print("ok: theme.css roles match palette")
EOF
@@ -1,3 +1,8 @@
# Central theme: catppuccin-mocha (Catppuccin Mocha), hyprland $vars.
# Part of basic/.config/themes. Managed file: refresh via
# setup/fetch-ports.sh
# (upstream: catppuccin/hyprland generated mocha.conf).
# Hyprland consumers load it via: source = ~/.config/themes/current/hypr.conf
$rosewater = rgb(f5e0dc)
$rosewaterAlpha = f5e0dc
@@ -0,0 +1,88 @@
# Central theme: catppuccin-mocha (Catppuccin Mocha), kitty colors.
# Part of basic/.config/themes. Managed file: refresh via
# setup/fetch-ports.sh
# (upstream: catppuccin/kitty themes/mocha.conf).
# vim:ft=kitty
## name: Catppuccin Kitty Mocha
## author: Catppuccin Org
## license: MIT
## upstream: https://github.com/catppuccin/kitty/blob/main/themes/mocha.conf
## blurb: Soothing pastel theme for the high-spirited!
# The basic colors
foreground #cdd6f4
background #1e1e2e
selection_foreground #1e1e2e
selection_background #f5e0dc
# Cursor colors
cursor #f5e0dc
cursor_text_color #1e1e2e
# Scrollbar colors
scrollbar_handle_color #9399b2
scrollbar_track_color #45475a
# URL color when hovering with mouse
url_color #f5e0dc
# Kitty window border colors
active_border_color #b4befe
inactive_border_color #6c7086
bell_border_color #f9e2af
# OS Window titlebar colors
wayland_titlebar_color system
macos_titlebar_color system
# Tab bar colors
active_tab_foreground #11111b
active_tab_background #cba6f7
inactive_tab_foreground #cdd6f4
inactive_tab_background #181825
tab_bar_background #11111b
# Colors for marks (marked text in the terminal)
mark1_foreground #1e1e2e
mark1_background #b4befe
mark2_foreground #1e1e2e
mark2_background #cba6f7
mark3_foreground #1e1e2e
mark3_background #74c7ec
# The 16 terminal colors
# black
color0 #45475a
color8 #585b70
# red
color1 #f38ba8
color9 #f38ba8
# green
color2 #a6e3a1
color10 #a6e3a1
# yellow
color3 #f9e2af
color11 #f9e2af
# blue
color4 #89b4fa
color12 #89b4fa
# magenta
color5 #f5c2e7
color13 #f5c2e7
# cyan
color6 #94e2d5
color14 #94e2d5
# white
color7 #bac2de
color15 #a6adc8
@@ -0,0 +1,54 @@
/* Central theme: catppuccin-mocha (Catppuccin Mocha).
* Part of basic/.config/themes. Managed file: edit the palette here.
* (theme.css was originally ported from catppuccin/waybar themes/mocha.css;
* the waybar port is gone, so this file is hand-maintained now.)
* Consumers must use this file via
* ~/.config/themes/current/theme.css, never a private copy.
* Role aliases (stable interface, theme-agnostic) follow the palette. */
@define-color rosewater #f5e0dc;
@define-color flamingo #f2cdcd;
@define-color pink #f5c2e7;
@define-color mauve #cba6f7;
@define-color red #f38ba8;
@define-color maroon #eba0ac;
@define-color peach #fab387;
@define-color yellow #f9e2af;
@define-color green #a6e3a1;
@define-color teal #94e2d5;
@define-color sky #89dceb;
@define-color sapphire #74c7ec;
@define-color blue #89b4fa;
@define-color lavender #b4befe;
@define-color text #cdd6f4;
@define-color subtext1 #bac2de;
@define-color subtext0 #a6adc8;
@define-color overlay2 #9399b2;
@define-color overlay1 #7f849c;
@define-color overlay0 #6c7086;
@define-color surface2 #585b70;
@define-color surface1 #45475a;
@define-color surface0 #313244;
@define-color base #1e1e2e;
@define-color mantle #181825;
@define-color crust #11111b;
/* ---- Stable role interface (theme-agnostic; consumers use THESE) ----
* NOTE: values are literal hex, NOT @references to the palette above.
* Some Gtk.CssProvider-based parsers silently drop
* @define-color lines that reference another @color, which made every
* background transparent. Keep each role in sync with its palette twin
* (mapping below); scripts/sync-theme.sh verifies this mechanically. */
@define-color bg #1e1e2e; /* = @base */
@define-color bg_dim #181825; /* = @mantle */
@define-color bg_deep #11111b; /* = @crust */
@define-color bg_translucent rgba(17, 17, 27, 0.85); /* crust at 85% (translucent window bg) */
@define-color fg #cdd6f4; /* = @text */
@define-color fg_dim #a6adc8; /* = @subtext0 */
@define-color fg_muted #7f849c; /* = @overlay1 */
@define-color surface #313244; /* = @surface0 */
@define-color border #45475a; /* = @surface1 */
@define-color accent #74c7ec; /* = @sapphire */
@define-color accent2 #b4befe; /* = @lavender */
@define-color ok #a6e3a1; /* = @green */
@define-color warn #f9e2af; /* = @yellow */
@define-color urgent #f38ba8; /* = @red */
@@ -0,0 +1,42 @@
# Central theme interface: catppuccin-mocha (Catppuccin Mocha).
# Part of basic/.config/themes. Managed file: edit the palette here.
# Sourced by POSIX shells (~/.bashrc) and by Hyprland-launched apps.
# Generic THEME_* vars are the stable, theme-agnostic interface; the
# CATPPUCCIN_* / palette vars below exist because lazy.nvim, TPM and
# starship need the literal upstream names. A future non-Catppuccin theme
# only adds a new directory exporting the same THEME_* names.
export THEME_NAME="catppuccin"
export THEME_FLAVOR="mocha"
export THEME_ID="catppuccin-mocha"
# Generic roles (stable interface).
export THEME_BG="#1e1e2e"
export THEME_BG_DIM="#181825"
export THEME_FG="#cdd6f4"
export THEME_FG_DIM="#a6adc8"
export THEME_SURFACE="#313244"
export THEME_BORDER="#45475a"
export THEME_ACCENT="#74c7ec"
export THEME_ACCENT2="#b4befe"
export THEME_OK="#a6e3a1"
export THEME_WARN="#f9e2af"
export THEME_URGENT="#f38ba8"
# Plugin / colorscheme mapping (see ../registry.conf).
export THEME_NVIM_COLORSCHEME="catppuccin"
export THEME_TMUX_PLUGIN="catppuccin/tmux"
export THEME_GTK="Adwaita:dark"
# Upstream literal names (compat for lazy.nvim / TPM / starship).
export CATPPUCCIN_FLAVOR="mocha"
export CATPPUCCIN_BASE="#1e1e2e"
export CATPPUCCIN_MANTLE="#181825"
export CATPPUCCIN_CRUST="#11111b"
export CATPPUCCIN_TEXT="#cdd6f4"
export CATPPUCCIN_SAPPHIRE="#74c7ec"
export CATPPUCCIN_LAVENDER="#b4befe"
export CATPPUCCIN_SURFACE1="#45475a"
export CATPPUCCIN_RED="#f38ba8"
export CATPPUCCIN_GREEN="#a6e3a1"
export CATPPUCCIN_YELLOW="#f9e2af"
@@ -0,0 +1,25 @@
# Central theme interface: catppuccin-mocha (Catppuccin Mocha).
# Fish companion of theme.env.sh. Sourced from fish/config.fish.
# Managed file: edit the palette here, not in consumers.
set -gx THEME_NAME "catppuccin"
set -gx THEME_FLAVOR "mocha"
set -gx THEME_ID "catppuccin-mocha"
set -gx THEME_BG "#1e1e2e"
set -gx THEME_BG_DIM "#181825"
set -gx THEME_FG "#cdd6f4"
set -gx THEME_FG_DIM "#a6adc8"
set -gx THEME_SURFACE "#313244"
set -gx THEME_BORDER "#45475a"
set -gx THEME_ACCENT "#74c7ec"
set -gx THEME_ACCENT2 "#b4befe"
set -gx THEME_OK "#a6e3a1"
set -gx THEME_WARN "#f9e2af"
set -gx THEME_URGENT "#f38ba8"
set -gx THEME_NVIM_COLORSCHEME "catppuccin"
set -gx THEME_TMUX_PLUGIN "catppuccin/tmux"
set -gx THEME_GTK "Adwaita:dark"
set -gx CATPPUCCIN_FLAVOR "mocha"
@@ -0,0 +1,87 @@
-- Central theme interface: catppuccin-mocha (Catppuccin Mocha).
-- Part of basic/.config/themes. Managed file: edit the palette here.
-- Consumers (hyprland.lua) load this via
-- dofile(os.getenv("HOME") .. "/.config/themes/current/theme.lua")
-- and must use the generic roles (bg/fg/accent/...) so a future
-- non-Catppuccin theme only adds a new directory. Full palette is
-- passed through for components that need specific colors.
-- Hyprland color syntax: "rgb(hex)" / "rgba(hexaa)".
local T = {
name = "catppuccin",
flavor = "mocha",
hex = {
rosewater = "f5e0dc",
flamingo = "f2cdcd",
pink = "f5c2e7",
mauve = "cba6f7",
red = "f38ba8",
maroon = "eba0ac",
peach = "fab387",
yellow = "f9e2af",
green = "a6e3a1",
teal = "94e2d5",
sky = "89dceb",
sapphire = "74c7ec",
blue = "89b4fa",
lavender = "b4befe",
text = "cdd6f4",
subtext1 = "bac2de",
subtext0 = "a6adc8",
overlay2 = "9399b2",
overlay1 = "7f849c",
overlay0 = "6c7086",
surface2 = "585b70",
surface1 = "45475a",
surface0 = "313244",
base = "1e1e2e",
mantle = "181825",
crust = "11111b",
},
-- Generic roles (stable interface, theme-agnostic).
bg = "rgba(1e1e2eee)",
bg_dim = "rgb(181825)",
fg = "rgb(cdd6f4)",
fg_dim = "rgb(a6adc8)",
surface = "rgb(313244)",
border_active = "rgba(74c7ecee)",
border_inactive = "rgba(45475aee)",
shadow = "rgba(74c7ecee)",
accent = "rgb(74c7ec)",
accent2 = "rgb(b4befe)",
ok = "rgb(a6e3a1)",
warn = "rgb(f9e2af)",
urgent = "rgb(f38ba8)",
-- Full palette passthrough (hyprland syntax).
rosewater = "rgb(f5e0dc)",
flamingo = "rgb(f2cdcd)",
pink = "rgb(f5c2e7)",
mauve = "rgb(cba6f7)",
red = "rgb(f38ba8)",
maroon = "rgb(eba0ac)",
peach = "rgb(fab387)",
yellow = "rgb(f9e2af)",
green = "rgb(a6e3a1)",
teal = "rgb(94e2d5)",
sky = "rgb(89dceb)",
sapphire = "rgb(74c7ec)",
blue = "rgb(89b4fa)",
lavender = "rgb(b4befe)",
text = "rgb(cdd6f4)",
subtext1 = "rgb(bac2de)",
subtext0 = "rgb(a6adc8)",
overlay2 = "rgb(9399b2)",
overlay1 = "rgb(7f849c)",
overlay0 = "rgb(6c7086)",
surface2 = "rgb(585b70)",
surface1 = "rgb(45475a)",
surface0 = "rgb(313244)",
base = "rgb(1e1e2e)",
mantle = "rgb(181825)",
crust = "rgb(11111b)",
}
return T
+10
View File
@@ -0,0 +1,10 @@
# Central theme registry (basic/.config/themes/themes/registry.conf).
#
# One row per installed theme. Columns (pipe-separated):
# theme-id | nvim colorscheme | tmux plugin | gtk theme | notes
#
# Consumers must branch on THEME_ID / THEME_NVIM_COLORSCHEME /
# THEME_TMUX_PLUGIN only — never on hardcoded theme names elsewhere.
# Adding a future non-Catppuccin theme means: scaffold the directory with
# scripts/new-theme.sh, fill in its palette, add one row here.
catppuccin-mocha|catppuccin|catppuccin/tmux|Adwaita:dark|default; Catppuccin Mocha everywhere
@@ -0,0 +1,2 @@
{
}
+23
View File
@@ -0,0 +1,23 @@
{
"appearance": {
"transparency": {
"enabled": true
}
},
"general": {
"apps": {
"explorer": ["dolphin"],
"terminal": ["kitty"]
}
},
"launcher": {
"showOnHover": true,
"useFuzzy": {
"apps": true
},
"vimKeybinds": true
},
"paths": {
"wallpaperDir": "~/nextcloud/Photos/Wallpapers"
}
}
-1
View File
@@ -1 +0,0 @@
$HYPR_MONITOR_SETUP = ~/.config/hypr/modules/monitor_setup_0_auto.conf
View File
-6
View File
@@ -1,6 +0,0 @@
#!/bin/bash
export HYPR_WALLPAPER_LINK_SOURCE="$HOME/nextcloud/Photos/Wallpapers"
export HYPR_WALLPAPER_LINK="$HOME/.config/wpaperd/wallpapers/linked"
ln -sf "$HYPR_WALLPAPER_LINK_SOURCE" "$HYPR_WALLPAPER_LINK"
Executable → Regular
+21 -23
View File
@@ -1,34 +1,32 @@
# hypridle.conf — idle stages: screensaver (300s, backend in modules/screensaver.lua) -> Noctalia lock (10min) -> DPMS off.
# Managed by dotfiles (stow hypr).
#
# NOTE: this Hyprland (hyprmod Lua runtime, 0.56.x) evaluates `hyprctl dispatch`
# args as Lua — classic `dispatch dpms off` syntax fails. Dispatchers must be
# hl.dsp.* expressions (e.g. hl.dsp.dpms(false)).
general {
lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances.
before_sleep_cmd = loginctl lock-session # lock before suspend.
after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display.
lock_cmd = pidof -q noctalia || noctalia msg session lock
before_sleep_cmd = loginctl lock-session
after_sleep_cmd = hyprctl dispatch 'hl.dsp.dpms(true)'
}
# Screensaver via backend wrappers (switch backend in modules/screensaver.lua).
listener {
timeout = 300 # 5.0min.
on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor.
on-resume = brightnessctl -r # monitor backlight restore.
timeout = 300
on-timeout = ~/.config/hypr/scripts/screensaver-start.sh
on-resume = ~/.config/hypr/scripts/screensaver-stop.sh
}
# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight.
# 10min: lock via Noctalia (SUPER+L runs the same command).
listener {
timeout = 300 # 5.0min.
on-timeout = brightnessctl -sd rgb:kbd_backlight set 0 # turn off keyboard backlight.
on-resume = brightnessctl -rd rgb:kbd_backlight # turn on keyboard backlight.
timeout = 600
on-timeout = loginctl lock-session
}
# 10m30s: power off displays.
listener {
timeout = 900 # 15min
on-timeout = loginctl lock-session # lock screen when timeout has passed
}
listener {
timeout = 1800 # 30min
on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed
on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected after timeout has fired.
}
listener {
timeout = 2700 # 45min
on-timeout = systemctl suspend # suspend pc
timeout = 630
on-timeout = hyprctl dispatch 'hl.dsp.dpms(false)'
on-resume = hyprctl dispatch 'hl.dsp.dpms(true)'
}
View File
View File
-471
View File
@@ -1,471 +0,0 @@
# #######################################################################################
# AUTOGENERATED HYPRLAND CONFIG.
# EDIT THIS CONFIG ACCORDING TO THE WIKI INSTRUCTIONS.
# #######################################################################################
# This is an example Hyprland config file.
# Refer to the wiki for more information.
# https://wiki.hypr.land/Configuring/
# Please note not all available settings / options are set here.
# For a full list, see the wiki
# You can split this configuration into multiple files
# Create your files separately and then link them to this file like this:
# source = ~/.config/hypr/myColors.conf
source = ~/.config/hypr/env.conf
exec = bash ~/.config/hypr/env.sh
################
### MONITORS ###
################
enable_color_management = true
# See https://wiki.hypr.land/Configuring/Monitors/
# monitor=,preferred,auto,auto
source = $HYPR_MONITOR_SETUP
# source = ~/.config/hypr/modules/monitor_setup_buntes_monster.conf
# unscale XWayland
xwayland {
force_zero_scaling = true
}
###################
### MY PROGRAMS ###
###################
# See https://wiki.hypr.land/Configuring/Keywords/
# Set programs that you use
$terminal = kitty
$fileManager = dolphin
#$menu = hyprlauncher
$menu = wofi --show drun
#################
### AUTOSTART ###
#################
# Autostart necessary processes (like notifications daemons, status bars, etc.)
# Or execute your favorite apps at launch like this:
# exec = bash ~/.config/wpaperd/link_wallpapers.sh
exec-once = waybar &
# exec-one = hyprpaper &
exec-once = wpaperd &
exec-once = swaync &
exec-once = hypridle &
exec-once = nextcloud &
exec-once = sh ~/.config/hypr/scripts/portal-host-override.sh
exec-once = sh ~/.config/hypr/scripts/ensure-mime-defaults.sh
# exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_DESKTOP XDG_SESSION_TYPE XDG_MENU_PREFIX
# exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_DESKTOP XDG_SESSION_TYPE XDG_MENU_PREFIX
# exec = gsettings set org.gnome.desktop.interface gtk-theme "Breeze-Dark" # for GTK3 apps
# exec = gsettings set org.gnome.desktop.interface color-scheme "prefer-dark" # for GTK4 apps
# env = QT_QPA_PLATFORMTHEME,qt6ct # for Qt apps
#############################
### ENVIRONMENT VARIABLES ###
#############################
# See https://wiki.hypr.land/Configuring/Environment-variables/
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
env = XDG_CURRENT_DESKTOP,Hyprland
env = XDG_SESSION_DESKTOP,Hyprland
env = XDG_SESSION_TYPE,wayland
env = XDG_MENU_PREFIX,plasma-
env = GTK_USE_PORTAL,1
env = GTK_THEME,Adwaita:dark
env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1
env = QT_QPA_PLATFORMTHEME,kde
# env = QT_AUTO_SCREEN_SCALE_FACTOR,0.75
# env = QT_SCALE_FACTOR,0.75
# env = GDK_SCALE,1.5
# env = GDK_DPI_SCALE,0.75
###################
### PERMISSIONS ###
###################
# See https://wiki.hypr.land/Configuring/Permissions/
# Please note permission changes here require a Hyprland restart and are not applied on-the-fly
# for security reasons
# ecosystem {
# enforce_permissions = 1
# }
# permission = /usr/(bin|local/bin)/grim, screencopy, allow
# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow
# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow
#####################
### COLOR SCHEMES ###
#####################
source=themes/mocha.conf
$color_active_border = rgba($sapphireAlphaee)
$color_inactive_border = rgba($surface1Alphaee)
$color_decoration_shadow = rgba($sapphireAlphaee)
#####################
### LOOK AND FEEL ###
#####################
# Refer to https://wiki.hypr.land/Configuring/Variables/
# https://wiki.hypr.land/Configuring/Variables/#general
general {
gaps_in = 3
gaps_out = 4
border_size = 3
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
col.active_border = $color_active_border
col.inactive_border = $color_inactive_border
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = true
# Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
}
# https://wiki.hypr.land/Configuring/Variables/#decoration
decoration {
rounding = 5
rounding_power = 2
# Change transparency of focused and unfocused windows
active_opacity = 1.00
inactive_opacity = 1.00
shadow {
enabled = true
range = 10
render_power = 3
color = $color_decoration_shadow
}
# https://wiki.hypr.land/Configuring/Variables/#blur
blur {
enabled = true
size = 10
passes = 2
vibrancy = 0.1696
}
}
# https://wiki.hypr.land/Configuring/Variables/#animations
animations {
enabled = yes, please :)
# Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves
# NAME, X0, Y0, X1, Y1
bezier = easeOutQuint, 0.23, 1, 0.32, 1
bezier = easeInOutCubic, 0.65, 0.05, 0.36, 1
bezier = linear, 0, 0, 1, 1
bezier = almostLinear, 0.5, 0.5, 0.75, 1
bezier = quick, 0.15, 0, 0.1, 1
# Default animations, see https://wiki.hypr.land/Configuring/Animations/
# NAME, ONOFF, SPEED, CURVE, [STYLE]
animation = global, 1, 10, default
animation = border, 1, 5.39, easeOutQuint
animation = windows, 1, 4.79, easeOutQuint
animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
animation = windowsOut, 1, 1.49, linear, popin 87%
animation = fadeIn, 1, 1.73, almostLinear
animation = fadeOut, 1, 1.46, almostLinear
animation = fade, 1, 3.03, quick
animation = layers, 1, 3.81, easeOutQuint
animation = layersIn, 1, 4, easeOutQuint, fade
animation = layersOut, 1, 1.5, linear, fade
animation = fadeLayersIn, 1, 1.79, almostLinear
animation = fadeLayersOut, 1, 1.39, almostLinear
animation = workspaces, 1, 1.94, almostLinear, fade
animation = workspacesIn, 1, 1.21, almostLinear, fade
animation = workspacesOut, 1, 1.94, almostLinear, fade
animation = zoomFactor, 1, 7, quick
}
# Ref https://wiki.hypr.land/Configuring/Workspace-Rules/
# "Smart gaps" / "No gaps when only"
# uncomment all if you wish to use that.
workspace = w[tv1], gapsout:0, gapsin:0
workspace = f[1], gapsout:0, gapsin:0
windowrule {
name = no-gaps-wtv1
match:float = false
match:workspace = w[tv1]
border_size = 0
rounding = 0
}
windowrule {
name = no-gaps-f1
match:float = false
match:workspace = f[1]
border_size = 0
rounding = 0
}
# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more
dwindle {
preserve_split = true # You probably want this
}
# See https://wiki.hypr.land/Configuring/Master-Layout/ for more
master {
new_status = master
}
# https://wiki.hypr.land/Configuring/Variables/#misc
misc {
force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :(
}
#############
### INPUT ###
#############
# https://wiki.hypr.land/Configuring/Variables/#input
input {
kb_layout = de
kb_variant =
kb_model =
kb_options = grp:alt_shift_toggle
kb_rules =
follow_mouse = 1
numlock_by_default = true
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
touchpad {
natural_scroll = true
}
}
# See https://wiki.hypr.land/Configuring/Gestures
gesture = 3, horizontal, workspace
# Example per-device config
# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more
device {
name = epic-mouse-v1
sensitivity = -0.5
}
###################
### KEYBINDINGS ###
###################
# See https://wiki.hypr.land/Configuring/Keywords/
$mainMod = SUPER # Sets "Windows" key as main modifier
# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more
bind = $mainMod, RETURN, exec, $terminal
bind = $mainMod, Q, killactive,
bind = $mainMod, ESCAPE, exec, hyprshutdown
bind = $mainMod SHIFT, ESCAPE, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit
bind = $mainMod CTRL, ESCAPE, exec, hyprshutdown -t 'Shutting down...' --post-cmd 'shutdown -P 0'
bind = $mainMod ALT, ESCAPE, exec, hyprshutdown -t 'Restarting...' --post-cmd 'reboot'
bind = $mainMod, E, exec, $fileManager
bind = $mainMod, V, togglefloating,
bind = $mainMod, SPACE, exec, $menu
bind = $mainMod SHIFT, SPACE, exec, nwg-drawer
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, J, layoutmsg, togglesplit # dwindle
bind = $mainMod, I, exec, firefox &
bind = $mainMod, n, exec, ~/.local/bin/hyprltm-net
# Move focus with mainMod + WASD or Vim-style
bind = $mainMod, a, movefocus, l
bind = $mainMod, d, movefocus, r
bind = $mainMod, w, movefocus, u
bind = $mainMod, s, movefocus, d
bind = $mainMod, h, movefocus, l
bind = $mainMod, l, movefocus, r
bind = $mainMod, k, movefocus, u
bind = $mainMod, j, movefocus, d
# Move windows with mainMod + WASD or Vim-style
bind = $mainMod SHIFT, a, movewindow, l
bind = $mainMod SHIFT, d, movewindow, r
bind = $mainMod SHIFT, w, movewindow, u
bind = $mainMod SHIFT, s, movewindow, d
bind = $mainMod SHIFT, h, movewindow, l
bind = $mainMod SHIFT, l, movewindow, r
bind = $mainMod SHIFT, k, movewindow, u
bind = $mainMod SHIFT, j, movewindow, d
# Resize focused window with mainMod + Arrows
bind = $mainMod, left, resizeactive, -10 0
bind = $mainMod, right, resizeactive, 10 0
bind = $mainMod, up, resizeactive, 0 -10
bind = $mainMod, down, resizeactive, 0 10
# Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10
binde = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+
bindl = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
# Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
bind = $mainMod SHIFT, 5, movetoworkspace, 5
bind = $mainMod SHIFT, 6, movetoworkspace, 6
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10
# # Example special workspace (scratchpad)
# bind = $mainMod, S, togglespecialworkspace, magic
# bind = $mainMod SHIFT, S, movetoworkspace, special:magic
# Scroll through existing workspaces with mainMod + scroll
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# Laptop multimedia keys for volume and LCD brightness
bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+
bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%-
# Requires playerctl
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
# Screenshots
$screenshot_folder = ~/Bilder/Screenshots/
bindl = , PRINT, exec, hyprshot -m region --output-folder $screenshot_folder
bindl = LCTRL, PRINT, exec, hyprshot -m window --output-folder $screenshot_folder
bindl = SHIFT, PRINT, exec, hyprshot -m active --output-folder $screenshot_folder
# Screenlock
bindl = LCTRL ALT, L, exec, hyprlock
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hypr.land/Configuring/Window-Rules/ for more
# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules
# Example windowrules that are useful
windowrule {
# Ignore maximize requests from all apps. You'll probably like this.
name = suppress-maximize-events
match:class = .*
suppress_event = maximize
}
windowrule {
# Fix some dragging issues with XWayland
name = fix-xwayland-drags
match:class = ^$
match:title = ^$
match:xwayland = true
match:float = true
match:fullscreen = false
match:pin = false
no_focus = true
}
# Hyprland-run windowrule
windowrule {
name = move-hyprland-run
match:class = hyprland-run
move = 20 monitor_h-120
float = yes
}
windowrule {
name = opacity-kitty-dolphin
match:class = .*(kitty|dolphin).*
opacity = 0.90 0.80
}
layerrule = blur on, ignore_alpha 0.30, match:namespace waybar
layerrule = blur_popups on, match:namespace waybar
decoration {
blur {
size = 8
passes = 2
}
}
windowrule {
name = no-rounding-fullscreen
match:fullscreen = 1
rounding = 0
border_size = 0
}
# windowrule {
# name = no-rounding-steam-games
# match:class = ^steam_app_.*$
# rounding = 0
# border_size = 0
# }
# windowrule {
# name = no-rounding-gamescope
# match:class = ^gamescope$
# rounding = 0
# border_size = 0
# }
+51
View File
@@ -0,0 +1,51 @@
require("env")
hl.exec_cmd("bash ~/.config/hypr/env.sh")
-- ###############
-- ## MONITORS ###
-- ###############
-- load default monitor config
require("modules.monitor_setup_default")
-- Only use monitor_setup if the file exists
local config_home = os.getenv("XDG_CONFIG_HOME") or os.getenv("HOME") .. "/.config"
local f = io.open(config_home .. "/hypr/monitor_setup.lua", "r")
if f then
f:close()
require("monitor_setup")
end
-- unscale XWayland
hl.config({
xwayland = {
force_zero_scaling = true,
},
})
-- ##################
-- ## MY PROGRAMS ###
-- ##################
hl.on("hyprland.start", function()
hl.exec_cmd("caelestia shell -d")
end)
hl.on("hyprland.start", function()
hl.exec_cmd("hypridle &")
end)
hl.on("hyprland.start", function()
hl.exec_cmd("sh ~/.config/hypr/scripts/portal-host-override.sh")
hl.exec_cmd("sh ~/.config/hypr/scripts/ensure-mime-defaults.sh")
end)
require("modules.environment_variables")
require("modules.look_and_feel")
require("modules.input")
require("modules.keybinds")
require("modules.windows_and_workspaces")
-- HyprMod managed settings
require("hyprland-gui")
-106
View File
@@ -1,106 +0,0 @@
# sample hyprlock.conf
# for more configuration options, refer https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock
#
# rendered text in all widgets supports pango markup (e.g. <b> or <i> tags)
# ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#general-remarks
#
# shortcuts to clear password buffer: ESC, Ctrl+U, Ctrl+Backspace
#
# you can get started by copying this config to ~/.config/hypr/hyprlock.conf
#
$font = Monospace
general {
hide_cursor = false
}
# uncomment to enable fingerprint authentication
# auth {
# fingerprint {
# enabled = true
# ready_message = Scan fingerprint to unlock
# present_message = Scanning...
# retry_delay = 250 # in milliseconds
# }
# }
animations {
enabled = true
bezier = linear, 1, 1, 0, 0
animation = fadeIn, 1, 5, linear
animation = fadeOut, 1, 5, linear
animation = inputFieldDots, 1, 2, linear
}
background {
monitor =
path = screenshot
blur_passes = 3
}
input-field {
monitor =
size = 20%, 5%
outline_thickness = 3
inner_color = rgba(0, 0, 0, 0.0) # no fill
outer_color = rgba(33ccffee) rgba(00ff99ee) 45deg
check_color = rgba(00ff99ee) rgba(ff6633ee) 120deg
fail_color = rgba(ff6633ee) rgba(ff0066ee) 40deg
font_color = rgb(143, 143, 143)
fade_on_empty = false
rounding = 15
font_family = $font
placeholder_text = Input password...
fail_text = $PAMFAIL
# uncomment to use a letter instead of a dot to indicate the typed password
# dots_text_format = *
# dots_size = 0.4
dots_spacing = 0.3
# uncomment to use an input indicator that does not show the password length (similar to swaylock's input indicator)
# hide_input = true
position = 0, -20
halign = center
valign = center
}
# TIME
label {
monitor =
text = $TIME # ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#variable-substitution
font_size = 90
font_family = $font
position = -30, 0
halign = right
valign = top
}
# DATE
label {
monitor =
text = cmd[update:60000] date +"%A, %d %B %Y" # update every 60 seconds
font_size = 25
font_family = $font
position = -30, -150
halign = right
valign = top
}
label {
monitor =
text = $LAYOUT[en,ru]
font_size = 24
onclick = hyprctl switchxkblayout all next
position = 250, -20
halign = center
valign = center
}
+40
View File
@@ -0,0 +1,40 @@
# hyprsaver.toml — chill playlist: calm shaders + cool palettes, cycling.
# Location: ~/.config/hypr/hyprsaver.toml (stowed from dotfiles).
# Names verified against `hyprsaver --list-shaders` / `--list-palettes`.
# Everything else uses hyprsaver's built-in defaults (see
# /usr/share/hyprsaver/examples/config.toml for the full reference).
[general]
fps = 30
shader = "cycle"
palette = "cycle"
shader_cycle_interval = 300
palette_cycle_interval = 60
cycle_order = "random"
synced = true
shader_playlist = "chill"
palette_playlist = "chill"
[playlists.chill]
shaders = [
"plasma",
"marble",
"snowfall",
"aurora",
"clouds",
"planet",
"starfield",
"fireflies",
]
palettes = [
"vaporwave",
"frost",
"ocean",
"aurora",
]
[behavior]
fade_in_ms = 800
fade_out_ms = 400
dismiss_on = ["key", "mouse_move", "mouse_click", "touch"]
exclusive_keyboard = true
@@ -0,0 +1,12 @@
-- See https://wiki.hypr.land/Configuring/Environment-variables/
hl.env("XCURSOR_SIZE", "24")
hl.env("HYPRCURSOR_SIZE", "24")
hl.env("XDG_CURRENT_DESKTOP", "Hyprland")
hl.env("XDG_SESSION_DESKTOP", "Hyprland")
hl.env("XDG_SESSION_TYPE", "wayland")
hl.env("XDG_MENU_PREFIX", "plasma-")
hl.env("GTK_USE_PORTAL", "1")
hl.env("GTK_THEME", os.getenv("THEME_GTK") or "Adwaita:dark")
hl.env("QT_WAYLAND_DISABLE_WINDOWDECORATION", "1")
hl.env("QT_QPA_PLATFORMTHEME", "kde")
+33
View File
@@ -0,0 +1,33 @@
-- https://wiki.hypr.land/Configuring/Variables/#input
hl.config({
input = {
kb_layout = "de",
kb_variant = "",
kb_model = "",
kb_options = "grp:alt_shift_toggle",
kb_rules = "",
follow_mouse = 1,
numlock_by_default = true,
sensitivity = 0,
touchpad = {
natural_scroll = true,
},
},
})
-- See https://wiki.hypr.land/Configuring/Gestures
hl.gesture({
fingers = 3,
direction = "horizontal",
action = "workspace",
})
-- Example per-device config
-- See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more
hl.device({
name = "epic-mouse-v1",
sensitivity = -0.5,
})
+237
View File
@@ -0,0 +1,237 @@
local var = require("modules.variables")
local command = require("modules.shell_commands")
-- See https://wiki.hypr.land/Configuring/Keywords/
-- Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more
hl.bind(var.mainMod .. " + RETURN", hl.dsp.exec_cmd(var.terminal), { description = "Open terminal (kitty)" })
hl.bind(var.mainMod .. " + Q", hl.dsp.window.close(), { description = "Close focused window" })
hl.bind(
var.mainMod .. " + ESCAPE",
hl.dsp.exec_cmd(command.session),
{ description = "Session menu (logout/reboot/shutdown)" }
)
hl.bind(var.mainMod .. " + SHIFT + ESCAPE", hl.dsp.exec_cmd(command.logout), { description = "Exit Hyprland" })
hl.bind(var.mainMod .. " + CTRL + ESCAPE", hl.dsp.exec_cmd(command.shutdown), { description = "Power off the system" })
hl.bind(var.mainMod .. " + ALT + ESCAPE", hl.dsp.exec_cmd(command.reboot), { description = "Reboot the system" })
hl.bind(var.mainMod .. " + E", hl.dsp.exec_cmd(var.fileManager), { description = "Open file manager (dolphin)" })
hl.bind(var.mainMod .. " + V", hl.dsp.window.float({ action = "toggle" }), { description = "Toggle floating window" })
hl.bind(var.mainMod .. " + SPACE", hl.dsp.exec_cmd(command.menu), { description = "Open app launcher" })
hl.bind(var.mainMod .. " + P", hl.dsp.window.pseudo(), { description = "Toggle pseudo-tiling" })
hl.bind(var.mainMod .. " + SHIFT + J", hl.dsp.layout("togglesplit"), { description = "Toggle split layout" })
hl.bind(var.mainMod .. " + I", hl.dsp.exec_cmd("firefox &"), { description = "Open Firefox" })
hl.bind(var.mainMod .. " + n", hl.dsp.exec_cmd("nm-connection-editor"), { description = "Network manager" })
hl.bind(var.mainMod .. " + comma", hl.dsp.exec_cmd(command.settings), { description = "settings menu" })
hl.bind(var.mainMod .. " + S", hl.dsp.exec_cmd(command.control_center), { description = "Control center" })
-- Move focus with mainMod or Vim-style
hl.bind(var.mainMod .. " + CTRL + h", hl.dsp.focus({ direction = "left" }), { description = "Focus window left" })
hl.bind(var.mainMod .. " + CTRL + l", hl.dsp.focus({ direction = "right" }), { description = "Focus window right" })
hl.bind(var.mainMod .. " + CTRL + k", hl.dsp.focus({ direction = "up" }), { description = "Focus window up" })
hl.bind(var.mainMod .. " + CTRL + j", hl.dsp.focus({ direction = "down" }), { description = "Focus window down" })
-- Move windows with mainMod or Vim-style
hl.bind(var.mainMod .. " + SHIFT + h", hl.dsp.window.move({ direction = "left" }), { description = "Move window left" })
hl.bind(
var.mainMod .. " + SHIFT + l",
hl.dsp.window.move({ direction = "right" }),
{ description = "Move window right" }
)
hl.bind(var.mainMod .. " + SHIFT + k", hl.dsp.window.move({ direction = "up" }), { description = "Move window up" })
hl.bind(var.mainMod .. " + SHIFT + j", hl.dsp.window.move({ direction = "down" }), { description = "Move window down" })
-- Resize focused window with mainMod + Arrows
hl.bind(
var.mainMod .. " + left",
hl.dsp.window.resize({ x = -10, y = 0, relative = true }),
{ description = "Resize window left" }
)
hl.bind(
var.mainMod .. " + right",
hl.dsp.window.resize({ x = 10, y = 0, relative = true }),
{ description = "Resize window right" }
)
hl.bind(
var.mainMod .. " + up",
hl.dsp.window.resize({ x = 0, y = -10, relative = true }),
{ description = "Resize window up" }
)
hl.bind(
var.mainMod .. " + down",
hl.dsp.window.resize({ x = 0, y = 10, relative = true }),
{ description = "Resize window down" }
)
-- Switch workspaces with mainMod + [0-9]
hl.bind(var.mainMod .. " + 1", hl.dsp.focus({ workspace = 1 }), { description = "Switch to workspace 1" })
hl.bind(var.mainMod .. " + 2", hl.dsp.focus({ workspace = 2 }), { description = "Switch to workspace 2" })
hl.bind(var.mainMod .. " + 3", hl.dsp.focus({ workspace = 3 }), { description = "Switch to workspace 3" })
hl.bind(var.mainMod .. " + 4", hl.dsp.focus({ workspace = 4 }), { description = "Switch to workspace 4" })
hl.bind(var.mainMod .. " + 5", hl.dsp.focus({ workspace = 5 }), { description = "Switch to workspace 5" })
hl.bind(var.mainMod .. " + 6", hl.dsp.focus({ workspace = 6 }), { description = "Switch to workspace 6" })
hl.bind(var.mainMod .. " + 7", hl.dsp.focus({ workspace = 7 }), { description = "Switch to workspace 7" })
hl.bind(var.mainMod .. " + 8", hl.dsp.focus({ workspace = 8 }), { description = "Switch to workspace 8" })
hl.bind(var.mainMod .. " + 9", hl.dsp.focus({ workspace = 9 }), { description = "Switch to workspace 9" })
hl.bind(var.mainMod .. " + 0", hl.dsp.focus({ workspace = 10 }), { description = "Switch to workspace 10" })
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"), {
repeating = true,
description = "Volume up",
})
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), {
locked = true,
description = "Volume down",
})
-- Move active window to a workspace with mainMod + SHIFT + [0-9]
hl.bind(
var.mainMod .. " + SHIFT + 1",
hl.dsp.window.move({ workspace = 1 }),
{ description = "Move window to workspace 1" }
)
hl.bind(
var.mainMod .. " + SHIFT + 2",
hl.dsp.window.move({ workspace = 2 }),
{ description = "Move window to workspace 2" }
)
hl.bind(
var.mainMod .. " + SHIFT + 3",
hl.dsp.window.move({ workspace = 3 }),
{ description = "Move window to workspace 3" }
)
hl.bind(
var.mainMod .. " + SHIFT + 4",
hl.dsp.window.move({ workspace = 4 }),
{ description = "Move window to workspace 4" }
)
hl.bind(
var.mainMod .. " + SHIFT + 5",
hl.dsp.window.move({ workspace = 5 }),
{ description = "Move window to workspace 5" }
)
hl.bind(
var.mainMod .. " + SHIFT + 6",
hl.dsp.window.move({ workspace = 6 }),
{ description = "Move window to workspace 6" }
)
hl.bind(
var.mainMod .. " + SHIFT + 7",
hl.dsp.window.move({ workspace = 7 }),
{ description = "Move window to workspace 7" }
)
hl.bind(
var.mainMod .. " + SHIFT + 8",
hl.dsp.window.move({ workspace = 8 }),
{ description = "Move window to workspace 8" }
)
hl.bind(
var.mainMod .. " + SHIFT + 9",
hl.dsp.window.move({ workspace = 9 }),
{ description = "Move window to workspace 9" }
)
hl.bind(
var.mainMod .. " + SHIFT + 0",
hl.dsp.window.move({ workspace = 10 }),
{ description = "Move window to workspace 10" }
)
-- # Example special workspace (scratchpad)
-- bind = $mainMod, S, togglespecialworkspace, magic
-- bind = $mainMod SHIFT, S, movetoworkspace, special:magic
-- Scroll through existing workspaces with mainMod + scroll
hl.bind(
var.mainMod .. " + mouse_down",
hl.dsp.focus({ workspace = "e+1" }),
{ description = "Next workspace (scroll down)" }
)
hl.bind(
var.mainMod .. " + mouse_up",
hl.dsp.focus({ workspace = "e-1" }),
{ description = "Previous workspace (scroll up)" }
)
-- Move/resize windows with mainMod + LMB/RMB and dragging
hl.bind(var.mainMod .. " + mouse:272", hl.dsp.window.drag(), {
mouse = true,
description = "Move window with mouse",
})
hl.bind(var.mainMod .. " + mouse:273", hl.dsp.window.resize(), {
mouse = true,
description = "Resize window with mouse",
})
-- Laptop multimedia keys for volume and LCD brightness
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), {
repeating = true,
locked = true,
description = "Volume up (repeat)",
})
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), {
repeating = true,
locked = true,
description = "Volume down (repeat)",
})
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), {
repeating = true,
locked = true,
description = "Mute audio",
})
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), {
repeating = true,
locked = true,
description = "Mute microphone",
})
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), {
repeating = true,
locked = true,
description = "Brightness up",
})
hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), {
repeating = true,
locked = true,
description = "Brightness down",
})
-- Requires playerctl
hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), {
locked = true,
description = "Next track",
})
hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), {
locked = true,
description = "Play/Pause",
})
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), {
locked = true,
description = "Play/Pause",
})
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), {
locked = true,
description = "Previous track",
})
-- Screenshots
hl.bind("PRINT", hl.dsp.exec_cmd("hyprshot -m region --output-folder " .. var.screenshot_folder), {
locked = true,
description = "Screenshot region",
})
hl.bind("CTRL + PRINT", hl.dsp.exec_cmd("hyprshot -m window --output-folder " .. var.screenshot_folder), {
locked = true,
description = "Screenshot window",
})
hl.bind("SHIFT + PRINT", hl.dsp.exec_cmd("hyprshot -m active --output-folder " .. var.screenshot_folder), {
locked = true,
description = "Screenshot active monitor",
})
hl.bind(var.mainMod .. " + L", hl.dsp.exec_cmd(command.lock), { locked = true, description = "Lock screen" })
hl.bind(var.mainMod .. " + SHIFT + L", hl.dsp.exec_cmd(command.screensaver), { description = "Start screensaver (any key quits)" })
hl.bind(var.mainMod .. " + K", hl.dsp.exec_cmd(command.keybinds_show), { description = "Show keybind overview" })
hl.bind(var.mainMod .. " + W", hl.dsp.exec_cmd(command.wallpaper_select), { description = "Wallpaper select" })
-- Caelestia extras
hl.bind(var.mainMod .. " + SHIFT + V", hl.dsp.exec_cmd(command.clipboard), { description = "Clipboard history" })
hl.bind(var.mainMod .. " + period", hl.dsp.exec_cmd(command.emoji), { description = "Emoji picker" })
hl.bind(var.mainMod .. " + SHIFT + K", hl.dsp.exec_cmd(command.show_all), { description = "Toggle utilities" })
hl.bind("CTRL + ALT + C", hl.dsp.exec_cmd(command.clear_notifications), { description = "Clear notifications" })
+257
View File
@@ -0,0 +1,257 @@
local var = require("modules.variables")
-- Refer to https://wiki.hypr.land/Configuring/Variables/
-- https://wiki.hypr.land/Configuring/Variables/#general
hl.config({
general = {
gaps_in = 3,
gaps_out = 4,
border_size = 3,
},
})
-- https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
hl.config({
general = {
col = {
active_border = var.color_active_border,
inactive_border = var.color_inactive_border,
},
},
})
-- Set to true enable resizing windows by clicking and dragging on borders and gaps
hl.config({
general = {
resize_on_border = true,
},
})
-- Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
hl.config({
general = {
allow_tearing = false,
layout = "dwindle",
},
})
-- https://wiki.hypr.land/Configuring/Variables/#decoration
hl.config({
decoration = {
rounding = 5,
rounding_power = 2,
},
})
-- Change transparency of focused and unfocused windows
hl.config({
decoration = {
active_opacity = 1.0,
inactive_opacity = 1.0,
shadow = {
enabled = true,
range = 10,
render_power = 3,
color = var.color_decoration_shadow,
},
},
})
-- https://wiki.hypr.land/Configuring/Variables/#blur
hl.config({
decoration = {
blur = {
enabled = true,
size = 10,
passes = 2,
vibrancy = 0.1696,
},
},
})
-- https://wiki.hypr.land/Configuring/Variables/#animations
hl.config({
animations = {
enabled = true,
},
})
-- Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves
-- NAME, X0, Y0, X1, Y1
hl.curve("easeOutQuint", { type = "bezier", points = { { 0.23, 1 }, { 0.32, 1 } } })
hl.curve("easeInOutCubic", { type = "bezier", points = { { 0.65, 0.05 }, { 0.36, 1 } } })
hl.curve("linear", { type = "bezier", points = { { 0, 0 }, { 1, 1 } } })
hl.curve("almostLinear", { type = "bezier", points = { { 0.5, 0.5 }, { 0.75, 1 } } })
hl.curve("quick", { type = "bezier", points = { { 0.15, 0 }, { 0.1, 1 } } })
-- Default animations, see https://wiki.hypr.land/Configuring/Animations/
-- NAME, ONOFF, SPEED, CURVE, [STYLE]
hl.animation({
leaf = "global",
enabled = true,
speed = 10,
bezier = "default",
})
hl.animation({
leaf = "border",
enabled = true,
speed = 5.39,
bezier = "easeOutQuint",
})
hl.animation({
leaf = "windows",
enabled = true,
speed = 4.79,
bezier = "easeOutQuint",
})
hl.animation({
leaf = "windowsIn",
enabled = true,
speed = 4.1,
bezier = "easeOutQuint",
style = "popin 87%",
})
hl.animation({
leaf = "windowsOut",
enabled = true,
speed = 1.49,
bezier = "linear",
style = "popin 87%",
})
hl.animation({
leaf = "fadeIn",
enabled = true,
speed = 1.73,
bezier = "almostLinear",
})
hl.animation({
leaf = "fadeOut",
enabled = true,
speed = 1.46,
bezier = "almostLinear",
})
hl.animation({
leaf = "fade",
enabled = true,
speed = 3.03,
bezier = "quick",
})
hl.animation({
leaf = "layers",
enabled = true,
speed = 3.81,
bezier = "easeOutQuint",
})
hl.animation({
leaf = "layersIn",
enabled = true,
speed = 4,
bezier = "easeOutQuint",
style = "fade",
})
hl.animation({
leaf = "layersOut",
enabled = true,
speed = 1.5,
bezier = "linear",
style = "fade",
})
hl.animation({
leaf = "fadeLayersIn",
enabled = true,
speed = 1.79,
bezier = "almostLinear",
})
hl.animation({
leaf = "fadeLayersOut",
enabled = true,
speed = 1.39,
bezier = "almostLinear",
})
hl.animation({
leaf = "workspaces",
enabled = true,
speed = 1.94,
bezier = "almostLinear",
style = "slide",
})
hl.animation({
leaf = "workspacesIn",
enabled = true,
speed = 1.21,
bezier = "almostLinear",
style = "slide",
})
hl.animation({
leaf = "workspacesOut",
enabled = true,
speed = 1.94,
bezier = "almostLinear",
style = "slide",
})
hl.animation({
leaf = "zoomFactor",
enabled = true,
speed = 7,
bezier = "quick",
})
-- Ref https://wiki.hypr.land/Configuring/Workspace-Rules/
-- "Smart gaps" / "No gaps when only"
-- uncomment all if you wish to use that.
hl.workspace_rule({
workspace = "w[tv1]",
gaps_out = 0,
gaps_in = 0,
})
hl.workspace_rule({
workspace = "f[1]",
gaps_out = 0,
gaps_in = 0,
})
hl.window_rule({
name = "no-gaps-wtv1",
match = {
float = false,
workspace = "w[tv1]",
},
border_size = 0,
rounding = 0,
})
hl.window_rule({
name = "no-gaps-f1",
match = {
float = false,
workspace = "f[1]",
},
border_size = 0,
rounding = 0,
})
-- See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more
hl.config({
dwindle = {
preserve_split = true,
},
})
-- See https://wiki.hypr.land/Configuring/Master-Layout/ for more
hl.config({
master = {
new_status = "master",
},
})
-- https://wiki.hypr.land/Configuring/Variables/#misc
hl.config({
misc = {
force_default_wallpaper = -1,
disable_hyprland_logo = false,
},
})
@@ -1 +0,0 @@
monitor=,preferred,auto,1.0
@@ -1 +0,0 @@
monitor=,preferred,auto,1.0
@@ -1,18 +0,0 @@
# monitorv2 {
# output = DP-2
# mode = highres highrr
# position = 0x0
# scale = 1.2
# bitdepth = 10
# cm = hdr
# supports_wide_color = 1
# supports_hdr = 1
# sdr_min_luminance = 0.005
# sdr_max_luminance = 200
# min_luminance = 0.002
# max_luminance = 200
# max_avg_luminance = 150
# }
monitor = DP-2, preferred, auto-left, 1.5
monitor = DP-3, preferred, auto-right, 1.0
@@ -0,0 +1,36 @@
-- Default
hl.monitor({
output = "",
disabled = false,
mode = "preferred",
position = "auto",
scale = 1.0,
})
-- -- Buntes Monster
-- hl.monitor({
-- output = "DP-2",
-- disabled = false,
-- mode = "preferred",
-- position = "auto-left",
-- scale = 1.5,
-- })
-- hl.monitor({
-- output = "DP-3",
-- disabled = false,
-- mode = "preferred",
-- position = "auto-right",
-- scale = 1.0,
-- })
-- -- Archtop
-- hl.monitor({
-- output = "",
-- disabled = false,
-- mode = "preferred",
-- position = "auto",
-- scale = 1.0,
-- })
+13
View File
@@ -0,0 +1,13 @@
-- Screensaver commands for idle (hypridle on-timeout/on-resume) and manual
-- (SUPER+SHIFT+L) use. scripts/screensaver-start.sh and
-- scripts/screensaver-stop.sh exec the .start / .stop command below.
--
-- Active backend: tte (fullscreen kitty + terminal-text-effects).
return {
start = "~/.config/hypr/scripts/launch-screensaver.sh",
stop = "~/.config/hypr/scripts/screensaver-stop.sh",
-- Alternative backend: hyprsaver (GPU fractal shaders, wlr-layer-shell).
-- Swap the commented pair in to switch (no other file changes needed).
-- start = "hyprsaver",
-- stop = "hyprsaver --quit",
}
@@ -0,0 +1,24 @@
-- Caelestia shell commands. This branch is caelestia-only;
-- revert to Noctalia by switching branches.
-- Caelestia drawers (see ScreenState.qml): bar, osd, session, launcher,
-- dashboard, utilities, sidebar. Wallpaper goes through the launcher
-- (type `>wallpaper`) or `caelestia wallpaper`.
return {
session = "caelestia shell drawers toggle session",
logout = "hyprctl dispatch exit",
shutdown = "systemctl poweroff",
reboot = "systemctl reboot",
menu = "caelestia shell drawers toggle launcher",
settings = "caelestia shell drawers toggle dashboard",
control_center = "caelestia shell drawers toggle sidebar",
lock = "caelestia shell lock lock",
wallpaper_select = "caelestia shell drawers toggle launcher && sleep 0.1 && wtype \">wallpaper \"",
clipboard = "caelestia clipboard",
clipboard_delete = "caelestia clipboard -d",
emoji = "caelestia emoji -p",
show_all = "caelestia shell drawers toggle utilities",
clear_notifications = "caelestia shell notifs clear",
keybinds_show = "sh ~/.config/hypr/scripts/show-keybinds.sh",
screensaver = "sh ~/.config/hypr/scripts/screensaver-start.sh force",
}
+20
View File
@@ -0,0 +1,20 @@
local theme = dofile(os.getenv("HOME") .. "/.config/themes/current/theme.lua")
-- local var_color_active_border = theme.border_active
-- local var_color_inactive_border = theme.border_inactive
-- local var_color_decoration_shadow = theme.shadow
-- local var_mainMod = "SUPER"
-- local var_terminal = "kitty"
-- local var_fileManager = "dolphin"
-- local var_menu = "noctalia msg panel-toggle launcher"
-- local var_screenshot_folder = "~/Bilder/Screenshots/"
return {
color_active_border = theme.border_active,
color_inactive_border = theme.border_inactive,
color_decoration_shadow = theme.shadow,
mainMod = "SUPER",
terminal = "kitty",
fileManager = "dolphin",
screenshot_folder = "~/Bilder/Screenshots/",
}
@@ -0,0 +1,138 @@
-- See https://wiki.hypr.land/Configuring/Window-Rules/ for more
-- See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules
-- Example windowrules that are useful
-- Ignore maximize requests from all apps. You'll probably like this.
hl.window_rule({
name = "suppress-maximize-events",
match = {
class = ".*",
},
suppress_event = "maximize",
})
-- Fix some dragging issues with XWayland
hl.window_rule({
name = "fix-xwayland-drags",
match = {
class = "^$",
title = "^$",
xwayland = true,
float = true,
fullscreen = false,
pin = false,
},
no_focus = true,
})
-- Hyprland-run windowrule
hl.config({
decoration = {
blur = {
size = 8,
passes = 2,
},
},
})
hl.window_rule({
name = "move-hyprland-run",
match = {
class = "hyprland-run",
},
move = "20 monitor_h-120",
float = true,
})
hl.window_rule({
name = "keybinds-float",
match = {
class = "keybinds",
},
float = true,
size = "900 700",
center = true,
dim_around = true,
})
hl.window_rule({
name = "opacity-kitty-dolphin",
match = {
class = ".*(kitty|dolphin).*",
},
opacity = "0.80 0.70",
})
-- Noctalia shell surfaces: blur bars/panels/dock/notifications and let
-- Noctalia run its own animations (no Hyprland layer animation on top).
hl.layer_rule({
name = "noctalia",
match = {
namespace = "^noctalia-(bar-.+|notification|dock|panel|attached-panel|osd|window-switcher)$",
},
no_anim = true,
ignore_alpha = 0.5,
blur = true,
blur_popups = true,
})
hl.layer_rule({
name = "caelestia",
match = {
namespace = "^caelestia-.*$",
},
no_anim = true,
ignore_alpha = 0.5,
blur = true,
blur_popups = true,
})
hl.window_rule({
name = "noctalia-settings",
match = {
class = "dev.noctalia.Noctalia",
},
float = true,
size = "1080 920",
})
hl.window_rule({
name = "no-rounding-fullscreen",
match = {
fullscreen = 1,
},
rounding = 0,
border_size = 0,
})
-- Manual tte screensaver preview (SUPER+SHIFT+L): fullscreen kitty.
hl.window_rule({
name = "screensaver-fullscreen",
match = {
class = "org.screensaver",
},
fullscreen = true,
float = true,
})
-- windowrule {
-- name = no-rounding-steam-games
-- match:class = ^steam_app_.*$
-- rounding = 0
-- border_size = 0
-- }
-- windowrule {
-- name = no-rounding-gamescope
-- match:class = ^gamescope$
-- rounding = 0
-- border_size = 0
-- }
@@ -0,0 +1,35 @@
-- Default
hl.monitor({
output = "",
disabled = false,
mode = "preferred",
position = "auto",
scale = 1.0,
})
-- -- Buntes Monster
-- hl.monitor({
-- output = "DP-2",
-- disabled = false,
-- mode = "preferred",
-- position = "auto-left",
-- scale = 1.5,
-- })
-- hl.monitor({
-- output = "DP-3",
-- disabled = false,
-- mode = "preferred",
-- position = "auto-right",
-- scale = 1.0,
-- })
-- -- Archtop
-- hl.monitor({
-- output = "",
-- disabled = false,
-- mode = "preferred",
-- position = "auto",
-- scale = 1.0,
-- })
+4
View File
@@ -0,0 +1,4 @@
hyprland
// idle looks good on you
ArchTop is relaxing 🧘
+51
View File
@@ -0,0 +1,51 @@
#!/usr/bin/env bash
# launch-screensaver.sh — idle-triggered tte screensaver (hypridle on-timeout).
# Spawns one fullscreen kitty running screensaver-tte.sh per monitor.
# Usage: launch-screensaver.sh [force]
# force ignore the screensaver-off toggle file.
# Toggle off: touch ~/.local/state/hypr/screensaver-off
#
# Lessons baked in: no focus-restore after spawn (it raced the new window and
# caused flash-then-nothing), no pkill -f patterns anywhere (teardown is done
# by screensaver-stop.sh via exact client PIDs).
set -euo pipefail
SCREENSAVER_CLASS="org.screensaver"
TOGGLE_FILE="$HOME/.local/state/hypr/screensaver-off"
command -v tte >/dev/null 2>&1 || exit 1
command -v kitty >/dev/null 2>&1 || exit 1
# Already running (precise client check).
if hyprctl clients -j 2>/dev/null | jq -e '.[] | select(.class=="org.screensaver")' >/dev/null 2>&1; then
exit 0
fi
# Opt-out toggle (unless forced, e.g. manual invocation).
if [[ -f "$TOGGLE_FILE" ]] && [[ "${1:-}" != "force" ]]; then
exit 1
fi
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# hyprctl prints plain-text errors (not JSON) when HYPRLAND_INSTANCE_SIGNATURE
# is stale (e.g. shell/tmux predates the current compositor). Fail clearly
# instead of dumping a jq parse error.
monitors_json="$(hyprctl monitors -j 2>/dev/null)" || {
echo "launch-screensaver: hyprctl failed - is HYPRLAND_INSTANCE_SIGNATURE stale? (try a fresh terminal)" >&2
exit 1
}
echo "$monitors_json" | jq -e . >/dev/null 2>&1 || {
echo "launch-screensaver: hyprctl did not return JSON - stale HYPRLAND_INSTANCE_SIGNATURE?" >&2
exit 1
}
# NOTE: hyprmod Lua runtime (Hyprland 0.56.x) evaluates `hyprctl dispatch` args
# as Lua — classic `dispatch focusmonitor eDP-1` fails. Dispatchers must be
# hl.dsp.* expressions. Focus each monitor before exec so the saver kitty
# spawns there; deliberately no focus-restore afterwards (spawn race).
for m in $(echo "$monitors_json" | jq -r '.[] | .name'); do
hyprctl dispatch "hl.dsp.focus({monitor=\"$m\"})" >/dev/null 2>&1
hyprctl dispatch "hl.dsp.exec_cmd('kitty --class=\"$SCREENSAVER_CLASS\" --override font_size=18 --override window_padding_width=0 --override background_opacity=1 --override mouse_hide_wait=1.0 -e \"$SCRIPT_DIR/screensaver-tte.sh\"')" >/dev/null 2>&1
done
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/env bash
# screensaver-start.sh — exec the start command from modules/screensaver.lua.
# Usage: screensaver-start.sh [force] (forwarded to .sh targets, e.g. the tte
# launcher's toggle bypass; dropped for bare commands like `hyprsaver`).
set -euo pipefail
CMD="$(lua -e 'print(dofile(os.getenv("HOME").."/.config/hypr/modules/screensaver.lua").start)' 2>/dev/null)" || {
echo "screensaver-start: cannot read modules/screensaver.lua" >&2
exit 1
}
CMD="${CMD/#\~/$HOME}"
[[ -n "$CMD" ]] || {
echo "screensaver-start: empty start command" >&2
exit 1
}
if [[ "$CMD" == *.sh ]]; then
exec "$CMD" "$@"
else
# Bare command, may carry flags (e.g. "hyprsaver --quit").
# shellcheck disable=SC2086
exec $CMD
fi
+36
View File
@@ -0,0 +1,36 @@
#!/usr/bin/env bash
# screensaver-stop.sh — exec the stop command from modules/screensaver.lua.
# When it points back here (tte backend), run the built-in teardown below:
# kill saver windows by Hyprland client PID (class org.screensaver) plus
# stray tte processes (exact comm match). Never `pkill -f <pattern>`: a
# full-cmdline pattern also matches bystander shells merely mentioning it.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ME="$(realpath "$SCRIPT_DIR/screensaver-stop.sh")"
WANT="$(lua -e 'print(dofile(os.getenv("HOME").."/.config/hypr/modules/screensaver.lua").stop)' 2>/dev/null)" || {
echo "screensaver-stop: cannot read modules/screensaver.lua" >&2
exit 1
}
WANT="${WANT/#\~/$HOME}"
# Alternative backend configured (e.g. "hyprsaver --quit"): run it instead.
if [[ "$(realpath -m "$WANT")" != "$ME" ]]; then
# shellcheck disable=SC2086
exec $WANT
fi
# --- tte teardown ---
pids="$(hyprctl clients -j 2>/dev/null | jq -r '.[] | select(.class=="org.screensaver") | .pid' 2>/dev/null)" || pids=""
if [[ -n "${pids:-}" ]]; then
# shellcheck disable=SC2086
kill $pids 2>/dev/null || true
fi
# tte runs under comm "tte" (verified); -x matches the comm only, so this
# cannot hit bystander shells.
pkill -x tte 2>/dev/null || true
exit 0
+41
View File
@@ -0,0 +1,41 @@
#!/usr/bin/env bash
# screensaver-tte.sh — runs inside each fullscreen tte kitty.
# Loops random tte effects until any keypress, then exits (kitty closes).
# Child teardown uses the exact PID ($!) — never pkill -f patterns, which
# would also match bystander shells mentioning the class name.
set -euo pipefail
SCREENSAVER_TEXT="$HOME/.config/hypr/screensaver.txt"
trap 'exit 0' SIGINT SIGTERM SIGHUP SIGQUIT
printf '\033]11;rgb:00/00/00\007' # black background
input="$SCREENSAVER_TEXT"
[[ -f "$input" ]] || input="/etc/hostname"
while true; do
tte -i "$input" \
--frame-rate 60 --canvas-width 0 --canvas-height 0 \
--anchor-canvas c --anchor-text c \
--random-effect --exclude-effects dev_worm \
--no-eol --no-restore-cursor &
TPID=$!
# Wait for tte to appear (Python startup) before polling it.
for _ in $(seq 1 10); do
kill -0 "$TPID" 2>/dev/null || break
pgrep -x tte >/dev/null 2>&1 && break
sleep 0.1
done
while kill -0 "$TPID" 2>/dev/null; do
if read -r -n1 -t 1; then
kill "$TPID" 2>/dev/null || true
wait "$TPID" 2>/dev/null || true
exit 0
fi
done
wait "$TPID" 2>/dev/null || true
# Throttle respawn if tte exits instantly (e.g. a sub-second effect).
sleep 0.2
done
+94
View File
@@ -0,0 +1,94 @@
#!/usr/bin/env bash
# show-keybinds.sh — floating keybind overview popup.
#
# Reads the live keybind list from `hyprctl binds -j` and shows it in a
# floating kitty window (single column, sorted A-Z, searchable via less).
# Display-only: wofi/rofi are gone (the Noctalia launcher has no stdin-list
# mode), so picking a row to execute is not wired up.
#
# Note: this config uses the Lua API (hl.bind), so `hyprctl binds -j` reports
# key + modmask + an opaque Lua registry reference instead of a readable
# dispatcher. The human-readable action comes from the `description` option
# added to each hl.bind(...) call - keep those descriptions up to date when
# you change a bind.
#
# Usage: show-keybinds.sh [--print]
# --print print the formatted list to stdout instead of opening kitty
# (handy for debugging / testing the formatting pipeline)
set -euo pipefail
# modmask bits reported by hyprctl (XKB modifiers), pairwise bit:name in
# display order. See https://wiki.hypr.land/Configuring/Binds/
readonly MOD_ORDER=(64 SUPER 8 ALT 4 CTRL 1 SHIFT 2 CAPS 16 MOD2 32 MOD3 128 MOD5)
if ! hyprctl binds -j >/dev/null 2>&1; then
echo "hyprctl binds failed - are you inside a Hyprland session?" >&2
exit 1
fi
rows=()
# modmask\x1fkey\x1fdescription\x1fsubmap\x1farg
# Fields are joined with the unit separator (0x1f): tabs are IFS-whitespace
# and `read` would collapse consecutive tabs, eating empty middle fields
# like the (usually empty) submap. \x1f is not whitespace, so every field
# keeps its position.
while IFS=$'\x1f' read -r modmask key description submap arg; do
# Humanize mouse-button binds.
case "$key" in
mouse:272) key="LMB" ;;
mouse:273) key="RMB" ;;
esac
# Build the chord, e.g. "SUPER + SHIFT + Q".
chord=""
i=0
while (( i < ${#MOD_ORDER[@]} )); do
bit=${MOD_ORDER[i]}
name=${MOD_ORDER[i + 1]}
if (( modmask & bit )); then
chord+="${name} + "
fi
i=$((i + 2))
done
chord+="$key"
if [[ -n "$submap" ]]; then
chord="[$submap] $chord"
fi
if [[ -n "$description" ]]; then
rows+=("$(printf '%-26s %s' "$chord" "$description")")
else
rows+=("$(printf '%-26s %s' "$chord" "(no description)")")
fi
done < <(hyprctl binds -j | jq -r '.[] | [(.modmask | tostring), .key, .description, .submap, .arg] | join("\u001f")')
if (( ${#rows[@]} == 0 )); then
echo "No keybinds found." >&2
exit 1
fi
# Drop duplicate chords (e.g. media keys bound twice with different flags),
# then sort alphabetically (A-Z).
mapfile -t rows < <(printf '%s\n' "${rows[@]}" | awk '{ c = $0; sub(/ {2,}.*/, "", c); if (!seen[c]++) print }' | LC_ALL=C sort -f)
if [[ "${1:-}" == "--print" ]]; then
printf '%s\n' "${rows[@]}"
exit 0
fi
# Floating display via kitty (class `keybinds` has a float rule in
# hyprland.lua). Rows go through a temp file rather than a stdin pipe so the
# popup does not depend on kitty forwarding stdin to its child; the previous
# run's file is cleaned up on the next invocation. q closes the window.
rm -f /tmp/keybinds.??????.txt 2>/dev/null || true
if command -v kitty >/dev/null 2>&1; then
tmp="$(mktemp /tmp/keybinds.XXXXXX.txt)"
printf '%s\n' "${rows[@]}" > "$tmp"
kitty --class keybinds --title Keybinds less -S "$tmp"
exit 0
fi
printf '%s\n' "${rows[@]}"
-6
View File
@@ -1,6 +0,0 @@
#!/bin/bash
out_dir="$HOME/dotfiles/themes/.config/catppuccin/mocha.conf"
url="https://raw.githubusercontent.com/catppuccin/hyprland/main/themes/mocha.conf"
curl -o "$out_dir" "$url"
+3 -1
View File
@@ -3,7 +3,8 @@ map ctrl+shift+c copy_to_clipboard
map ctrl+shift+v paste_from_clipboard
copy_on_select yes
# Coloer theme
# Color theme: central theme (basic/.config/themes). themes/mocha.conf is a
# symlink into the central palette — edit colors there, never here.
include themes/mocha.conf
# Font
@@ -13,3 +14,4 @@ italic_font auto
bold_italic_font auto
font_size 10.0
include themes/noctalia.conf
-6
View File
@@ -1,6 +0,0 @@
#!/bin/bash
out_dir="$HOME/dotfiles/themes/.config/themes/kitty/catppuccin/mocha.conf"
url="https://raw.githubusercontent.com/catppuccin/kitty/main/themes/mocha.conf"
curl -o "$out_dir" "$url"
-84
View File
@@ -1,84 +0,0 @@
# vim:ft=kitty
## name: Catppuccin Kitty Mocha
## author: Catppuccin Org
## license: MIT
## upstream: https://github.com/catppuccin/kitty/blob/main/themes/mocha.conf
## blurb: Soothing pastel theme for the high-spirited!
# The basic colors
foreground #cdd6f4
background #1e1e2e
selection_foreground #1e1e2e
selection_background #f5e0dc
# Cursor colors
cursor #f5e0dc
cursor_text_color #1e1e2e
# Scrollbar colors
scrollbar_handle_color #9399b2
scrollbar_track_color #45475a
# URL color when hovering with mouse
url_color #f5e0dc
# Kitty window border colors
active_border_color #b4befe
inactive_border_color #6c7086
bell_border_color #f9e2af
# OS Window titlebar colors
wayland_titlebar_color system
macos_titlebar_color system
# Tab bar colors
active_tab_foreground #11111b
active_tab_background #cba6f7
inactive_tab_foreground #cdd6f4
inactive_tab_background #181825
tab_bar_background #11111b
# Colors for marks (marked text in the terminal)
mark1_foreground #1e1e2e
mark1_background #b4befe
mark2_foreground #1e1e2e
mark2_background #cba6f7
mark3_foreground #1e1e2e
mark3_background #74c7ec
# The 16 terminal colors
# black
color0 #45475a
color8 #585b70
# red
color1 #f38ba8
color9 #f38ba8
# green
color2 #a6e3a1
color10 #a6e3a1
# yellow
color3 #f9e2af
color11 #f9e2af
# blue
color4 #89b4fa
color12 #89b4fa
# magenta
color5 #f5c2e7
color13 #f5c2e7
# cyan
color6 #94e2d5
color14 #94e2d5
# white
color7 #bac2de
color15 #a6adc8
+1
View File
@@ -0,0 +1 @@
../../../../basic/.config/themes/themes/catppuccin-mocha/kitty.conf
+66
View File
@@ -0,0 +1,66 @@
# Portable Noctalia config — generated by noctalia-sync-from-gui.sh.
# Validate with: noctalia config validate ~/.config/noctalia/config.toml
[bar.default]
background_opacity = 0.52
capsule = false
center = []
end = []
margin_ends = 0
panel_overlap = 0
position = "bottom"
radius = 0
start = []
thickness = 28
[dock]
background_opacity = 0.68
[lockscreen_widgets]
enabled = false
schema_version = 2
[shell]
font_family = "JetBrainsMono Nerd Font Mono"
[shell.panel]
launcher_placement = "attached"
transparency_mode = "glass"
[theme]
mode = "dark"
builtin = "Catppuccin"
[theme.templates]
enable_builtin_templates = true
builtin_ids = []
[wallpaper]
directory = ""
[idle]
behavior_order = ["backlight-dim", "kbd-off", "lock", "screen-off", "suspend"]
[idle.behavior.backlight-dim]
timeout = 300
action = "command"
command = "brightnessctl -s set 10"
resume_command = "brightnessctl -r"
[idle.behavior.kbd-off]
timeout = 300
action = "command"
command = "brightnessctl -sd rgb:kbd_backlight set 0"
resume_command = "brightnessctl -rd rgb:kbd_backlight"
[idle.behavior.lock]
timeout = 900
action = "lock"
[idle.behavior.screen-off]
timeout = 1800
action = "screen_off"
[idle.behavior.suspend]
timeout = 2700
action = "lock_and_suspend"
-230
View File
@@ -1,230 +0,0 @@
// -*- mode: jsonc -*-
{
"custom/gpu": {
"format": "{text}",
"tooltip": false,
"exec": "~/.config/waybar/scripts/gpu-info.sh",
"exec-interval": 1,
"return-type": "json"
},
// "layer": "top", // Waybar at top layer
"position": "bottom", // Waybar position (top|bottom|left|right)
"height": 30, // Waybar height (to be removed for auto height)
// "width": 800, // Waybar width
"spacing": 4, // Gaps between modules (4px)
// Choose the order of the modules
"modules-left": [
"hyprland/workspaces"
//"hyprland/mode",
//"hyprland/scratchpad",
//"custom/media"
],
"modules-center": [
"hyprland/window"
],
"modules-right": [
"mpd",
"idle_inhibitor",
"pulseaudio",
//"network",
//"power-profiles-daemon",
"cpu",
"memory",
"temperature",
"backlight",
"keyboard-state",
//"hyprland/language",
"battery",
//"battery#bat2",
"custom/gpu",
"clock",
"tray",
"custom/power"
],
// Modules configuration
"hyprland/workspaces": {
"disable-scroll": true,
"all-outputs": true,
"warp-on-scroll": true,
"format": "{name}: {icon}",
"format-icons": {
// "1": "",
// "2": "",
// "3": "",
// "4": "",
// "5": "",
// "urgent": "",
"active": "",
"default": ""
}
},
"keyboard-state": {
"numlock": true,
"capslock": true,
"format": "{name} {icon}",
"format-icons": {
"locked": "",
"unlocked": ""
}
},
"hyprland/mode": {
"format": "<span style=\"italic\">{}</span>"
},
"hyprland/scratchpad": {
"format": "{icon} {count}",
"show-empty": false,
"format-icons": ["", ""],
"tooltip": true,
"tooltip-format": "{app}: {title}"
},
"mpd": {
"format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {volume}% ",
"format-disconnected": "Disconnected ",
"format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ",
"unknown-tag": "N/A",
"interval": 5,
"consume-icons": {
"on": " "
},
"random-icons": {
"off": "<span color=\"#f53c3c\"></span> ",
"on": " "
},
"repeat-icons": {
"on": " "
},
"single-icons": {
"on": "1 "
},
"state-icons": {
"paused": "",
"playing": ""
},
"tooltip-format": "MPD (connected)",
"tooltip-format-disconnected": "MPD (disconnected)"
},
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
"activated": "",
"deactivated": ""
}
},
"tray": {
// "icon-size": 21,
"spacing": 10//,
// "icons": {
// "blueman": "bluetooth",
// "TelegramDesktop": "$HOME/.local/share/icons/hicolor/16x16/apps/telegram.png"
// }
},
"clock": {
"format": "{:%Y-%m-%d %H:%M}",
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
"on-click": "~/.config/waybar/scripts/copy-date.sh"
//"format-alt": "{:%Y-%m-%d}"
},
"cpu": {
"interval": 1,
"format": "cpu:{usage:02}%@{avg_frequency:4.2f}MHz",
"tooltip": false
},
"memory": {
"interval": 1,
"format": "mem:{:02}%"
},
"temperature": {
// "thermal-zone": 2,
// "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input",
"critical-threshold": 80,
// "format-critical": "{temperatureC}°C {icon}",
"format": "{temperatureC}°C {icon}",
"format-icons": ["", "", ""]
},
"backlight": {
// "device": "acpi_video1",
"format": "{percent}% {icon}",
"format-icons": ["", "", "", "", "", "", "", "", ""]
},
"battery": {
"states": {
// "good": 95,
"warning": 30,
"critical": 15
},
"format": "{capacity}% {icon}",
"format-full": "{capacity}% {icon}",
"format-charging": "{capacity}% ",
"format-plugged": "{capacity}% ",
"format-alt": "{time} {icon}",
// "format-good": "", // An empty format will hide the module
// "format-full": "",
"format-icons": ["", "", "", "", ""]
},
"battery#bat2": {
"bat": "BAT2"
},
"power-profiles-daemon": {
"format": "{icon}",
"tooltip-format": "Power profile: {profile}\nDriver: {driver}",
"tooltip": true,
"format-icons": {
"default": "",
"performance": "",
"balanced": "",
"power-saver": ""
}
},
"network": {
// "interface": "wlp2*", // (Optional) To force the use of this interface
"format-wifi": "{essid} ({signalStrength}%) ",
"format-ethernet": "{ipaddr}/{cidr} ",
"tooltip-format": "{ifname} via {gwaddr} ",
"format-linked": "{ifname} (No IP) ",
"format-disconnected": "Disconnected ⚠",
"format-alt": "{ifname}: {ipaddr}/{cidr}"
},
"pulseaudio": {
// "scroll-step": 1, // %, can be a float
"format": "{volume}% {icon} {format_source}",
"format-bluetooth": "{volume}% {icon} {format_source}",
"format-bluetooth-muted": " {icon} {format_source}",
"format-muted": " {format_source}",
"format-source": "{volume}% ",
"format-source-muted": "",
"format-icons": {
"headphone": "",
"hands-free": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
"default": ["", "", ""]
},
"on-click": "pavucontrol"
},
"custom/media": {
"format": "{icon} {text}",
"return-type": "json",
"max-length": 40,
"format-icons": {
"spotify": "",
"default": "🎜"
},
"escape": true,
"exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder
// "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name
},
"custom/power": {
"format" : "⏻ ",
"tooltip": false,
"menu": "on-click",
"menu-file": "$HOME/.config/waybar/power_menu.xml", // Menu file in resources folder
"menu-actions": {
"shutdown": "shutdown",
"reboot": "reboot",
"suspend": "systemctl suspend",
"hibernate": "systemctl hibernate"
}
}
}
-4
View File
@@ -1,4 +0,0 @@
#!/usr/bin/env bash
DATE=$(date +"%Y-%m-%d_%H%M")
echo -n "$DATE" | wl-copy
notify-send "Date copied" "$DATE"
-23
View File
@@ -1,23 +0,0 @@
#!/bin/bash
# GPU monitoring for waybar (AMD radeontop + sysfs temp)
GPU_DATA=$(timeout 1 radeontop -d - -l 1 2>/dev/null | tail -1)
if [ -z "$GPU_DATA" ]; then
echo "{\"text\": \"gpu:--\", \"tooltip\": \"Reading...\"}"
exit 0
fi
GPU=$(echo "$GPU_DATA" | grep -oP 'gpu \K[0-9.]+' | head -1)
GPU_INT=${GPU%.*}
VRAM=$(echo "$GPU_DATA" | grep -oP 'vram [\d.]+% \K[\d.]+' | head -1)
VRAM_INT=${VRAM%.*}
SCLK=$(echo "$GPU_DATA" | grep -oP 'sclk [\d.]+% \K[\d.]+' | head -1)
MCLK=$(echo "$GPU_DATA" | grep -oP 'mclk [\d.]+% \K[\d.]+' | head -1)
TEMP=$(( $(cat /sys/class/hwmon/hwmon2/temp1_input) / 1000 ))
POWER=$(( $(cat /sys/class/hwmon/hwmon2/power1_average) / 1000 ))
echo "{\"text\": \"gpu:${GPU_INT}% ${VRAM_INT}MB ${TEMP}C\", \"tooltip\": \"GPU: ${GPU}%\\nVRAM: ${VRAM}MB\\nTemp: ${TEMP}C\\nPower: ${POWER}W\\nSCLK: ${SCLK}GHz\\nMCLK: ${MCLK}GHz\"}"
-236
View File
@@ -1,236 +0,0 @@
/* -------------------------------------------------
Calm Glass (Hyprland / Waybar) — GTK CSS safe
-------------------------------------------------- */
* {
font-family: "JetBrainsMono Nerd Font", FontAwesome, sans-serif;
font-size: 13px;
}
/* ---------- GTK Color Definitions ---------- */
@define-color fg rgba(235, 238, 242, 0.92);
@define-color fg-dim rgba(235, 238, 242, 0.72);
@define-color fg-muted rgba(235, 238, 242, 0.55);
@define-color glass rgba(18, 22, 30, 0.55);
@define-color glass_2 rgba(18, 22, 30, 0.32);
@define-color glass_3 rgba(18, 22, 30, 0.22);
@define-color stroke rgba(255, 255, 255, 0.12);
@define-color stroke_2 rgba(255, 255, 255, 0.07);
/* ---------- Waybar Container ---------- */
window#waybar {
background-color: @glass;
color: @fg;
border-bottom: 1px solid @stroke;
box-shadow: 0 10px 30px rgba(0,0,0,0.30);
transition-property: background-color, opacity;
transition-duration: .5s;
}
window#waybar.hidden {
opacity: 0.35;
}
/* ---------- Buttons / Workspaces ---------- */
button {
box-shadow: inset 0 -2px transparent;
border: none;
border-radius: 0;
}
button:hover {
background: inherit;
box-shadow: inset 0 -2px rgba(255,255,255,0.18);
}
#workspaces button {
padding: 0 8px;
margin: 4px 3px;
background-color: rgba(255,255,255,0.04);
color: @fg-dim;
border: 1px solid rgba(255,255,255,0.06);
border-radius: 10px;
}
#workspaces button:hover {
background: rgba(255,255,255,0.07);
color: @fg;
}
#workspaces button.focused,
#workspaces button.active {
background-color: rgba(255,255,255,0.10);
color: @fg;
border: 1px solid rgba(255,255,255,0.12);
box-shadow: inset 0 -2px rgba(255,255,255,0.18);
}
#workspaces button.urgent {
background-color: rgba(190,110,120,0.35);
border-color: rgba(190,110,120,0.50);
color: @fg;
}
#window,
#workspaces {
margin: 0 4px;
}
.modules-left > widget:first-child > #workspaces {
margin-left: 0;
}
.modules-right > widget:last-child > #workspaces {
margin-right: 0;
}
/* ---------- Common “Chip” module style ---------- */
#clock,
#battery,
#cpu,
#memory,
#disk,
#temperature,
#backlight,
#network,
#pulseaudio,
#wireplumber,
#custom-media,
#tray,
#mode,
#idle_inhibitor,
#scratchpad,
#power-profiles-daemon,
#mpd,
#language,
#keyboard-state,
#privacy,
#privacy-item {
padding: 0 10px;
color: @fg;
background-color: @glass_2;
border: 1px solid @stroke_2;
border-radius: 10px;
margin: 4px 4px;
}
#pulseaudio:hover,
#wireplumber:hover,
#network:hover,
#clock:hover {
background-color: @glass_3;
}
#clock {
border-color: rgba(140, 170, 190, 0.25);
}
/* Battery */
#battery.charging,
#battery.plugged {
background-color: rgba(120,170,140,0.22);
border-color: rgba(120,170,140,0.34);
}
@keyframes blink {
to {
background-color: rgba(190,110,120,0.18);
border-color: rgba(190,110,120,0.50);
}
}
#battery.critical:not(.charging) {
background-color: rgba(190,110,120,0.35);
border-color: rgba(190,110,120,0.55);
color: @fg;
animation-name: blink;
animation-duration: 0.6s;
animation-timing-function: steps(10);
animation-iteration-count: infinite;
animation-direction: alternate;
}
/* Network */
#network.disconnected {
background-color: rgba(190,110,120,0.30);
border-color: rgba(190,110,120,0.45);
}
/* Audio */
#pulseaudio:hover {
background-color: rgba(190,160,110,0.20);
border-color: rgba(190,160,110,0.28);
}
#pulseaudio.muted {
background-color: rgba(140,170,190,0.18);
border-color: rgba(140,170,190,0.26);
color: @fg-dim;
}
#wireplumber.muted {
background-color: rgba(190,110,120,0.28);
border-color: rgba(190,110,120,0.40);
}
/* Temperature */
#temperature.critical {
background-color: rgba(190,110,120,0.30);
border-color: rgba(190,110,120,0.45);
}
/* Tray */
#tray > .passive {
-gtk-icon-effect: dim;
}
#tray > .needs-attention {
-gtk-icon-effect: highlight;
background-color: rgba(190,110,120,0.30);
border-radius: 10px;
}
/* Idle inhibitor */
#idle_inhibitor.activated {
background-color: rgba(255,255,255,0.10);
border-color: rgba(255,255,255,0.14);
color: @fg;
}
/* Scratchpad */
#scratchpad {
background: rgba(255,255,255,0.05);
}
#scratchpad.empty {
background-color: transparent;
border-color: transparent;
}
/* Privacy */
#privacy {
padding: 0;
background-color: transparent;
border-color: transparent;
}
#privacy-item {
padding: 0 6px;
color: @fg;
}
#privacy-item.screenshare {
background-color: rgba(190,160,110,0.30);
border-color: rgba(190,160,110,0.40);
}
#privacy-item.audio-in {
background-color: rgba(120,170,140,0.25);
border-color: rgba(120,170,140,0.36);
}
#privacy-item.audio-out {
background-color: rgba(140,170,190,0.25);
border-color: rgba(140,170,190,0.36);
}
-6
View File
@@ -1,6 +0,0 @@
[default]
path = "~/.config/wpaperd/wallpapers/linked"
mode = "center"
#recursive = true
#sorting = "random"
#duration = "15m"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 975 KiB

+25
View File
@@ -0,0 +1,25 @@
# ---------------------------------------------------------------------------
# System package list for setup/basic/setup.sh
#
# Every other dotfile branch depends on these foundational packages
# (base system, display manager, audio stack, AUR helper).
# `basic` is always set up first in the Makefile.
#
# - Lines starting with '#' and blank lines are ignored.
# - Use "@pacman", "@aur" or "@npm" markers to switch section.
# - The default section is @pacman.
# ---------------------------------------------------------------------------
@pacman
firefox
cups
pipewire
pipewire-session-manager
qpwgraph
cifs-utils
less
git
ripgrep
fd
docker
man-db
+68
View File
@@ -0,0 +1,68 @@
#!/bin/bash
set -euo pipefail
SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SETUP_DIR/packages.txt"
# shellcheck source=../lib/common.sh
source "$SETUP_DIR/../lib/common.sh"
# ---------------------------------------------------------------------------
# Docker: Dienst aktivieren/starten, Benutzer in die docker-Gruppe aufnehmen
# und den Dienst verifizieren. (docker selbst wird ueber setup/basic/packages.txt
# als Pacman-Paket installiert.)
# ---------------------------------------------------------------------------
setup_docker() {
if ! command -v docker >/dev/null 2>&1; then
echo "Warnung: docker nicht installiert; ueberspringe Docker-Setup."
return
fi
echo "==> Aktiviere und starte Docker-Dienst ..."
sudo systemctl enable --now docker
# Bei Aufruf via `sudo <script>` ist SUDO_USER der eigentliche Benutzer.
local target_user="${SUDO_USER:-$USER}"
echo "==> Stelle sicher, dass $target_user in der docker-Gruppe ist ..."
if [[ "$target_user" == "root" ]] || id -nG "$target_user" 2>/dev/null | grep -qw docker; then
echo "Benutzer $target_user ist bereits in der docker-Gruppe."
else
sudo usermod -aG docker "$target_user"
echo "Benutzer $target_user zur docker-Gruppe hinzugefuegt; wirksam nach dem naechsten Login."
fi
echo "==> Pruefe Docker-Dienst ..."
if systemctl is-active --quiet docker; then
echo "Docker-Dienst laeuft (Socket: /var/run/docker.sock)."
else
echo "Warnung: Docker-Dienst laeuft nicht; pruefe mit: systemctl status docker"
fi
}
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
local -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
echo "==> Aktiviere multilib ..."
enable_multilib
echo "==> System aktualisieren ..."
sudo pacman -Syu
echo "==> Sicherstelle yay ..."
ensure_yay
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
echo "==> Richte Docker ein ..."
setup_docker
echo "Fertig. Die Basis-Systemumgebung ist eingerichtet."
}
main
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
# Refresh vendored upstream port files (setup/fetch-ports.sh).
#
# This script lives outside the stow packages (setup/) and is NOT run
# by the test harness: it contacts the network. Run it manually when you
# want to pull newer upstream Catppuccin ports into the central theme:
#
# bash setup/fetch-ports.sh
#
# The central palette (theme.lua / theme.css roles / hypr.conf) remains the
# source of truth; after fetching, re-apply the provenance headers and the
# role-alias block at the end of theme.css if upstream overwrote them.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DEST="$SCRIPT_DIR/../basic/.config/themes/themes/catppuccin-mocha"
# Pinned upstream revisions (bump deliberately, then run this script).
KITTY_PIN="main"
curl -fsSL "https://raw.githubusercontent.com/catppuccin/kitty/${KITTY_PIN}/themes/mocha.conf" \
-o "$DEST/kitty.conf"
echo "ports refreshed into $DEST"
echo "reminder: re-apply file headers + theme.css role aliases, then run scripts/sync-theme.sh"
+32
View File
@@ -0,0 +1,32 @@
# ---------------------------------------------------------------------------
# Hyprland compositor package list for setup/hypr/setup.sh
#
# Wayland compositor, screenshot tool and supporting utilities. The desktop
# shell (bar, launcher, notifications, lock screen, wallpaper, idle, session
# menu) on this branch is Caelestia (see hypr/.config/hypr/hyprland.lua:
# `caelestia shell -d`). Noctalia lives on main.
#
# - Lines starting with '#' and blank lines are ignored.
# - Use "@pacman", "@aur" or "@npm" markers to switch section.
# - The default section is @pacman.
# ---------------------------------------------------------------------------
@pacman
hyprland
hypridle
xdg-desktop-portal-hyprland
hyprpolkitagent
pantheon-shortcut-overlay
wev
wl-clipboard
hyprshot
brightnessctl
wtype
@aur
hyprmod
caelestia-shell
caelestia-cli
quickshell-git
hyprsaver
python-terminaltexteffects
+43
View File
@@ -0,0 +1,43 @@
#!/bin/bash
set -euo pipefail
SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SETUP_DIR/packages.txt"
# shellcheck source=../lib/common.sh
source "$SETUP_DIR/../lib/common.sh"
# ---------------------------------------------------------------------------
# Post-install: run Hyprland environment & desktop integration scripts.
# ---------------------------------------------------------------------------
run_hypr_scripts() {
local scripts_dir
scripts_dir="$(repo_root)/hypr/.config/hypr/scripts"
echo "==> Fuehre ensure-env.sh aus ..."
bash "$scripts_dir/ensure-env.sh"
echo "==> Fuehre portal-host-override.sh aus ..."
bash "$scripts_dir/portal-host-override.sh"
echo "==> Fuehre fix_dolphin_file_associations.sh aus ..."
bash "$scripts_dir/fix_dolphin_file_associations.sh"
}
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
local -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
run_hypr_scripts
echo "Fertig. Hyprland und das Compositor-Okosystem sind eingerichtet."
}
main
+24
View File
@@ -0,0 +1,24 @@
# ---------------------------------------------------------------------------
# Kreation package list for setup/kreation/setup.sh
#
# DAW, video and audio-plugin runtime.
#
# - Lines starting with '#' and blank lines are ignored.
# - Use "@pacman", "@aur" or "@npm" markers to switch section.
# - The default section is @pacman.
# ---------------------------------------------------------------------------
@pacman
reaper
guitarix
kdenlive
yabridge
yabridgectl
obs-studio
surge-xt
lsp-plugins
calf
dragonfly-reverb
@aur
numaplayer
+24
View File
@@ -0,0 +1,24 @@
#!/bin/bash
set -euo pipefail
SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SETUP_DIR/packages.txt"
# shellcheck source=../lib/common.sh
source "$SETUP_DIR/../lib/common.sh"
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
local -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
echo "Fertig. Kreation-Pakete (DAW, Video, Plugins) sind eingerichtet."
}
main
+124
View File
@@ -0,0 +1,124 @@
#!/bin/bash
# setup/lib/common.sh
#
# Shared helpers for the setup/install scripts under setup/.
# Source this file; do not execute it directly:
#
# SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# # shellcheck source=../lib/common.sh
# source "$SETUP_DIR/../lib/common.sh"
#
# Conventions:
# - The caller owns `set -euo pipefail` and PACKAGES_FILE.
# - Package lists use @pacman (default) / @aur / @npm section markers;
# '#' starts a comment, blank lines are ignored.
# - Set NPM_USE_SUDO=1 before calling install_npm_pkgs when the global
# npm root is root-owned (Arch installs npm to /usr/lib/node_modules).
# Print the repository root (setup/lib/ -> repo root).
repo_root() {
cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd
}
log() {
echo "==> $*"
}
# ---------------------------------------------------------------------------
# Read a packages.txt file, split into pacman / aur / npm sections.
# Usage: read_packages <file> <pacman_array> <aur_array> <npm_array>
# ---------------------------------------------------------------------------
read_packages() {
local file="$1" pacman_ref="$2" aur_ref="$3" npm_ref="$4"
local section="pacman"
local line current
local -n _pacman="$pacman_ref" _aur="$aur_ref" _npm="$npm_ref"
while IFS= read -r line || [[ -n "$line" ]]; do
current="${line%%#*}"
current="${current##*( )}"
current="${current%%*( )}"
[[ -z "$current" ]] && continue
case "$current" in
@pacman) section="pacman" ;;
@aur) section="aur" ;;
@npm) section="npm" ;;
*)
case "$section" in
pacman) _pacman+=("$current") ;;
aur) _aur+=("$current") ;;
npm) _npm+=("$current") ;;
esac
;;
esac
done < "$file"
}
# ---------------------------------------------------------------------------
# Install sections (arrays passed by nameref).
# ---------------------------------------------------------------------------
install_pacman_pkgs() {
local -n _pkgs="$1"
if ((${#_pkgs[@]})); then
log "Installiere Pacman-Pakete: ${_pkgs[*]}"
yay -S --needed "${_pkgs[@]}"
fi
}
install_aur_pkgs() {
local -n _pkgs="$1"
if ((${#_pkgs[@]})); then
log "Installiere AUR-Pakete: ${_pkgs[*]}"
yay -S --needed "${_pkgs[@]}"
fi
}
install_npm_pkgs() {
local -n _pkgs="$1"
if ((${#_pkgs[@]})); then
log "Installiere globale npm-Pakete: ${_pkgs[*]}"
if [[ "${NPM_USE_SUDO:-0}" == "1" ]]; then
sudo npm install -g "${_pkgs[@]}"
else
npm install -g "${_pkgs[@]}"
fi
fi
}
# Install all three sections at once.
install_all_pkgs() {
install_pacman_pkgs "$1"
install_aur_pkgs "$2"
install_npm_pkgs "$3"
}
# ---------------------------------------------------------------------------
# Enable multilib in /etc/pacman.conf (with a safety backup).
# ---------------------------------------------------------------------------
enable_multilib() {
sudo sed -i.bak '/^#\[multilib\]/,+1 s/^#//' /etc/pacman.conf
}
# ---------------------------------------------------------------------------
# Ensure yay (AUR helper) is installed.
# ---------------------------------------------------------------------------
ensure_yay() {
if pacman -Q yay &>/dev/null; then
echo "yay bereits installiert; fahre fort."
return
fi
if pacman -Si yay &>/dev/null; then
echo "Installiere yay mit pacman ..."
sudo pacman -S --needed yay
return
fi
echo "installiere yay via git ..."
sudo pacman -S --needed base-devel git
local tmp
tmp="$(mktemp -d)"
git clone https://aur.archlinux.org/yay.git "$tmp/yay"
(
cd "$tmp/yay"
makepkg -si
)
rm -rf "$tmp"
}
@@ -1,8 +1,9 @@
#!/bin/bash
retry() {
local N=$1; shift
local t=$2; shift
for i in $(seq 1 $N); do
for _ in $(seq 1 $N); do
"$@" && return 0 || sleep $t
done
return 1
+45
View File
@@ -0,0 +1,45 @@
# ---------------------------------------------------------------------------
# Terminal package list for setup/term/setup.sh
#
# Maintenance:
# - Add / remove packages on separate lines.
# - Lines starting with '#' and blank lines are ignored.
# - Use "@pacman", "@aur" or "@npm" markers to switch section.
# - The default section is @pacman.
# ---------------------------------------------------------------------------
@pacman
fish
extra/kitty
neovim
openssh
rclone
rsync
unison
stow
nodejs
npm
starship
fastfetch
tree-sitter-cli
python
python-pip
unzip
ruff
python-ruff
python-debugpy
chromium
selene
tmux
yazi
zoxide
fzf
locate
ttf-jetbrains-mono-nerd
ttf-font-awesome
@aur
opencode
@npm
eslint_d
+107
View File
@@ -0,0 +1,107 @@
#!/bin/bash
set -euo pipefail
SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SETUP_DIR/packages.txt"
# shellcheck source=../lib/common.sh
source "$SETUP_DIR/../lib/common.sh"
# Arch installiert npm nach /usr/lib/node_modules (root-owned),
# daher braucht der globale Install sudo.
NPM_USE_SUDO=1
# ---------------------------------------------------------------------------
# Post-install configuration.
# ---------------------------------------------------------------------------
set_fish_default_shell() {
if command -v fish >/dev/null 2>&1; then
if [[ "$SHELL" != "/usr/bin/fish" ]]; then
echo "Setze fish als Standard-Shell ..."
chsh -s /usr/bin/fish
else
echo "fish ist bereits die Standard-Shell."
fi
else
echo "Warnung: fish wurde nicht installiert; ueberspringe chsh."
fi
}
install_tmuxifier() {
if [[ -d "$HOME/.tmuxifier" ]]; then
echo "tmuxifier bereits installiert; fahre fort."
else
echo "Klone tmuxifier ..."
git clone https://github.com/jimeh/tmuxifier.git "$HOME/.tmuxifier"
fi
}
install_tmux_tpm() {
if [[ -x "$HOME/.config/tmux/plugins/tpm/tpm" ]]; then
echo "tmux TPM bereits installiert; fahre fort."
else
echo "Klone tmux TPM ..."
mkdir -p "$HOME/.config/tmux/plugins"
git clone https://github.com/tmux-plugins/tpm "$HOME/.config/tmux/plugins/tpm"
fi
}
install_tmux_plugins() {
local tpm_install="$HOME/.config/tmux/plugins/tpm/bin/install_plugins"
if ! command -v tmux >/dev/null 2>&1; then
echo "Warnung: tmux nicht installiert; ueberspringe Plugin-Installation (C-Space I beim ersten Start)."
return 0
fi
if ! command -v git >/dev/null 2>&1; then
echo "Warnung: git nicht installiert; ueberspringe tmux Plugin-Installation."
return 0
fi
if [[ ! -f "$HOME/.config/tmux/tmux.conf" ]]; then
echo "tmux.conf noch nicht verlinkt (stow laeuft nach setup.sh); Plugins werden beim ersten tmux-Start bzw. Re-Run installiert (C-Space I)."
return 0
fi
if [[ ! -x "$tpm_install" ]]; then
echo "Warnung: TPM install_plugins nicht gefunden; ueberspringe tmux Plugin-Installation."
return 0
fi
echo "Installiere tmux-Plugins via TPM ..."
"$tpm_install"
}
add_yazi_git_plugin() {
if command -v yazi >/dev/null 2>&1 && command -v ya >/dev/null 2>&1; then
if ya pkg list 2>/dev/null | grep -q 'yazi-rs/plugins:git'; then
echo "yazi git-Plugin bereits installiert; fahre fort."
else
echo "Fuege yazi git-Plugin hinzu ..."
ya pkg add yazi-rs/plugins:git
fi
fi
}
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
local -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
# Hinweis: multilib, yay und das System-Update werden von
# setup/basic/setup.sh uebernommen (laeuft vor term im Makefile).
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
set_fish_default_shell
install_tmuxifier
install_tmux_tpm
install_tmux_plugins
add_yazi_git_plugin
echo "==> Aktualisiere locate-Datenbank ..."
sudo updatedb
echo "Fertig. Starte ein neues Terminal, damit fish und die Umgebung greifen."
}
main
+22
View File
@@ -0,0 +1,22 @@
# ---------------------------------------------------------------------------
# Standalone desktop utility package list for setup/utils/setup.sh
#
# Programs that are not core to every branch, but are expected on a full
# desktop: office / web / mail / native-app replacements (Wine), the
# Nextcloud sync client, etc.
#
# - Lines starting with '#' and blank lines are ignored.
# - Use "@pacman", "@aur" or "@npm" markers to switch section.
# - The default section is @pacman.
# ---------------------------------------------------------------------------
@pacman
nextcloud-client
thunderbird
ktouch
ktorrent
wine
wine-mono
wine-gecko
winetricks
rbw
+24
View File
@@ -0,0 +1,24 @@
#!/bin/bash
set -euo pipefail
SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SETUP_DIR/packages.txt"
# shellcheck source=../lib/common.sh
source "$SETUP_DIR/../lib/common.sh"
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
local -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
echo "Fertig. Standalone Utilities sind eingerichtet."
}
main
+9 -1
View File
@@ -37,4 +37,12 @@ fi
export DATAFLEX_BACKEND_REPO="/c/_Master/202602 DataFleX/repos/flexibility_platform_backend/"
export PATH="$HOME/.local/bin:$PATH"
. "$HOME/.cargo/env"
# Central theme (basic/.config/themes): single source of truth for colors.
if [ -f "$HOME/.config/themes/current/theme.env.sh" ]; then
. "$HOME/.config/themes/current/theme.env.sh"
fi
if command -v fastfetch >/dev/null 2>&1; then
fastfetch --config ~/.config/fastfetch/config.jsonc
fi
-50
View File
@@ -42,36 +42,11 @@
"key": "├─󰍹",
"keyColor": "green"
},
{
"type": "brightness",
"key": "├─󰃞",
"keyColor": "green"
},
{
"type": "battery",
"key": "├─",
"keyColor": "green"
},
{
"type": "poweradapter",
"key": "├─",
"keyColor": "green"
},
{
"type": "gamepad",
"key": "├─",
"keyColor": "green"
},
{
"type": "bluetooth",
"key": "├─",
"keyColor": "green"
},
{
"type": "sound",
"key": "╰─",
"keyColor": "green"
},
"break",
{
@@ -104,21 +79,6 @@
"key": "├─",
"keyColor": "yellow"
},
{
"type": "theme",
"key": "├─󰉼",
"keyColor": "yellow"
},
{
"type": "icons",
"key": "├─󰀻",
"keyColor": "yellow"
},
{
"type": "wallpaper",
"key": "╰─󰸉",
"keyColor": "yellow"
},
"break",
{
@@ -137,21 +97,11 @@
"key": "├─",
"keyColor": "blue"
},
{
"type": "packages",
"key": "├─󰏖",
"keyColor": "blue"
},
{
"type": "uptime",
"key": "├─󰅐",
"keyColor": "blue"
},
{
"type": "media",
"key": "├─󰝚",
"keyColor": "blue"
},
{
"type": "localip",
"key": "├─󰩟",
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
for f in ~/.config/fastfetch/*.jsonc; do
echo "=== $f ==="
fastfetch --config "$f"
read -p "Enter for next..."
done
+10 -2
View File
@@ -1,15 +1,22 @@
# Central theme (basic/.config/themes): single source of truth for colors.
if test -f ~/.config/themes/current/theme.fish
source ~/.config/themes/current/theme.fish
end
# Enable OpenCode web search via Exa AI
set -gx OPENCODE_ENABLE_EXA 1
if status is-interactive
starship init fish | source
set -g fish_prompt_pwd_dir_length 0
# fastfetch
if type -q fastfetch
fastfetch --config ~/.config/fastfetch/config.jsonc
end
end
# Added by LM Studio CLI (lms)
set -gx PATH $PATH /home/mathias/.lmstudio/bin
set -gx PATH $PATH $HOME/.lmstudio/bin
# End of LM Studio CLI section
export EDITOR=nvim
@@ -133,3 +140,4 @@ export ROCM_PATH=/opt/rocm
export HSA_OVERRIDE_GFX_VERSION=11.0.0
export HIP_VISIBLE_DEVICES=0
fish_add_path -m $HOME/.local/bin
@@ -1,136 +0,0 @@
function fish_prompt
# This prompt shows:
# - green lines if the last return command is OK, red otherwise
# - your user name, in red if root or yellow otherwise
# - your hostname, in cyan if ssh or blue otherwise
# - the current path (with prompt_pwd)
# - date +%X
# - the current virtual environment, if any
# - the current git status, if any, with fish_git_prompt
# - the current battery state, if any, and if your power cable is unplugged, and if you have "acpi"
# - current background jobs, if any
# It goes from:
# ┬─[nim@Hattori:~]─[11:39:00]
# ╰─>$ echo here
# To:
# ┬─[nim@Hattori:~/w/dashboard]─[11:37:14]─[V:django20]─[G:master↑1|●1✚1…1]─[B:85%, 05:41:42 remaining]
# │ 2 15054 0% arrêtée sleep 100000
# │ 1 15048 0% arrêtée sleep 100000
# ╰─>$ echo there
set -l retc red
test $status = 0; and set retc green
set -q __fish_git_prompt_showupstream
or set -g __fish_git_prompt_showupstream auto
function _nim_prompt_wrapper
set retc $argv[1]
set -l field_name $argv[2]
set -l field_value $argv[3]
set_color normal
set_color $retc
echo -n '─'
set_color -o green
echo -n '['
set_color normal
test -n $field_name
and echo -n $field_name:
set_color $retc
echo -n $field_value
set_color -o green
echo -n ']'
end
set_color $retc
echo -n '┬─'
set_color -o green
echo -n [
if functions -q fish_is_root_user; and fish_is_root_user
set_color -o red
else
set_color -o yellow
end
echo -n $USER
set_color -o white
echo -n @
if test -z "$SSH_CLIENT"
set_color -o blue
else
set_color -o cyan
end
echo -n (prompt_hostname)
set_color -o white
echo -n :(prompt_pwd)
set_color -o green
echo -n ']'
# Date
_nim_prompt_wrapper $retc '' (date +%X)
# Vi-mode
if test "$fish_key_bindings" = fish_vi_key_bindings
or test "$fish_key_bindings" = fish_hybrid_key_bindings
set -l mode
switch $fish_bind_mode
case default
set mode (set_color --bold red)N
case operator f F t T
set mode (set_color --bold cyan)N
case insert
set mode (set_color --bold green)I
case replace_one
set mode (set_color --bold green)R
case replace
set mode (set_color --bold cyan)R
case visual
set mode (set_color --bold magenta)V
end
set mode $mode(set_color normal)
_nim_prompt_wrapper $retc '' $mode
end
# Virtual Environment
set -q VIRTUAL_ENV_DISABLE_PROMPT
or set -g VIRTUAL_ENV_DISABLE_PROMPT true
set -q VIRTUAL_ENV
and _nim_prompt_wrapper $retc V (path basename "$VIRTUAL_ENV")
# git
set -l prompt_git (fish_git_prompt '%s')
test -n "$prompt_git"
and _nim_prompt_wrapper $retc G $prompt_git
# Battery status
type -q acpi
and acpi -a 2>/dev/null | string match -rq off
and _nim_prompt_wrapper $retc B (acpi -b | cut -d' ' -f 4-)
# New line
echo
# Background jobs
set_color normal
for job in (jobs)
set_color $retc
echo -n '│ '
set_color brown
echo $job
end
set_color normal
set_color $retc
echo -n '╰─>'
set_color -o red
echo -n '$ '
set_color normal
end
+17 -2
View File
@@ -125,6 +125,8 @@ A feature-rich Neovim setup optimized for Python, JSON, and CSV development.
| `K` | Show hover documentation |
| `<leader>rn` | Rename symbol |
| `<leader>ca` | Code actions / quick fixes |
| `<leader>fx` | Fix diagnostic under cursor |
| `<leader>fA` | Fix all source-level diagnostics |
| `<leader>e` | Show diagnostic error |
| `[d / ]d` | Previous/next diagnostic |
@@ -132,7 +134,7 @@ A feature-rich Neovim setup optimized for Python, JSON, and CSV development.
| Keymap | Action |
|--------|--------|
| `<leader>f` | Format file |
| `<leader>lf` | Format file |
### Git (Gitsigns)
@@ -181,7 +183,8 @@ A feature-rich Neovim setup optimized for Python, JSON, and CSV development.
## File Type Specifics
### Python (.py)
- **LSP**: Full autocompletion, type checking, goto definition
- **LSP**: Full autocompletion, type checking, goto definition, Ruff diagnostics and quick fixes
- **Linting**: Ruff LSP (fix with `<leader>fx`, or use `<leader>fA` for fix-all actions)
- **Formatting**: ruff format (fast), black (backup)
- **Debugging**: Set breakpoints with `F9`, run with `F5`
- **Indentation**: 4 spaces (Python convention)
@@ -192,6 +195,18 @@ A feature-rich Neovim setup optimized for Python, JSON, and CSV development.
- **Indentation**: 2 spaces
- **Folding**: JSON objects/arrays are foldable (`za` to toggle, `zM` to close all)
### Markdown (.md)
- **LSP**: Marksman for Markdown navigation and document features
- **Linting**: markdownlint diagnostics
- **Fixes**: `<leader>fx` or `<leader>ca` runs `markdownlint --fix` on the saved file
- **Formatting**: Prettier via `<leader>lf`
- **Note**: Only markdownlint rules that support automatic fixes can be changed automatically
### JavaScript/TypeScript/Vue
- **LSP**: TypeScript language features and ESLint diagnostics with quick fixes
- **Linting**: ESLint LSP (fix with `<leader>fx`, or use `<leader>fA` for fix-all actions)
- **Formatting**: Prettier via `<leader>lf`
### CSV (.csv)
- **Treesitter**: Syntax highlighting
- **No wrap**: Full row visibility
+66 -2
View File
@@ -49,13 +49,78 @@ require("diff-base")
-- ============================================================================
-- STEP 4: LSP KEYMAPS
-- ============================================================================
local function fix_markdownlint()
local bufnr = vim.api.nvim_get_current_buf()
local filename = vim.api.nvim_buf_get_name(bufnr)
local markdownlint = vim.fn.exepath("markdownlint")
if markdownlint == "" then
markdownlint = vim.fn.stdpath("data") .. "/mason/bin/markdownlint"
end
if vim.fn.executable(markdownlint) == 0 then
vim.notify("markdownlint is not installed", vim.log.levels.WARN)
return
end
if filename == "" then
vim.notify("Save the Markdown buffer before fixing it", vim.log.levels.WARN)
return
end
vim.cmd.write()
vim.fn.jobstart({ markdownlint, "--fix", filename }, {
buffer = bufnr,
on_exit = function(_, exit_code)
vim.schedule(function()
if exit_code ~= 0 then
vim.notify("markdownlint could not fix this file", vim.log.levels.WARN)
return
end
vim.cmd.checktime()
vim.notify("markdownlint fixes applied", vim.log.levels.INFO)
vim.defer_fn(function()
require("lint").try_lint()
end, 100)
end)
end,
})
end
vim.keymap.set("n", "gd", vim.lsp.buf.definition, { desc = "Go to definition" })
vim.keymap.set("n", "gD", vim.lsp.buf.declaration, { desc = "Go to declaration" })
vim.keymap.set("n", "gi", vim.lsp.buf.implementation, { desc = "Go to implementation" })
vim.keymap.set("n", "gr", vim.lsp.buf.references, { desc = "Show references" })
vim.keymap.set("n", "K", vim.lsp.buf.hover, { desc = "Show hover docs" })
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, { desc = "Rename symbol" })
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, { desc = "Code actions" })
vim.keymap.set("n", "<leader>ca", function()
if vim.bo.filetype == "markdown" then
fix_markdownlint()
return
end
vim.lsp.buf.code_action()
end, { desc = "Code actions / Markdown fixes" })
vim.keymap.set("n", "<leader>fx", function()
if vim.bo.filetype == "markdown" then
fix_markdownlint()
return
end
vim.lsp.buf.code_action({
context = {
diagnostics = vim.diagnostic.get(0, {
lnum = vim.fn.line(".") - 1,
}),
},
})
end, { desc = "Fix diagnostic" })
vim.keymap.set("n", "<leader>fA", function()
vim.lsp.buf.code_action({
apply = true,
context = {
only = { "source.fixAll" },
},
})
end, { desc = "Fix all diagnostics" })
vim.keymap.set("n", "<leader>e", vim.diagnostic.open_float, { desc = "Show diagnostic" })
vim.diagnostic.config({
@@ -138,4 +203,3 @@ vim.keymap.set("n", "<leader>ch", ":noh<CR>", { desc = "clear search highlightin
-- toggle word wrap
vim.keymap.set("n", "<leader>tw", ":set wrap!<CR>", { desc = "toggle word wrap" })
@@ -16,6 +16,7 @@ return {
{ "<leader>bp", "<Cmd>BufferLinePick<CR>", desc = "Pick buffer" },
{ "<leader>bc", "<Cmd>BufferLinePickClose<CR>", desc = "Pick buffer to close" },
{ "<leader>bx", "<Cmd>BufferLineCloseOthers<CR>", desc = "Close other buffers" },
{ "<leader>bq", "<Cmd>BufferLineCyclePrev<CR><Cmd>bdelete #<CR>", desc = "Close buffer and go left" },
},
opts = {
options = {
+5 -2
View File
@@ -4,7 +4,10 @@ return {
lazy = false,
priority = 1000,
config = function()
require("catppuccin").setup({ flavor = "mocha" })
vim.cmd.colorscheme("catppuccin")
-- Central theme (basic/.config/themes): flavor/colorscheme come from
-- $CATPPUCCIN_FLAVOR / $THEME_NVIM_COLORSCHEME so a future theme only
-- changes the central files (see themes/registry.conf).
require("catppuccin").setup({ flavor = os.getenv("CATPPUCCIN_FLAVOR") or "mocha" })
vim.cmd.colorscheme(os.getenv("THEME_NVIM_COLORSCHEME") or "catppuccin")
end,
}
@@ -44,14 +44,18 @@ return {
require("mason-lspconfig").setup({
ensure_installed = {
"pyright", -- Python
"ruff", -- Python linting and fixes
"eslint", -- JavaScript/TypeScript linting and fixes
"ts_ls", -- TypeScript/JavaScript
"vue_ls", -- Vue (Volar)
"jsonls", -- JSON
"yamlls", -- YAML
"marksman", -- Markdown
"html", -- HTML
"cssls", -- CSS
"bashls", -- Bash
"lua_ls", -- Lua
"rust_analyzer", -- Rust
--"stylua",
},
})
@@ -96,6 +100,25 @@ return {
},
})
-- Ruff provides Python lint diagnostics and quick fixes.
vim.lsp.config("ruff", {
filetypes = { "python" },
})
-- ESLint provides lint diagnostics and source-level fixes.
vim.lsp.config("eslint", {
filetypes = {
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue",
},
settings = {
workingDirectory = { mode = "auto" },
},
})
-- Type- and JavaScript
vim.lsp.config("ts_ls", {
filetypes = {
@@ -147,9 +170,19 @@ return {
-- filetypes and tsserver/request forwarding to ts_ls (hybrid mode)
vim.lsp.config("vue_ls", {})
-- Rust
vim.lsp.config("rust_analyzer", {
setting = {
["rust-analyzer"] = {
checkOnSave = { command = "clippy" },
},
},
})
-- Other languages
vim.lsp.config("jsonls", {})
vim.lsp.config("yamlls", {})
vim.lsp.config("marksman", {})
vim.lsp.config("html", {})
vim.lsp.config("cssls", {})
vim.lsp.config("bashls", {})
@@ -157,13 +190,17 @@ return {
-- Enable servers
vim.lsp.enable("lua_ls")
vim.lsp.enable("pyright")
vim.lsp.enable("ruff")
vim.lsp.enable("eslint")
vim.lsp.enable("ts_ls")
vim.lsp.enable("vue_ls")
vim.lsp.enable("jsonls")
vim.lsp.enable("yamlls")
vim.lsp.enable("marksman")
vim.lsp.enable("html")
vim.lsp.enable("cssls")
vim.lsp.enable("bashls")
vim.lsp.enable("rust_analyzer")
end,
},
}
@@ -20,6 +20,7 @@ return {
markdown = { "prettier" },
sh = { "shfmt" },
bash = { "shfmt" },
rust = { "rustfmt" },
},
})
+17 -22
View File
@@ -1,25 +1,20 @@
return {
"mfussenegger/nvim-lint",
config = function()
require("lint").linters_by_ft = {
javascript = { "eslint_d" },
javascriptreact = { "eslint_d" },
typescript = { "eslint_d" },
typescriptreact = { "eslint_d" },
vue = { "eslint_d" },
python = { "ruff" },
-- lua = { "selene" }, -- Disabled: lua_ls provides diagnostics
sh = { "shellcheck" },
bash = { "shellcheck" },
json = { "jsonlint" },
yaml = { "yamllint" },
markdown = { "markdownlint" },
}
"mfussenegger/nvim-lint",
config = function()
require("lint").linters_by_ft = {
-- lua = { "selene" }, -- Disabled: lua_ls provides diagnostics
sh = { "shellcheck" },
bash = { "shellcheck" },
json = { "jsonlint" },
yaml = { "yamllint" },
markdown = { "markdownlint" },
rust = { "clippy" },
}
vim.api.nvim_create_autocmd({ "BufWritePost" }, {
callback = function()
require("lint").try_lint()
end,
})
end,
vim.api.nvim_create_autocmd({ "BufWritePost", "BufEnter", "InsertLeave" }, {
callback = function()
require("lint").try_lint()
end,
})
end,
}
@@ -52,6 +52,7 @@ return {
"bash",
"markdown",
"markdown_inline",
"rust",
}
-- Install parsers
+79 -29
View File
@@ -3,49 +3,99 @@
"default_agent": "plan",
"provider": {
"lsp": {
"pyright": {
"command": ["pyright-langserver", "--stdio"],
"extensions": [".py"]
},
"typescript": {
"command": ["typescript-language-server", "--stdio"],
"extensions": [".js", ".jsx", ".mjs", ".cjs", ".ts", ".tsx"]
},
"vue": {
"command": ["vue-language-server", "--stdio"],
"extensions": [".vue"]
},
"rust": {
"command": ["rust-analyzer"],
"extensions": [".rs"]
},
"bash": {
"command": ["bash-language-server", "start"],
"extensions": [".sh", ".bash"]
},
"json": {
"command": ["vscode-json-language-server", "--stdio"],
"extensions": [".json", ".jsonc"]
},
"yaml": {
"command": ["yaml-language-server", "--stdio"],
"extensions": [".yaml", ".yml"]
},
"html": {
"command": ["vscode-html-language-server", "--stdio"],
"extensions": [".html", ".htm"]
},
"css": {
"command": ["vscode-css-language-server", "--stdio"],
"extensions": [".css", ".scss", ".less"]
},
"go": {
"command": ["gopls", "serve"],
"extensions": [".go"]
},
"clangd": {
"command": ["clangd"],
"extensions": [".c", ".h", ".cc", ".cpp", ".cxx", ".hpp"]
},
"lua": {
"command": ["lua-language-server"],
"extensions": [".lua"]
},
"markdown": {
"command": ["marksman", "server"],
"extensions": [".md", ".markdown"]
}
},
"providers": {
"lmstudio": {
"npm": "@ai-sdk/openai-compatible",
"name": "LM Studio (local)",
"options": {
"baseURL": "http://127.0.0.1:1234/v1"
"baseURL": "http://192.168.0.4:1234/v1"
},
"models": {
"google/gemma-3-4b": {
"name": "google/gemma-3-4b"
"qwen3.5-35b-a3b": {
"name": "qwen3.5-35b-a3b"
},
"qwen/qwen3.8-27b": {
"name": "qwen/qwen3.8-27b"
},
"google/gemma-4-26b-a4b": {
"name": "google/gemma-4-26b-a4b"
},
"mistralai/ministral-3-14b-reasoning": {
"name": "mistralai/ministral-3-14b-reasoning"
"qwen/qwen3-4b-thinking-2507": {
"name": "qwen/qwen3-4b-thinking-2507"
},
"openai/gpt-oss-20b": {
"name": "openai/gpt-oss-20b"
"qwen2.5-coder-1.5b-instruct": {
"name": "qwen2.5-coder-1.5b-instruct"
},
"google/gemma-4-e4b": {
"name": "google/gemma-4-e4b"
},
"qwen/qwen3.5-9b": {
"name": "qwen/qwen3.5-9b"
}
}
}
},
"permission": {
"bash": "allow",
"read": "allow",
"write": "ask",
"edit": "ask",
"glob": "allow",
"grep": "allow",
"list": "allow",
"webfetch": "allow",
"websearch": "allow",
"question": "allow",
"todoread": "allow",
"todowrite": "allow",
"skill": "allow",
"patch": "allow",
"lsp": "allow"
},
"experimental": {
"lsp": true
}
"permissions": [
{
"action": "edit",
"resource": "*",
"effect": "ask"
}
]
}
+2
View File
@@ -0,0 +1,2 @@
[lint]
ignore = ["EXE002"]
+5 -83
View File
@@ -169,6 +169,11 @@ show_notifications = true
min_time_to_notify = 45000
min_time = 0
# Central theme note: starship has no `include` mechanism, so this palette is
# a declared mirror of basic/.config/themes/themes/catppuccin-mocha (see
# theme.env.sh / theme.css for the source of truth). Only the active
# palette is kept here; switch flavors by replacing this block from the
# central theme (scripts/switch-theme.sh reminds you). Do not hand-edit hex.
[palettes.catppuccin_mocha]
rosewater = "#f5e0dc"
flamingo = "#f2cdcd"
@@ -197,86 +202,3 @@ base = "#1e1e2e"
mantle = "#181825"
crust = "#11111b"
[palettes.catppuccin_frappe]
rosewater = "#f2d5cf"
flamingo = "#eebebe"
pink = "#f4b8e4"
mauve = "#ca9ee6"
red = "#e78284"
maroon = "#ea999c"
peach = "#ef9f76"
yellow = "#e5c890"
green = "#a6d189"
teal = "#81c8be"
sky = "#99d1db"
sapphire = "#85c1dc"
blue = "#8caaee"
lavender = "#babbf1"
text = "#c6d0f5"
subtext1 = "#b5bfe2"
subtext0 = "#a5adce"
overlay2 = "#949cbb"
overlay1 = "#838ba7"
overlay0 = "#737994"
surface2 = "#626880"
surface1 = "#51576d"
surface0 = "#414559"
base = "#303446"
mantle = "#292c3c"
crust = "#232634"
[palettes.catppuccin_latte]
rosewater = "#dc8a78"
flamingo = "#dd7878"
pink = "#ea76cb"
mauve = "#8839ef"
red = "#d20f39"
maroon = "#e64553"
peach = "#fe640b"
yellow = "#df8e1d"
green = "#40a02b"
teal = "#179299"
sky = "#04a5e5"
sapphire = "#209fb5"
blue = "#1e66f5"
lavender = "#7287fd"
text = "#4c4f69"
subtext1 = "#5c5f77"
subtext0 = "#6c6f85"
overlay2 = "#7c7f93"
overlay1 = "#8c8fa1"
overlay0 = "#9ca0b0"
surface2 = "#acb0be"
surface1 = "#bcc0cc"
surface0 = "#ccd0da"
base = "#eff1f5"
mantle = "#e6e9ef"
crust = "#dce0e8"
[palettes.catppuccin_macchiato]
rosewater = "#f4dbd6"
flamingo = "#f0c6c6"
pink = "#f5bde6"
mauve = "#c6a0f6"
red = "#ed8796"
maroon = "#ee99a0"
peach = "#f5a97f"
yellow = "#eed49f"
green = "#a6da95"
teal = "#8bd5ca"
sky = "#91d7e3"
sapphire = "#7dc4e4"
blue = "#8aadf4"
lavender = "#b7bdf8"
text = "#cad3f5"
subtext1 = "#b8c0e0"
subtext0 = "#a5adcb"
overlay2 = "#939ab7"
overlay1 = "#8087a2"
overlay0 = "#6e738d"
surface2 = "#5b6078"
surface1 = "#494d64"
surface0 = "#363a4f"
base = "#24273a"
mantle = "#1e2030"
crust = "#181926"
+27
View File
@@ -1,3 +1,30 @@
# Tmux Configuration
This directory contains the tmux configuration, reusable tmuxifier layouts, and
session persistence settings.
## Session Persistence
The configuration uses tmux-resurrect and tmux-continuum to save sessions every
15 minutes and restore the latest saved session when tmux starts. Sessions save
window and pane layouts, working directories, and pane contents. Running
programs are restored only when supported by tmux-resurrect; their live process
state cannot survive a shutdown.
After starting tmux, install the configured plugins with:
```text
Ctrl-Space I
```
`Ctrl-Space` is the configured tmux prefix. You can also save or restore
manually with:
```text
Ctrl-Space Ctrl-S Save the current tmux state
Ctrl-Space Ctrl-R Restore the last saved state
```
# Tmuxifier Session Templates
This directory contains reusable tmux session and window layouts managed by [tmuxifier](https://github.com/jimeh/tmuxifier).
@@ -1,3 +1,4 @@
#!/bin/bash
# Example session: demo
# Usage: tmuxifier load-session demo
# Edit: tmuxifier edit-session demo
+30 -8
View File
@@ -29,21 +29,42 @@ bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Create panes with the same working directory
bind % split-window -h -c "#{pane_current_path}"
bind '"' split-window -v -c "#{pane_current_path}"
# Kill panes without prompt
bind x kill-pane
# ── Plugins ────────────────────────────────────────────────────────────────────
# Auto-bootstrap TPM if not installed
if "test ! -d ~/.config/tmux/plugins/tpm" \
"run 'git clone https://github.com/tmux-plugins/tpm ~/.config/tmux/plugins/tpm && ~/.config/tmux/plugins/tpm/bin/install_plugins'"
# Auto-install missing plugins when TPM exists but a plugin dir is absent
# (e.g. a new @plugin was added after the first bootstrap).
# NOTE: TPM clones `user/repo` to `plugins/repo`, so catppuccin/tmux -> plugins/tmux.
if "test ! -d ~/.config/tmux/plugins/tmux" \
"run '~/.config/tmux/plugins/tpm/bin/install_plugins'"
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
# set -g @plugin 'sindrip/tmux-nvim-navigator'
set -g @plugin 'jimeh/tmuxifier'
# Catppuccin theme
# Persist sessions across reboots and restore them when tmux starts.
set -g @continuum-save-interval '5'
# set -g @continuum-restore 'on'
# set -g @resurrect-capture-pane-contents 'on'
# Central theme (basic/.config/themes): flavor comes from $CATPPUCCIN_FLAVOR
# (theme.env.sh / theme.fish), defaulting to mocha. The plugin itself is
# owned by TPM (see registry.conf for the theme -> plugin mapping).
set -g @plugin 'catppuccin/tmux'
set -g @catppuccin_flavor "mocha"
run-shell 'tmux set -g @catppuccin_flavor "${CATPPUCCIN_FLAVOR:-mocha}"'
set -g @catppuccin_window_status_style "rounded"
set -g @catppuccin_window_text "#W"
@@ -53,16 +74,17 @@ set -g @catppuccin_window_current_text "#W"
set-environment -g TMUXIFIER_LAYOUT_PATH "$HOME/.tmuxifier/layouts"
# ── Initialize TPM (must be last line before status bar) ──────────────────────
run '~/.config/tmux/plugins/tpm/tpm'
# ── Status bar ────────────────────────────────────────────────────────────────
# (must come after TPM run so catppuccin variables are available)
# NOTE: #{E:@catppuccin_...} expands at display time, so this intentionally
# comes before `run tpm` (TPM requires `run tpm` to be the last line).
set -g status-position top
set -g status-left-length 100
set -g status-right-length 100
set -g status-left "#{E:@catppuccin_status_session}"
set -g status-right "#{E:@catppuccin_status_date_time}"
# ── Initialize TPM (must be last) ───────────────────────────────────────────
run '~/.config/tmux/plugins/tpm/tpm'
+5 -3
View File
@@ -1,3 +1,8 @@
# Central theme note: yazi has no `include` mechanism, so this file is a
# declared mirror of basic/.config/themes/themes/catppuccin-mocha (Catppuccin
# Mocha). Do not hand-tweak hex values here; port them from the central theme.
# (Also note: syntect_theme below points at ~/.config/yazi/, which is not
# stowed on a fresh setup until `stow term` runs.)
[app]
overall = { bg = "#1e1e2e" }
@@ -152,7 +157,6 @@ files = [
{ name = "dockerfile", text = "󰡨", fg = "#89b4fa" },
{ name = ".git-blame-ignore-revs", text = "", fg = "#fab387" },
{ name = ".nvmrc", text = "", fg = "#a6e3a1" },
{ name = "hyprpaper.conf", text = "", fg = "#74c7ec" },
{ name = ".prettierignore", text = "", fg = "#89b4fa" },
{ name = "rakefile", text = "", fg = "#313244" },
{ name = "code_of_conduct", text = "", fg = "#f38ba8" },
@@ -279,9 +283,7 @@ files = [
{ name = "commitlint.config.js", text = "󰜘", fg = "#94e2d5" },
{ name = ".gitmodules", text = "", fg = "#fab387" },
{ name = "gradle-wrapper.properties", text = "", fg = "#585b70" },
{ name = "hypridle.conf", text = "", fg = "#74c7ec" },
{ name = "vercel.json", text = "▲", fg = "#f5e0dc" },
{ name = "hyprlock.conf", text = "", fg = "#74c7ec" },
{ name = "go.sum", text = "", fg = "#74c7ec" },
{ name = "kdenlive-layoutsrc", text = "", fg = "#89b4fa" },
{ name = "gruntfile.babel.js", text = "", fg = "#fab387" },
+1
View File
@@ -0,0 +1 @@
.config/tmux/plugins
+81
View File
@@ -0,0 +1,81 @@
# test/Dockerfile
#
# Docker test harness for the dotfiles repo.
#
# Two stages:
# --target dev : fast shellcheck/lint environment (no heavy installs)
# --target test : smoke-test environment that can run the install scripts
#
# Build with (repo root as context; .dockerignore trims heavy/binary dirs):
# docker build --target test -t dotfiles-test -f test/Dockerfile .
# Run with:
# docker run --rm -v "$PWD":/dotfiles dotfiles-test
#
# Or simply use the Makefile targets:
# make test-lint-docker # build dev stage, run shellcheck+lint
# make test-smoke # dry probes; add RUN_SMOKE=1 for real pacman+npm installs
#
# See README.md ("Testing") and test/entrypoint-test.sh for details.
FROM archlinux:latest AS base
# Non-root test user that mirrors the workstation account.
ARG UID_ARG=1000
ARG USERNAME=mathias
RUN pacman -Syu --noconfirm \
base-devel \
git \
stow \
curl \
which \
sudo \
&& pacman -Scc --noconfirm
# Remove the /etc/skel profile files so `useradd -m` starts the test user with
# a truly empty HOME: the term package owns .bashrc/.bash_profile, and stow
# must be able to take ownership of them without conflicting with copied files.
RUN rm -f /etc/skel/.bashrc /etc/skel/.bash_profile /etc/skel/.bash_logout \
&& useradd -m -u "$UID_ARG" -s /bin/bash -G wheel "$USERNAME"
# Passwordless sudo so scripts that call `sudo pacman`, `sudo systemctl`, etc.
# do not hang on a password prompt inside the container.
RUN printf '%%wheel ALL=(ALL) NOPASSWD: ALL\n' > /etc/sudoers.d/wheel-nopasswd \
&& chmod 440 /etc/sudoers.d/wheel-nopasswd
# Use a literal (not the ARG) for USER/ENV: the legacy builder can silently
# ignore a `USER "$ARG"` when the variable resolves after a stage boundary,
# leaving the container running as root (which breaks git ownership checks on
# the mounted host-owned repo). The value is fixed at mathias by default anyway.
USER mathias
ENV HOME="/home/mathias"
WORKDIR /dotfiles
# ---------------------------------------------------------------------------
# dev stage: shellcheck/lint only. Fast, no install heavy-lifting.
# ---------------------------------------------------------------------------
FROM base AS dev
USER root
RUN pacman -S --noconfirm --needed shellcheck
USER mathias
WORKDIR /dotfiles
COPY --chown=mathias . /dotfiles
CMD ["bash", "test/lint.sh"]
# ---------------------------------------------------------------------------
# test stage: prepared to actually run the install scripts & probe stow.
# Uses the mounted repo (see -v $PWD:/dotfiles in the Makefile) so scripts
# see the live workspace checkout.
# ---------------------------------------------------------------------------
FROM base AS test
USER mathias
WORKDIR /dotfiles
# The entrypoint drives the smoke tests. The repo is mounted at /dotfiles
# via the Makefile's `docker run -v`.
ENTRYPOINT ["bash", "/dotfiles/test/entrypoint-test.sh"]

Some files were not shown because too many files have changed in this diff Show More