Compare commits
47
Commits
hypr-caelestia
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d61477072 | ||
|
|
4846325583 | ||
|
|
1d654cf470 | ||
|
|
e9ad0175a1 | ||
|
|
093cd97a96 | ||
|
|
f9a44ac5aa | ||
|
|
7302e87fa3 | ||
|
|
4434feed16 | ||
|
|
94fa42672c | ||
|
|
3c1b727a7e | ||
|
|
c7bf98775b | ||
|
|
590e568061 | ||
|
|
0e7f76200c | ||
|
|
30cab18e60 | ||
|
|
e5dd0039a2 | ||
|
|
00e4931d29 | ||
|
|
e5ce0d0957 | ||
|
|
540baacb15 | ||
|
|
99b0075ada | ||
|
|
049e9a9f5e | ||
|
|
1d2878ad81 | ||
|
|
60db3ba63c | ||
|
|
51b2cdb6a8 | ||
|
|
b8f3861901 | ||
|
|
a2efd03c15 | ||
|
|
ad61c53bfc | ||
|
|
a316ad7221 | ||
|
|
e73f49282c | ||
|
|
3c0fc3ae6b | ||
|
|
dc1a319165 | ||
|
|
1f0bde731e | ||
|
|
6208eea2f8 | ||
|
|
5bc878492e | ||
|
|
73d1297c79 | ||
|
|
10c23c4d24 | ||
|
|
77f70e318c | ||
|
|
8ec820976f | ||
|
|
6924c1e05e | ||
|
|
6cd9427b40 | ||
|
|
050efc2b71 | ||
|
|
8d81e802df | ||
|
|
a0e6ad88d1 | ||
|
|
71cedb7454 | ||
|
|
53b763ee4d | ||
|
|
5438f786a9 | ||
|
|
e80ccf74bb | ||
|
|
4b9b926c60 |
+4
-2
@@ -3,8 +3,7 @@ hypr/.config/hypr/env.conf
|
|||||||
hypr/.config/hypr/env.sh
|
hypr/.config/hypr/env.sh
|
||||||
hypr/.config/hypr/monitor_setup.lua
|
hypr/.config/hypr/monitor_setup.lua
|
||||||
# Noctalia template output (shell-owned, regenerated on palette change)
|
# Noctalia template output (shell-owned, regenerated on palette change)
|
||||||
hypr/.config/hypr/noctalia.lua
|
# hypr/.config/kitty/themes/noctalia.conf
|
||||||
hypr/.config/kitty/themes/noctalia.conf
|
|
||||||
# Caelestia runtime output (shell-owned, regenerated on scheme change)
|
# Caelestia runtime output (shell-owned, regenerated on scheme change)
|
||||||
hypr/.config/hypr/scheme/
|
hypr/.config/hypr/scheme/
|
||||||
*~lock.*#
|
*~lock.*#
|
||||||
@@ -13,3 +12,6 @@ fish_variables
|
|||||||
term/.config/opencode/cli.json
|
term/.config/opencode/cli.json
|
||||||
term/.config/opencode/service.json
|
term/.config/opencode/service.json
|
||||||
hypr/.config/hypr/scheme/current.lua
|
hypr/.config/hypr/scheme/current.lua
|
||||||
|
hypr/.config/hypr/env.lua
|
||||||
|
hypr/.config/hypr/hyprland-buntes-monster-gui.lua
|
||||||
|
hypr/.config/hypr/hyprland-gui.lua
|
||||||
|
|||||||
@@ -13,19 +13,18 @@ term: basic
|
|||||||
bash setup/term/setup.sh
|
bash setup/term/setup.sh
|
||||||
stow term
|
stow term
|
||||||
|
|
||||||
utils: basic
|
utils: term
|
||||||
bash setup/utils/setup.sh
|
bash setup/utils/setup.sh
|
||||||
bash setup/nextcloud.sh
|
|
||||||
|
|
||||||
hypr: basic
|
hypr: utils
|
||||||
bash setup/hypr/setup.sh
|
bash setup/hypr/setup.sh
|
||||||
stow hypr
|
stow hypr
|
||||||
|
|
||||||
kreation: basic
|
kreation: hypr
|
||||||
bash setup/kreation/setup.sh
|
bash setup/kreation/setup.sh
|
||||||
stow kreation
|
stow kreation
|
||||||
|
|
||||||
buntes-monster: hypr kreation
|
buntes-monster: kreation
|
||||||
bash setup/buntes-monster-links.sh
|
bash setup/buntes-monster-links.sh
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Personal configuration files for an Arch Linux workstation (Hyprland + Neovim +
|
|||||||
|-----------|----------|
|
|-----------|----------|
|
||||||
| `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. |
|
| `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 |
|
| `term/` | Fish + kitty + starship + nvim + tmux + yazi + fastfetch + opencode terminal environment |
|
||||||
| `hypr/` | Hyprland compositor config + Noctalia shell config (Catppuccin Mocha) |
|
| `hypr/` | Hyprland compositor config + selectable Noctalia/Caelestia shell configs |
|
||||||
| `kreation/`| VST plugin (`MT-PowerDrumKit.vst3`) |
|
| `kreation/`| VST plugin (`MT-PowerDrumKit.vst3`) |
|
||||||
| `local_ai/`| Local AI / MCP tooling config |
|
| `local_ai/`| Local AI / MCP tooling config |
|
||||||
| `setup/` | Install/setup scripts + package lists (one subdir per target, shared helpers in `setup/lib/`; not stowed) |
|
| `setup/` | Install/setup scripts + package lists (one subdir per target, shared helpers in `setup/lib/`; not stowed) |
|
||||||
@@ -31,7 +31,7 @@ cd ~/.dotfiles
|
|||||||
|
|
||||||
# 2. Install a target and symlink its files
|
# 2. Install a target and symlink its files
|
||||||
make term # terminal + fish + kitty + nvim
|
make term # terminal + fish + kitty + nvim
|
||||||
make hypr # Hyprland (also pulls in basic + term)
|
make hypr # Hyprland + selectable Noctalia/Caelestia shells
|
||||||
make kreation # VST plugin (also pulls in basic)
|
make kreation # VST plugin (also pulls in basic)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -45,10 +45,24 @@ Run `make <target>` from the repository root. Each target first runs the relevan
|
|||||||
|--------|--------------|
|
|--------|--------------|
|
||||||
| `make term` | Runs `setup/term/setup.sh` (installs terminal packages, sets fish as default shell, clones tmuxifier), then `stow term`. Pulls in `basic`. |
|
| `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 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 hypr` | Runs `make basic`, installs Hyprland plus the Noctalia and Caelestia frontends, creates a local shell selection when needed, stows `hypr`, and runs the portal/file-association integration scripts |
|
||||||
| `make kreation` | `make basic`, installs VST runtime, stows `kreation` |
|
| `make kreation` | `make basic`, installs VST runtime, stows `kreation` |
|
||||||
| `make buntes-monster` | Everything (`basic` + `hypr` + `kreation`), then wires up symlinks |
|
| `make buntes-monster` | Everything (`basic` + `hypr` + `kreation`), then wires up symlinks |
|
||||||
|
|
||||||
|
### Choosing between Noctalia and Caelestia
|
||||||
|
|
||||||
|
`make hypr` installs both desktop-shell frontends. Hyprland starts the one selected in `~/.config/hypr/env.lua`:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
return {
|
||||||
|
shell = "noctalia", -- or "caelestia"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The local `env.lua` is created from `env.example.lua` on the first setup and is preserved on later runs. After changing the value, log out of and back into Hyprland; the running shell is not replaced live.
|
||||||
|
|
||||||
|
Caelestia requires the upstream AUR package `quickshell-git`; the release package `quickshell` must not be installed instead. Do not substitute CachyOS's `noctalia-qs`, even though it provides the virtual `quickshell-git` dependency: its Quickshell parser is not compatible with Caelestia. The package list uses the explicit `aur/quickshell-git` target because `yay --aur` alone may still select a repository provider. `make hypr` then replaces an existing `noctalia-qs` installation transactionally and verifies that `/usr/bin/qs` belongs to `quickshell-git`.
|
||||||
|
|
||||||
### Managing terminal packages
|
### Managing terminal packages
|
||||||
|
|
||||||
The terminal package list lives in a single editable file:
|
The terminal package list lives in a single editable file:
|
||||||
@@ -61,7 +75,7 @@ Add/remove packages on separate lines. Lines starting with `#` are ignored, and
|
|||||||
|
|
||||||
```
|
```
|
||||||
@pacman # install via pacman (default)
|
@pacman # install via pacman (default)
|
||||||
@aur # install via yay (AUR)
|
@aur # use yay's AUR mode; use aur/<pkg> for an explicit source
|
||||||
@npm # install via npm -g
|
@npm # install via npm -g
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
Executable
+47
@@ -0,0 +1,47 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -Eeuo pipefail
|
||||||
|
|
||||||
|
SERVER="buntes-monster"
|
||||||
|
SERVER_IP="192.168.0.4"
|
||||||
|
|
||||||
|
MOUNTS=(
|
||||||
|
"/mnt/anbau:/mnt/anbau"
|
||||||
|
"/mnt/bilder:/mnt/bilder"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Re-run as root when needed.
|
||||||
|
if [[ "${EUID}" -ne 0 ]]; then
|
||||||
|
exec sudo "$0" "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Preserve ownership for the user who invoked sudo.
|
||||||
|
OWNER="${SUDO_USER:-${USER}}"
|
||||||
|
OWNER_UID="$(id -u "$OWNER")"
|
||||||
|
OWNER_GID="$(id -g "$OWNER")"
|
||||||
|
|
||||||
|
for entry in "${MOUNTS[@]}"; do
|
||||||
|
IFS=":" read -r remote_path local_path <<< "$entry"
|
||||||
|
|
||||||
|
# Create the mount point if necessary and give it to the invoking user.
|
||||||
|
install -d \
|
||||||
|
-o "$OWNER_UID" \
|
||||||
|
-g "$OWNER_GID" \
|
||||||
|
-m 0755 \
|
||||||
|
"$local_path"
|
||||||
|
|
||||||
|
# Do not remount an already-mounted location.
|
||||||
|
if mountpoint -q "$local_path"; then
|
||||||
|
echo "Already mounted: $local_path"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Mounting $SERVER:$remote_path at $local_path..."
|
||||||
|
|
||||||
|
mount \
|
||||||
|
-t nfs \
|
||||||
|
-o rw,sync,addr="$SERVER_IP" \
|
||||||
|
"$SERVER:$remote_path" \
|
||||||
|
"$local_path"
|
||||||
|
|
||||||
|
echo "Mounted: $local_path"
|
||||||
|
done
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
{
|
||||||
|
}
|
||||||
@@ -1,23 +1,39 @@
|
|||||||
{
|
{
|
||||||
"appearance": {
|
"appearance": {
|
||||||
"transparency": {
|
"transparency": {
|
||||||
"enabled": true
|
"enabled": true
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"general": {
|
|
||||||
"apps": {
|
|
||||||
"explorer": ["dolphin"],
|
|
||||||
"terminal": ["kitty"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"launcher": {
|
|
||||||
"showOnHover": true,
|
|
||||||
"useFuzzy": {
|
|
||||||
"apps": true
|
|
||||||
},
|
},
|
||||||
"vimKeybinds": true
|
"background": {
|
||||||
},
|
"wallpaperEnabled": true
|
||||||
"paths": {
|
},
|
||||||
"wallpaperDir": "~/nextcloud/Photos/Wallpapers"
|
"dashboard": {
|
||||||
}
|
"showWeather": true
|
||||||
|
},
|
||||||
|
"general": {
|
||||||
|
"apps": {
|
||||||
|
"audio": [
|
||||||
|
"supersonic-desktop"
|
||||||
|
],
|
||||||
|
"explorer": [
|
||||||
|
"dolphin"
|
||||||
|
],
|
||||||
|
"playback": [
|
||||||
|
"celluloid"
|
||||||
|
],
|
||||||
|
"terminal": [
|
||||||
|
"kitty"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"launcher": {
|
||||||
|
"showOnHover": true,
|
||||||
|
"useFuzzy": {
|
||||||
|
"apps": true
|
||||||
|
},
|
||||||
|
"vimKeybinds": true
|
||||||
|
},
|
||||||
|
"paths": {
|
||||||
|
"wallpaperDir": "~/nextcloud/Photos/Wallpapers"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
return {
|
||||||
|
-- Supported values: "noctalia" or "caelestia".
|
||||||
|
shell = "noctalia",
|
||||||
|
}
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# 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 -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
|
|
||||||
on-timeout = ~/.config/hypr/scripts/screensaver-start.sh
|
|
||||||
on-resume = ~/.config/hypr/scripts/screensaver-stop.sh
|
|
||||||
}
|
|
||||||
|
|
||||||
# 10min: lock via Noctalia (SUPER+L runs the same command).
|
|
||||||
listener {
|
|
||||||
timeout = 600
|
|
||||||
on-timeout = loginctl lock-session
|
|
||||||
}
|
|
||||||
|
|
||||||
# 10m30s: power off displays.
|
|
||||||
listener {
|
|
||||||
timeout = 630
|
|
||||||
on-timeout = hyprctl dispatch 'hl.dsp.dpms(false)'
|
|
||||||
on-resume = hyprctl dispatch 'hl.dsp.dpms(true)'
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,18 @@
|
|||||||
|
|
||||||
require("env")
|
local config_home = os.getenv("XDG_CONFIG_HOME") or os.getenv("HOME") .. "/.config"
|
||||||
|
|
||||||
|
local fid_env = io.open(config_home .. "/hypr/env.lua")
|
||||||
|
local env = {}
|
||||||
|
if fid_env then
|
||||||
|
env = require("env")
|
||||||
|
else
|
||||||
|
env = require("env_example")
|
||||||
|
end
|
||||||
|
|
||||||
|
if env.shell ~= "noctalia" and env.shell ~= "caelestia" then
|
||||||
|
error("Unsupported shell '" .. tostring(env.shell) .. "' in ~/.config/hypr/env.lua; choose 'noctalia' or 'caelestia'")
|
||||||
|
end
|
||||||
|
|
||||||
hl.exec_cmd("bash ~/.config/hypr/env.sh")
|
hl.exec_cmd("bash ~/.config/hypr/env.sh")
|
||||||
|
|
||||||
-- ###############
|
-- ###############
|
||||||
@@ -9,14 +22,6 @@ hl.exec_cmd("bash ~/.config/hypr/env.sh")
|
|||||||
-- load default monitor config
|
-- load default monitor config
|
||||||
require("modules.monitor_setup_default")
|
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
|
-- unscale XWayland
|
||||||
hl.config({
|
hl.config({
|
||||||
xwayland = {
|
xwayland = {
|
||||||
@@ -29,14 +34,12 @@ hl.config({
|
|||||||
-- ##################
|
-- ##################
|
||||||
|
|
||||||
hl.on("hyprland.start", function()
|
hl.on("hyprland.start", function()
|
||||||
hl.exec_cmd("caelestia shell -d")
|
-- start selected shell
|
||||||
end)
|
if env.shell == "caelestia" then
|
||||||
|
hl.exec_cmd("caelestia shell -d")
|
||||||
hl.on("hyprland.start", function()
|
else -- default: "noctalia"
|
||||||
hl.exec_cmd("hypridle &")
|
hl.exec_cmd("noctalia &")
|
||||||
end)
|
end
|
||||||
|
|
||||||
hl.on("hyprland.start", function()
|
|
||||||
hl.exec_cmd("sh ~/.config/hypr/scripts/portal-host-override.sh")
|
hl.exec_cmd("sh ~/.config/hypr/scripts/portal-host-override.sh")
|
||||||
hl.exec_cmd("sh ~/.config/hypr/scripts/ensure-mime-defaults.sh")
|
hl.exec_cmd("sh ~/.config/hypr/scripts/ensure-mime-defaults.sh")
|
||||||
end)
|
end)
|
||||||
@@ -48,4 +51,21 @@ require("modules.keybinds")
|
|||||||
require("modules.windows_and_workspaces")
|
require("modules.windows_and_workspaces")
|
||||||
|
|
||||||
-- HyprMod managed settings
|
-- HyprMod managed settings
|
||||||
require("hyprland-gui")
|
local fid_gui = io.open(config_home .. "/hypr/hyprland-buntes-monster-gui.lua")
|
||||||
|
if fid_gui then
|
||||||
|
fid_gui:close()
|
||||||
|
require("hyprland-buntes-monster-gui")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- For Noctalia Color templates. Noctalia-only: under Caelestia this would
|
||||||
|
-- otherwise push Noctalia's Catppuccin border colors into the compositor.
|
||||||
|
if env.shell == "noctalia" then
|
||||||
|
require("noctalia").apply_theme()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- HyprMod managed settings
|
||||||
|
local fid_gui2 = io.open(config_home .. "/hypr/hyprland-gui.lua")
|
||||||
|
if fid_gui2 then
|
||||||
|
fid_gui2:close()
|
||||||
|
require("hyprland-gui")
|
||||||
|
end
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
# 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,63 @@
|
|||||||
|
-- keybind_registry.lua — wrap hl.bind so every keybind records a runnable
|
||||||
|
-- action alongside its chord/description.
|
||||||
|
--
|
||||||
|
-- Hyprland's Lua API registers binds through hl.bind(keys, dispatcher, opts),
|
||||||
|
-- and `hyprctl binds -j` reports those as `dispatcher: "__lua"` with an opaque
|
||||||
|
-- registry reference — the underlying command is not recoverable from the
|
||||||
|
-- compositor afterwards. This module captures the action at registration time:
|
||||||
|
--
|
||||||
|
-- exec(cmd) -> a tagged placeholder for the exec_cmd dispatcher (the final
|
||||||
|
-- command string is resolved here, so concatenations like
|
||||||
|
-- "hyprshot ... " .. var.screenshot_folder work automatically)
|
||||||
|
-- bind(...) -> same signature/behavior as hl.bind; converts the exec
|
||||||
|
-- placeholder back into a real dispatcher and records the row
|
||||||
|
-- write(path)-> dump the registry as "keys\x1fdescription\x1fcmd" TSV so the
|
||||||
|
-- show-keybinds picker can execute the selected entry
|
||||||
|
--
|
||||||
|
-- Pure dispatcher binds (hl.dsp.window.close(), hl.dsp.focus(...), ...) pass
|
||||||
|
-- through unchanged and are recorded with an empty cmd (informational only).
|
||||||
|
|
||||||
|
local registry = {}
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
--- Tag a shell command so bind() knows to turn it into an exec_cmd dispatcher.
|
||||||
|
function M.exec(cmd)
|
||||||
|
return { __cmd = cmd }
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Register a keybind like hl.bind, but record it in the registry first.
|
||||||
|
--- @param keys string final key string (e.g. "SUPER + Q")
|
||||||
|
--- @param action any M.exec(cmd) or a real dispatcher from hl.dsp.*
|
||||||
|
--- @param opts? table hl.bind options (description, flags, ...)
|
||||||
|
function M.bind(keys, action, opts)
|
||||||
|
opts = opts or {}
|
||||||
|
local dsp = action
|
||||||
|
local cmd = ""
|
||||||
|
if type(action) == "table" and action.__cmd ~= nil then
|
||||||
|
cmd = action.__cmd
|
||||||
|
dsp = hl.dsp.exec_cmd(cmd)
|
||||||
|
end
|
||||||
|
table.insert(registry, { keys = keys, description = opts.description or "", cmd = cmd })
|
||||||
|
return hl.bind(keys, dsp, opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Dump the registry as "keys\x1fdescription\x1fcmd" lines (one per bind).
|
||||||
|
function M.write(path)
|
||||||
|
local f, err = io.open(path, "w")
|
||||||
|
if not f then
|
||||||
|
return nil, err
|
||||||
|
end
|
||||||
|
for _, b in ipairs(registry) do
|
||||||
|
f:write(b.keys, "\x1f", b.description, "\x1f", b.cmd, "\n")
|
||||||
|
end
|
||||||
|
f:close()
|
||||||
|
return registry
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Access the raw registry rows ({keys, description, cmd}).
|
||||||
|
function M.get()
|
||||||
|
return registry
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@@ -1,136 +1,142 @@
|
|||||||
local var = require("modules.variables")
|
local var = require("modules.variables")
|
||||||
local command = require("modules.shell_commands")
|
local command = require("modules.shell_commands")
|
||||||
|
local env = require("env")
|
||||||
|
-- bind/exec wrap hl.bind so each keybind also records a runnable command for
|
||||||
|
-- the show-keybinds picker (see modules/keybind_registry.lua).
|
||||||
|
local reg = require("modules.keybind_registry")
|
||||||
|
local bind = reg.bind
|
||||||
|
local exec = reg.exec
|
||||||
-- See https://wiki.hypr.land/Configuring/Keywords/
|
-- See https://wiki.hypr.land/Configuring/Keywords/
|
||||||
|
|
||||||
-- Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more
|
-- 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)" })
|
bind(var.mainMod .. " + RETURN", exec(var.terminal), { description = "Open terminal" })
|
||||||
hl.bind(var.mainMod .. " + Q", hl.dsp.window.close(), { description = "Close focused window" })
|
bind(var.mainMod .. " + ALT + RETURN", exec(var.terminal_tmux), { description = "Open tmux in terminal" })
|
||||||
hl.bind(
|
bind(var.mainMod .. " + Q", hl.dsp.window.close(), { description = "Close focused window" })
|
||||||
|
bind(
|
||||||
var.mainMod .. " + ESCAPE",
|
var.mainMod .. " + ESCAPE",
|
||||||
hl.dsp.exec_cmd(command.session),
|
exec(command.session),
|
||||||
{ description = "Session menu (logout/reboot/shutdown)" }
|
{ description = "Session menu (logout/reboot/shutdown)" }
|
||||||
)
|
)
|
||||||
hl.bind(var.mainMod .. " + SHIFT + ESCAPE", hl.dsp.exec_cmd(command.logout), { description = "Exit Hyprland" })
|
bind(var.mainMod .. " + SHIFT + ESCAPE", exec(command.logout), { description = "Session: logout" })
|
||||||
hl.bind(var.mainMod .. " + CTRL + ESCAPE", hl.dsp.exec_cmd(command.shutdown), { description = "Power off the system" })
|
bind(var.mainMod .. " + CTRL + ESCAPE", exec(command.shutdown), { description = "Session: power off" })
|
||||||
hl.bind(var.mainMod .. " + ALT + ESCAPE", hl.dsp.exec_cmd(command.reboot), { description = "Reboot the system" })
|
bind(var.mainMod .. " + ALT + ESCAPE", exec(command.reboot), { description = "Session: reboot" })
|
||||||
hl.bind(var.mainMod .. " + E", hl.dsp.exec_cmd(var.fileManager), { description = "Open file manager (dolphin)" })
|
bind(var.mainMod .. " + E", exec(var.fileManager), { description = "Open file manager" })
|
||||||
hl.bind(var.mainMod .. " + V", hl.dsp.window.float({ action = "toggle" }), { description = "Toggle floating window" })
|
bind(var.mainMod .. " + V", hl.dsp.window.float({ action = "toggle" }), { description = "Floating window toggle" })
|
||||||
hl.bind(var.mainMod .. " + SPACE", hl.dsp.exec_cmd(command.menu), { description = "Open app launcher" })
|
bind(var.mainMod .. " + SPACE", exec(command.menu), { description = "Open app launcher" })
|
||||||
hl.bind(var.mainMod .. " + P", hl.dsp.window.pseudo(), { description = "Toggle pseudo-tiling" })
|
bind(var.mainMod .. " + P", hl.dsp.window.pseudo(), { description = "Pseudo-tiling toggle" })
|
||||||
hl.bind(var.mainMod .. " + SHIFT + J", hl.dsp.layout("togglesplit"), { description = "Toggle split layout" })
|
bind(var.mainMod .. " + SHIFT + J", hl.dsp.layout("togglesplit"), { description = "Split layout toggle" })
|
||||||
hl.bind(var.mainMod .. " + I", hl.dsp.exec_cmd("firefox &"), { description = "Open Firefox" })
|
bind(var.mainMod .. " + I", exec(var.internet_explorer), { description = "Open internet explorer" })
|
||||||
hl.bind(var.mainMod .. " + n", hl.dsp.exec_cmd("nm-connection-editor"), { description = "Network manager" })
|
bind(var.mainMod .. " + n", exec("nm-connection-editor"), { description = "Open network manager" })
|
||||||
hl.bind(var.mainMod .. " + comma", hl.dsp.exec_cmd(command.settings), { description = "settings menu" })
|
bind(var.mainMod .. " + comma", exec(command.settings), { description = "Open settings" })
|
||||||
hl.bind(var.mainMod .. " + S", hl.dsp.exec_cmd(command.control_center), { description = "Control center" })
|
bind(var.mainMod .. " + S", exec(command.control_center), { description = "Open start menu" })
|
||||||
|
bind(var.mainMod .. " + ALT + H", exec("hyprmod"), {description = "Open hyprmod (hyprland config GUI)"})
|
||||||
|
bind(var.mainMod .. " + period", exec(command.emoji), { description = "Open emoji picker" })
|
||||||
|
bind(var.mainMod .. " + ALT + S", exec(var.systemmonitor), {description = "Open systemmonitor"})
|
||||||
|
|
||||||
|
bind(var.mainMod .. " + TAB", function()
|
||||||
|
hl.plugin.hyprtasking.toggle("cursor")
|
||||||
|
end, { description = "Workspace: overview" })
|
||||||
|
|
||||||
-- Move focus with mainMod or Vim-style
|
-- Move focus with mainMod or Vim-style
|
||||||
hl.bind(var.mainMod .. " + CTRL + h", hl.dsp.focus({ direction = "left" }), { description = "Focus window left" })
|
bind(var.mainMod .. " + CTRL + h", hl.dsp.focus({ direction = "left" }), { description = "Window: focus left" })
|
||||||
hl.bind(var.mainMod .. " + CTRL + l", hl.dsp.focus({ direction = "right" }), { description = "Focus window right" })
|
bind(var.mainMod .. " + CTRL + l", hl.dsp.focus({ direction = "right" }), { description = "Window: focus right" })
|
||||||
hl.bind(var.mainMod .. " + CTRL + k", hl.dsp.focus({ direction = "up" }), { description = "Focus window up" })
|
bind(var.mainMod .. " + CTRL + k", hl.dsp.focus({ direction = "up" }), { description = "Window: focus up" })
|
||||||
hl.bind(var.mainMod .. " + CTRL + j", hl.dsp.focus({ direction = "down" }), { description = "Focus window down" })
|
bind(var.mainMod .. " + CTRL + j", hl.dsp.focus({ direction = "down" }), { description = "Window: focus down" })
|
||||||
|
|
||||||
-- Move windows with mainMod or Vim-style
|
-- Move windows with mainMod or Vim-style
|
||||||
hl.bind(var.mainMod .. " + SHIFT + h", hl.dsp.window.move({ direction = "left" }), { description = "Move window left" })
|
bind(var.mainMod .. " + SHIFT + h", hl.dsp.window.move({ direction = "left" }), { description = "Window: move left" })
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + SHIFT + l",
|
var.mainMod .. " + SHIFT + l",
|
||||||
hl.dsp.window.move({ direction = "right" }),
|
hl.dsp.window.move({ direction = "right" }),
|
||||||
{ description = "Move window right" }
|
{ description = "Window: move right" }
|
||||||
)
|
)
|
||||||
hl.bind(var.mainMod .. " + SHIFT + k", hl.dsp.window.move({ direction = "up" }), { description = "Move window up" })
|
bind(var.mainMod .. " + SHIFT + k", hl.dsp.window.move({ direction = "up" }), { description = "Window: move up" })
|
||||||
hl.bind(var.mainMod .. " + SHIFT + j", hl.dsp.window.move({ direction = "down" }), { description = "Move window down" })
|
bind(var.mainMod .. " + SHIFT + j", hl.dsp.window.move({ direction = "down" }), { description = "Window: move down" })
|
||||||
|
|
||||||
-- Resize focused window with mainMod + Arrows
|
-- Resize focused window with mainMod + Arrows
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + left",
|
var.mainMod .. " + left",
|
||||||
hl.dsp.window.resize({ x = -10, y = 0, relative = true }),
|
hl.dsp.window.resize({ x = -10, y = 0, relative = true }),
|
||||||
{ description = "Resize window left" }
|
{ description = "Window: resize left" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + right",
|
var.mainMod .. " + right",
|
||||||
hl.dsp.window.resize({ x = 10, y = 0, relative = true }),
|
hl.dsp.window.resize({ x = 10, y = 0, relative = true }),
|
||||||
{ description = "Resize window right" }
|
{ description = "Window: resize right" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + up",
|
var.mainMod .. " + up",
|
||||||
hl.dsp.window.resize({ x = 0, y = -10, relative = true }),
|
hl.dsp.window.resize({ x = 0, y = -10, relative = true }),
|
||||||
{ description = "Resize window up" }
|
{ description = "Window: resize up" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + down",
|
var.mainMod .. " + down",
|
||||||
hl.dsp.window.resize({ x = 0, y = 10, relative = true }),
|
hl.dsp.window.resize({ x = 0, y = 10, relative = true }),
|
||||||
{ description = "Resize window down" }
|
{ description = "Window: resize down" }
|
||||||
)
|
)
|
||||||
|
|
||||||
-- Switch workspaces with mainMod + [0-9]
|
-- Switch workspaces with mainMod + [0-9]
|
||||||
hl.bind(var.mainMod .. " + 1", hl.dsp.focus({ workspace = 1 }), { description = "Switch to workspace 1" })
|
bind(var.mainMod .. " + 1", hl.dsp.focus({ workspace = 1 }), { description = "Workspace: switch to 1" })
|
||||||
hl.bind(var.mainMod .. " + 2", hl.dsp.focus({ workspace = 2 }), { description = "Switch to workspace 2" })
|
bind(var.mainMod .. " + 2", hl.dsp.focus({ workspace = 2 }), { description = "Workspace: Switch to 2" })
|
||||||
hl.bind(var.mainMod .. " + 3", hl.dsp.focus({ workspace = 3 }), { description = "Switch to workspace 3" })
|
bind(var.mainMod .. " + 3", hl.dsp.focus({ workspace = 3 }), { description = "Workspace: Switch to 3" })
|
||||||
hl.bind(var.mainMod .. " + 4", hl.dsp.focus({ workspace = 4 }), { description = "Switch to workspace 4" })
|
bind(var.mainMod .. " + 4", hl.dsp.focus({ workspace = 4 }), { description = "Workspace: Switch to 4" })
|
||||||
hl.bind(var.mainMod .. " + 5", hl.dsp.focus({ workspace = 5 }), { description = "Switch to workspace 5" })
|
bind(var.mainMod .. " + 5", hl.dsp.focus({ workspace = 5 }), { description = "Workspace: Switch to 5" })
|
||||||
hl.bind(var.mainMod .. " + 6", hl.dsp.focus({ workspace = 6 }), { description = "Switch to workspace 6" })
|
bind(var.mainMod .. " + 6", hl.dsp.focus({ workspace = 6 }), { description = "Workspace: Switch to 6" })
|
||||||
hl.bind(var.mainMod .. " + 7", hl.dsp.focus({ workspace = 7 }), { description = "Switch to workspace 7" })
|
bind(var.mainMod .. " + 7", hl.dsp.focus({ workspace = 7 }), { description = "Workspace: Switch to 7" })
|
||||||
hl.bind(var.mainMod .. " + 8", hl.dsp.focus({ workspace = 8 }), { description = "Switch to workspace 8" })
|
bind(var.mainMod .. " + 8", hl.dsp.focus({ workspace = 8 }), { description = "Workspace: Switch to 8" })
|
||||||
hl.bind(var.mainMod .. " + 9", hl.dsp.focus({ workspace = 9 }), { description = "Switch to workspace 9" })
|
bind(var.mainMod .. " + 9", hl.dsp.focus({ workspace = 9 }), { description = "Workspace: Switch to 9" })
|
||||||
hl.bind(var.mainMod .. " + 0", hl.dsp.focus({ workspace = 10 }), { description = "Switch to workspace 10" })
|
bind(var.mainMod .. " + 0", hl.dsp.focus({ workspace = 10 }), { description = "Workspace: Switch to 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]
|
-- Move active window to a workspace with mainMod + SHIFT + [0-9]
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + SHIFT + 1",
|
var.mainMod .. " + SHIFT + 1",
|
||||||
hl.dsp.window.move({ workspace = 1 }),
|
hl.dsp.window.move({ workspace = 1 }),
|
||||||
{ description = "Move window to workspace 1" }
|
{ description = "Window: move to workspace 1" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + SHIFT + 2",
|
var.mainMod .. " + SHIFT + 2",
|
||||||
hl.dsp.window.move({ workspace = 2 }),
|
hl.dsp.window.move({ workspace = 2 }),
|
||||||
{ description = "Move window to workspace 2" }
|
{ description = "Window: move to workspace 2" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + SHIFT + 3",
|
var.mainMod .. " + SHIFT + 3",
|
||||||
hl.dsp.window.move({ workspace = 3 }),
|
hl.dsp.window.move({ workspace = 3 }),
|
||||||
{ description = "Move window to workspace 3" }
|
{ description = "Window: move to workspace 3" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + SHIFT + 4",
|
var.mainMod .. " + SHIFT + 4",
|
||||||
hl.dsp.window.move({ workspace = 4 }),
|
hl.dsp.window.move({ workspace = 4 }),
|
||||||
{ description = "Move window to workspace 4" }
|
{ description = "Window: move to workspace 4" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + SHIFT + 5",
|
var.mainMod .. " + SHIFT + 5",
|
||||||
hl.dsp.window.move({ workspace = 5 }),
|
hl.dsp.window.move({ workspace = 5 }),
|
||||||
{ description = "Move window to workspace 5" }
|
{ description = "Window: move to workspace 5" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + SHIFT + 6",
|
var.mainMod .. " + SHIFT + 6",
|
||||||
hl.dsp.window.move({ workspace = 6 }),
|
hl.dsp.window.move({ workspace = 6 }),
|
||||||
{ description = "Move window to workspace 6" }
|
{ description = "Window: move to workspace 6" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + SHIFT + 7",
|
var.mainMod .. " + SHIFT + 7",
|
||||||
hl.dsp.window.move({ workspace = 7 }),
|
hl.dsp.window.move({ workspace = 7 }),
|
||||||
{ description = "Move window to workspace 7" }
|
{ description = "Window: move to workspace 7" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + SHIFT + 8",
|
var.mainMod .. " + SHIFT + 8",
|
||||||
hl.dsp.window.move({ workspace = 8 }),
|
hl.dsp.window.move({ workspace = 8 }),
|
||||||
{ description = "Move window to workspace 8" }
|
{ description = "Window: move to workspace 8" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + SHIFT + 9",
|
var.mainMod .. " + SHIFT + 9",
|
||||||
hl.dsp.window.move({ workspace = 9 }),
|
hl.dsp.window.move({ workspace = 9 }),
|
||||||
{ description = "Move window to workspace 9" }
|
{ description = "Window: move to workspace 9" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + SHIFT + 0",
|
var.mainMod .. " + SHIFT + 0",
|
||||||
hl.dsp.window.move({ workspace = 10 }),
|
hl.dsp.window.move({ workspace = 10 }),
|
||||||
{ description = "Move window to workspace 10" }
|
{ description = "Window: move to workspace 10" }
|
||||||
)
|
)
|
||||||
|
|
||||||
-- # Example special workspace (scratchpad)
|
-- # Example special workspace (scratchpad)
|
||||||
@@ -140,98 +146,103 @@ hl.bind(
|
|||||||
-- bind = $mainMod SHIFT, S, movetoworkspace, special:magic
|
-- bind = $mainMod SHIFT, S, movetoworkspace, special:magic
|
||||||
|
|
||||||
-- Scroll through existing workspaces with mainMod + scroll
|
-- Scroll through existing workspaces with mainMod + scroll
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + mouse_down",
|
var.mainMod .. " + mouse_down",
|
||||||
hl.dsp.focus({ workspace = "e+1" }),
|
hl.dsp.focus({ workspace = "e+1" }),
|
||||||
{ description = "Next workspace (scroll down)" }
|
{ description = "Workspace: next (scroll down)" }
|
||||||
)
|
)
|
||||||
hl.bind(
|
bind(
|
||||||
var.mainMod .. " + mouse_up",
|
var.mainMod .. " + mouse_up",
|
||||||
hl.dsp.focus({ workspace = "e-1" }),
|
hl.dsp.focus({ workspace = "e-1" }),
|
||||||
{ description = "Previous workspace (scroll up)" }
|
{ description = "Workspace: previous (scroll up)" }
|
||||||
)
|
)
|
||||||
|
|
||||||
-- Move/resize windows with mainMod + LMB/RMB and dragging
|
-- Move/resize windows with mainMod + LMB/RMB and dragging
|
||||||
hl.bind(var.mainMod .. " + mouse:272", hl.dsp.window.drag(), {
|
bind(var.mainMod .. " + mouse:272", hl.dsp.window.drag(), {
|
||||||
mouse = true,
|
mouse = true,
|
||||||
description = "Move window with mouse",
|
description = "Window: move with mouse",
|
||||||
})
|
})
|
||||||
hl.bind(var.mainMod .. " + mouse:273", hl.dsp.window.resize(), {
|
bind(var.mainMod .. " + mouse:273", hl.dsp.window.resize(), {
|
||||||
mouse = true,
|
mouse = true,
|
||||||
description = "Resize window with mouse",
|
description = "Window: resize with mouse",
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Laptop multimedia keys for volume and LCD brightness
|
-- Laptop multimedia keys for volume and LCD brightness
|
||||||
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), {
|
bind("XF86AudioRaiseVolume", exec("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), {
|
||||||
repeating = true,
|
repeating = true,
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Volume up (repeat)",
|
description = "Media: volume up (repeat)",
|
||||||
})
|
})
|
||||||
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), {
|
bind("XF86AudioLowerVolume", exec("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), {
|
||||||
repeating = true,
|
repeating = true,
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Volume down (repeat)",
|
description = "Media: volume down (repeat)",
|
||||||
})
|
})
|
||||||
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), {
|
bind("XF86AudioMute", exec("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), {
|
||||||
repeating = true,
|
repeating = true,
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Mute audio",
|
description = "Media: mute audio",
|
||||||
})
|
})
|
||||||
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), {
|
bind("XF86AudioMicMute", exec("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), {
|
||||||
repeating = true,
|
repeating = true,
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Mute microphone",
|
description = "Media: mute microphone",
|
||||||
})
|
})
|
||||||
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), {
|
bind("XF86MonBrightnessUp", exec("brightnessctl -e4 -n2 set 5%+"), {
|
||||||
repeating = true,
|
repeating = true,
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Brightness up",
|
description = "Brightness up",
|
||||||
})
|
})
|
||||||
hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), {
|
bind("XF86MonBrightnessDown", exec("brightnessctl -e4 -n2 set 5%-"), {
|
||||||
repeating = true,
|
repeating = true,
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Brightness down",
|
description = "Brightness down",
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Requires playerctl
|
-- Requires playerctl
|
||||||
hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), {
|
bind("XF86AudioNext", exec("playerctl next"), {
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Next track",
|
description = "Media: next track",
|
||||||
})
|
})
|
||||||
hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), {
|
bind("XF86AudioPause", exec("playerctl play-pause"), {
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Play/Pause",
|
description = "Media: play/pause",
|
||||||
})
|
})
|
||||||
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), {
|
bind("XF86AudioPlay", exec("playerctl play-pause"), {
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Play/Pause",
|
description = "Media: play/pause",
|
||||||
})
|
})
|
||||||
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), {
|
bind("XF86AudioPrev", exec("playerctl previous"), {
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Previous track",
|
description = "Media: previous track",
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Screenshots
|
-- Screenshots
|
||||||
hl.bind("PRINT", hl.dsp.exec_cmd("hyprshot -m region --output-folder " .. var.screenshot_folder), {
|
bind("PRINT", exec("hyprshot -m region --output-folder " .. var.screenshot_folder), {
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Screenshot region",
|
description = "Screenshot region",
|
||||||
})
|
})
|
||||||
hl.bind("CTRL + PRINT", hl.dsp.exec_cmd("hyprshot -m window --output-folder " .. var.screenshot_folder), {
|
bind("CTRL + PRINT", exec("hyprshot -m window --output-folder " .. var.screenshot_folder), {
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Screenshot window",
|
description = "Screenshot window",
|
||||||
})
|
})
|
||||||
hl.bind("SHIFT + PRINT", hl.dsp.exec_cmd("hyprshot -m active --output-folder " .. var.screenshot_folder), {
|
bind("SHIFT + PRINT", exec("hyprshot -m active --output-folder " .. var.screenshot_folder), {
|
||||||
locked = true,
|
locked = true,
|
||||||
description = "Screenshot active monitor",
|
description = "Screenshot active monitor",
|
||||||
})
|
})
|
||||||
|
|
||||||
hl.bind(var.mainMod .. " + L", hl.dsp.exec_cmd(command.lock), { locked = true, description = "Lock screen" })
|
bind(var.mainMod .. " + L", exec(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)" })
|
bind(var.mainMod .. " + K", exec(command.keybinds_show), { description = "Keybinds: show overview" })
|
||||||
hl.bind(var.mainMod .. " + K", hl.dsp.exec_cmd(command.keybinds_show), { description = "Show keybind overview" })
|
bind(var.mainMod .. " + W", exec(command.wallpaper_select), { description = "Wallpaper select" })
|
||||||
hl.bind(var.mainMod .. " + W", hl.dsp.exec_cmd(command.wallpaper_select), { description = "Wallpaper select" })
|
|
||||||
|
|
||||||
-- Caelestia extras
|
-- Caelestia extras
|
||||||
hl.bind(var.mainMod .. " + SHIFT + V", hl.dsp.exec_cmd(command.clipboard), { description = "Clipboard history" })
|
if env.shell == "caelestia" then
|
||||||
hl.bind(var.mainMod .. " + period", hl.dsp.exec_cmd(command.emoji), { description = "Emoji picker" })
|
bind(var.mainMod .. " + SHIFT + V", exec(command.clipboard), { description = "Clipboard history" })
|
||||||
hl.bind(var.mainMod .. " + SHIFT + K", hl.dsp.exec_cmd(command.show_all), { description = "Toggle utilities" })
|
bind(var.mainMod .. " + SHIFT + K", exec(command.show_all), { description = "Toggle utilities" })
|
||||||
hl.bind("CTRL + ALT + C", hl.dsp.exec_cmd(command.clear_notifications), { description = "Clear notifications" })
|
bind("CTRL + ALT + C", exec(command.clear_notifications), { description = "Clear notifications" })
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Persist the registry for the show-keybinds picker
|
||||||
|
-- (scripts/show-keybinds.sh reads this TSV to resolve selected commands).
|
||||||
|
-- Runs on every config load/reload, keeping the picker in sync with the binds.
|
||||||
|
reg.write("/tmp/hypr-keybinds.tsv")
|
||||||
|
|||||||
@@ -253,5 +253,8 @@ hl.config({
|
|||||||
misc = {
|
misc = {
|
||||||
force_default_wallpaper = -1,
|
force_default_wallpaper = -1,
|
||||||
disable_hyprland_logo = false,
|
disable_hyprland_logo = false,
|
||||||
|
-- Both *_enables_dpms default to false, so a display left in DPMS-off
|
||||||
|
-- is unrecoverable without a TTY switch. A keypress should wake it.
|
||||||
|
key_press_enables_dpms = true,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
-- 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",
|
|
||||||
}
|
|
||||||
@@ -1,24 +1,52 @@
|
|||||||
-- Caelestia shell commands. This branch is caelestia-only;
|
local env = require("env")
|
||||||
-- 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 {
|
local commands = {
|
||||||
session = "caelestia shell drawers toggle session",
|
session = "",
|
||||||
logout = "hyprctl dispatch exit",
|
logout = "",
|
||||||
shutdown = "systemctl poweroff",
|
shutdown = "",
|
||||||
reboot = "systemctl reboot",
|
reboot = "",
|
||||||
menu = "caelestia shell drawers toggle launcher",
|
menu = "",
|
||||||
settings = "caelestia shell drawers toggle dashboard",
|
settings = "",
|
||||||
control_center = "caelestia shell drawers toggle sidebar",
|
control_center = "",
|
||||||
lock = "caelestia shell lock lock",
|
lock = "",
|
||||||
wallpaper_select = "caelestia shell drawers toggle launcher && sleep 0.1 && wtype \">wallpaper \"",
|
wallpaper_select = "",
|
||||||
clipboard = "caelestia clipboard",
|
keybinds_show = "sh ~/.config/hypr/scripts/show-keybinds.sh",
|
||||||
clipboard_delete = "caelestia clipboard -d",
|
clipboard = "",
|
||||||
emoji = "caelestia emoji -p",
|
clipboard_delete = "",
|
||||||
show_all = "caelestia shell drawers toggle utilities",
|
emoji = "",
|
||||||
clear_notifications = "caelestia shell notifs clear",
|
show_all = "",
|
||||||
keybinds_show = "sh ~/.config/hypr/scripts/show-keybinds.sh",
|
clear_notifications = "",
|
||||||
screensaver = "sh ~/.config/hypr/scripts/screensaver-start.sh force",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-- Noctalia
|
||||||
|
if env.shell == "noctalia" then
|
||||||
|
commands.session = "noctalia msg panel-toggle session"
|
||||||
|
commands.logout = "command -v noctalia >/dev/null 2>&1 && noctalia msg session logout || hyprctl dispatch exit"
|
||||||
|
commands.shutdown = "noctalia msg session shutdown"
|
||||||
|
commands.reboot = "noctalia msg session reboot"
|
||||||
|
commands.menu = "noctalia msg panel-toggle launcher"
|
||||||
|
commands.settings = "noctalia msg settings-toggle"
|
||||||
|
commands.control_center = "noctalia msg panel-toggle control-center"
|
||||||
|
commands.wallpaper_select = "noctalia msg panel-toggle wallpaper"
|
||||||
|
commands.lock = "noctalia msg session lock"
|
||||||
|
commands.emoji = "noctalia msg panel-toggle launcher '/emo '"
|
||||||
|
|
||||||
|
-- Caelesia
|
||||||
|
elseif env.shell == "caelestia" then
|
||||||
|
commands.session = "caelestia shell drawers toggle session"
|
||||||
|
commands.logout = "hyprctl dispatch exit"
|
||||||
|
commands.shutdown = "systemctl poweroff"
|
||||||
|
commands.reboot = "systemctl reboot"
|
||||||
|
commands.menu = "caelestia shell drawers toggle launcher"
|
||||||
|
commands.settings = "caelestia shell drawers toggle dashboard"
|
||||||
|
commands.control_center = "caelestia shell drawers toggle sidebar"
|
||||||
|
commands.wallpaper_select = 'caelestia shell drawers toggle launcher && sleep 0.1 && wtype ">wallpaper "'
|
||||||
|
commands.clipboard = "caelestia clipboard"
|
||||||
|
commands.clipboard_delete = "caelestia clipboard -d"
|
||||||
|
commands.emoji = "caelestia emoji -p"
|
||||||
|
commands.show_all = "caelestia shell drawers toggle utilities"
|
||||||
|
commands.clear_notifications = "caelestia shell notifs clear"
|
||||||
|
commands.lock = "caelestia shell lock lock"
|
||||||
|
end
|
||||||
|
|
||||||
|
return commands
|
||||||
|
|||||||
@@ -9,12 +9,17 @@ local theme = dofile(os.getenv("HOME") .. "/.config/themes/current/theme.lua")
|
|||||||
-- local var_menu = "noctalia msg panel-toggle launcher"
|
-- local var_menu = "noctalia msg panel-toggle launcher"
|
||||||
-- local var_screenshot_folder = "~/Bilder/Screenshots/"
|
-- local var_screenshot_folder = "~/Bilder/Screenshots/"
|
||||||
|
|
||||||
|
local terminal = "kitty"
|
||||||
|
|
||||||
return {
|
return {
|
||||||
color_active_border = theme.border_active,
|
color_active_border = theme.border_active,
|
||||||
color_inactive_border = theme.border_inactive,
|
color_inactive_border = theme.border_inactive,
|
||||||
color_decoration_shadow = theme.shadow,
|
color_decoration_shadow = theme.shadow,
|
||||||
mainMod = "SUPER",
|
mainMod = "SUPER",
|
||||||
terminal = "kitty",
|
terminal = terminal,
|
||||||
fileManager = "dolphin",
|
terminal_tmux = terminal .. " -e tmux",
|
||||||
|
fileManager = terminal .. " -e yazi", -- "dolphin",
|
||||||
screenshot_folder = "~/Bilder/Screenshots/",
|
screenshot_folder = "~/Bilder/Screenshots/",
|
||||||
|
internet_explorer = "firefox",
|
||||||
|
systemmonitor = terminal .. " -e btop",
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
-- See https://wiki.hypr.land/Configuring/Window-Rules/ for more
|
-- See https://wiki.hypr.land/Configuring/Window-Rules/ for more
|
||||||
|
|
||||||
-- See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules
|
-- See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules
|
||||||
@@ -62,7 +60,13 @@ hl.window_rule({
|
|||||||
match = {
|
match = {
|
||||||
class = ".*(kitty|dolphin).*",
|
class = ".*(kitty|dolphin).*",
|
||||||
},
|
},
|
||||||
opacity = "0.80 0.70",
|
opacity = "0.90 0.80",
|
||||||
|
})
|
||||||
|
hl.window_rule({
|
||||||
|
match = {
|
||||||
|
class = ".*keybinds.*",
|
||||||
|
},
|
||||||
|
opacity = "0.75 0.50",
|
||||||
})
|
})
|
||||||
-- Noctalia shell surfaces: blur bars/panels/dock/notifications and let
|
-- Noctalia shell surfaces: blur bars/panels/dock/notifications and let
|
||||||
-- Noctalia run its own animations (no Hyprland layer animation on top).
|
-- Noctalia run its own animations (no Hyprland layer animation on top).
|
||||||
@@ -103,36 +107,9 @@ hl.window_rule({
|
|||||||
border_size = 0,
|
border_size = 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Manual tte screensaver preview (SUPER+SHIFT+L): fullscreen kitty.
|
|
||||||
hl.window_rule({
|
hl.window_rule({
|
||||||
name = "screensaver-fullscreen",
|
name = "floating-windows",
|
||||||
match = {
|
|
||||||
class = "org.screensaver",
|
|
||||||
},
|
|
||||||
fullscreen = true,
|
|
||||||
float = true,
|
float = true,
|
||||||
|
match = { class = "(imv|.*hyprmod|.*[Bb]itwarden.*|ktouch)" },
|
||||||
|
size = "1080 920",
|
||||||
})
|
})
|
||||||
|
|
||||||
-- 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,54 @@
|
|||||||
|
-- Generated by Noctalia
|
||||||
|
|
||||||
|
local primary = "rgb(cba6f7)"
|
||||||
|
local surface = "rgb(1e1e2e)"
|
||||||
|
local on_surface = "rgb(cdd6f4)"
|
||||||
|
local secondary = "rgb(fab387)"
|
||||||
|
local on_secondary = "rgb(11111b)"
|
||||||
|
local error = "rgb(f38ba8)"
|
||||||
|
local on_error = "rgb(11111b)"
|
||||||
|
|
||||||
|
local function apply_theme()
|
||||||
|
hl.config({
|
||||||
|
general = {
|
||||||
|
col = {
|
||||||
|
active_border = primary,
|
||||||
|
inactive_border = surface,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
group = {
|
||||||
|
col = {
|
||||||
|
border_active = secondary,
|
||||||
|
border_inactive = surface,
|
||||||
|
border_locked_active = error,
|
||||||
|
border_locked_inactive = surface,
|
||||||
|
},
|
||||||
|
|
||||||
|
groupbar = {
|
||||||
|
col = {
|
||||||
|
active = secondary,
|
||||||
|
inactive = surface,
|
||||||
|
locked_active = error,
|
||||||
|
locked_inactive = surface,
|
||||||
|
},
|
||||||
|
text_color = on_secondary,
|
||||||
|
text_color_inactive = on_surface,
|
||||||
|
text_color_locked_active = on_error,
|
||||||
|
text_color_locked_inactive = on_surface,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
colors = {
|
||||||
|
primary = primary,
|
||||||
|
surface = surface,
|
||||||
|
on_surface = on_surface,
|
||||||
|
secondary = secondary,
|
||||||
|
on_secondary = on_secondary,
|
||||||
|
error = error,
|
||||||
|
on_error = on_error,
|
||||||
|
},
|
||||||
|
apply_theme = apply_theme
|
||||||
|
}
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
hyprland
|
|
||||||
// idle looks good on you
|
|
||||||
|
|
||||||
ArchTop is relaxing 🧘
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
|
|
||||||
|
|
||||||
set -eu # Exit immediately if a command exits with a non-zero status, and treat unset variables as an error.
|
|
||||||
|
|
||||||
CONF_SOURCE="$HOME/.config/hypr/env.conf.template"
|
|
||||||
CONF_TARGET="$HOME/.config/hypr/env.conf"
|
|
||||||
SH_SOURCE="$HOME/.config/hypr/env.sh.template"
|
|
||||||
SH_TARGET="$HOME/.config/hypr/env.sh"
|
|
||||||
|
|
||||||
|
|
||||||
if [ ! -f "$CONF_TARGET" ]; then
|
|
||||||
cp "$CONF_SOURCE" "$CONF_TARGET"
|
|
||||||
echo "Created $CONF_TARGET from template $CONF_SOURCE"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f "$SH_TARGET" ]; then
|
|
||||||
cp "$SH_SOURCE" "$SH_TARGET"
|
|
||||||
echo "Created $SH_TARGET from template $SH_SOURCE"
|
|
||||||
fi
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
#!/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
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
#!/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
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
#!/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
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
#!/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
|
|
||||||
@@ -1,94 +1,162 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# show-keybinds.sh — floating keybind overview popup.
|
# show-keybinds.sh — fuzzy, executable keybind picker.
|
||||||
#
|
#
|
||||||
# Reads the live keybind list from `hyprctl binds -j` and shows it in a
|
# SUPER+K opens a floating kitty (class `keybinds`, see
|
||||||
# floating kitty window (single column, sorted A-Z, searchable via less).
|
# windows_and_workspaces.lua) running fzf over the keybind list:
|
||||||
# Display-only: wofi/rofi are gone (the Noctalia launcher has no stdin-list
|
# - start typing immediately: the fzf prompt is focused on open
|
||||||
# mode), so picking a row to execute is not wired up.
|
# - arrow keys browse the (filtered) list
|
||||||
|
# - Enter executes the selected entry's command, then the picker closes
|
||||||
|
# - Esc closes without action
|
||||||
#
|
#
|
||||||
# Note: this config uses the Lua API (hl.bind), so `hyprctl binds -j` reports
|
# Display data is read live from `hyprctl binds -j`. The command behind each
|
||||||
# key + modmask + an opaque Lua registry reference instead of a readable
|
# entry cannot come from hyprctl — Lua-registered binds report as opaque
|
||||||
# dispatcher. The human-readable action comes from the `description` option
|
# `__lua` dispatchers there — so modules/keybind_registry.lua records every
|
||||||
# added to each hl.bind(...) call - keep those descriptions up to date when
|
# command at bind time and writes /tmp/hypr-keybinds.tsv on config load
|
||||||
# you change a bind.
|
# ("keys\x1fdescription\x1fcmd" lines). Entries without a recorded command
|
||||||
|
# (pure dispatchers like window.close) are informational only: Enter closes.
|
||||||
#
|
#
|
||||||
# Usage: show-keybinds.sh [--print]
|
# Usage: show-keybinds.sh [--print | --internal-pick FILE]
|
||||||
# --print print the formatted list to stdout instead of opening kitty
|
# --print print the formatted list to stdout (debug/testing)
|
||||||
# (handy for debugging / testing the formatting pipeline)
|
# --internal-pick F run fzf over picker file F and execute the selection
|
||||||
|
# (spawned by the default mode inside the kitty window)
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
readonly SEP=$'\x1f'
|
||||||
# modmask bits reported by hyprctl (XKB modifiers), pairwise bit:name in
|
# modmask bits reported by hyprctl (XKB modifiers), pairwise bit:name in
|
||||||
# display order. See https://wiki.hypr.land/Configuring/Binds/
|
# 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)
|
readonly MOD_ORDER=(64 SUPER 8 ALT 4 CTRL 1 SHIFT 2 CAPS 16 MOD2 32 MOD3 128 MOD5)
|
||||||
|
readonly SIDECAR=/tmp/hypr-keybinds.tsv
|
||||||
|
|
||||||
if ! hyprctl binds -j >/dev/null 2>&1; then
|
# --internal-pick mode: runs INSIDE the floating kitty. fzf over the picker
|
||||||
echo "hyprctl binds failed - are you inside a Hyprland session?" >&2
|
# list (lines are "cmd\x1fdisplay"), then execute the chosen command and let
|
||||||
|
# the window close.
|
||||||
|
if [[ "${1:-}" == "--internal-pick" ]]; then
|
||||||
|
pick_file="${2:-}"
|
||||||
|
if [[ -z "$pick_file" || ! -s "$pick_file" ]]; then
|
||||||
|
echo "show-keybinds: --internal-pick needs an existing picker list file" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# `|| rc=$?` keeps `set -e` from aborting before cleanup when fzf is
|
||||||
|
# cancelled (e.g. Esc) or filters to no match.
|
||||||
|
rc=0
|
||||||
|
sel="$(fzf --delimiter "$SEP" --with-nth 2.. --cycle --info=inline \
|
||||||
|
--prompt 'keybinds> ' --header 'type to filter · Enter executes · Esc closes' \
|
||||||
|
<"$pick_file")" || rc=$?
|
||||||
|
rm -f "$pick_file"
|
||||||
|
if ((rc != 0)) || [[ -z "$sel" ]]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
cmd="${sel%%"$SEP"*}"
|
||||||
|
if [[ -n "$cmd" ]]; then
|
||||||
|
# Detach into its own session so the command outlives the picker
|
||||||
|
# window (kitty/pty teardown would otherwise signal its process group).
|
||||||
|
setsid -f sh -c "$cmd" >/dev/null 2>&1 </dev/null
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Gather rows: prefer the sidecar (has commands); fall back to live `hyprctl
|
||||||
|
# binds -j` (display only, e.g. right after a fresh clone without a reload).
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
have_sidecar=0
|
||||||
|
if [[ -s "$SIDECAR" ]]; then
|
||||||
|
have_sidecar=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ((! have_sidecar)) && ! hyprctl binds -j >/dev/null 2>&1; then
|
||||||
|
echo "show-keybinds: nothing to show: no keybind registry ($SIDECAR) and no Hyprland session" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rows=()
|
rows=()
|
||||||
|
cmds=()
|
||||||
|
keys=()
|
||||||
|
|
||||||
# modmask\x1fkey\x1fdescription\x1fsubmap\x1farg
|
if ((have_sidecar)); then
|
||||||
# Fields are joined with the unit separator (0x1f): tabs are IFS-whitespace
|
while IFS="$SEP" read -r key description cmd; do
|
||||||
# and `read` would collapse consecutive tabs, eating empty middle fields
|
key="${key//mouse:272/LMB}"
|
||||||
# like the (usually empty) submap. \x1f is not whitespace, so every field
|
key="${key//mouse:273/RMB}"
|
||||||
# keeps its position.
|
if [[ -z "$description" ]]; then
|
||||||
while IFS=$'\x1f' read -r modmask key description submap arg; do
|
description="(no description)"
|
||||||
# Humanize mouse-button binds.
|
fi
|
||||||
case "$key" in
|
rows+=("$(printf '%-26s %s' "$key" "$description")")
|
||||||
|
cmds+=("$cmd")
|
||||||
|
keys+=("$key")
|
||||||
|
done <"$SIDECAR"
|
||||||
|
else
|
||||||
|
while IFS="$SEP" read -r modmask key description submap; do
|
||||||
|
case "$key" in
|
||||||
mouse:272) key="LMB" ;;
|
mouse:272) key="LMB" ;;
|
||||||
mouse:273) key="RMB" ;;
|
mouse:273) key="RMB" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Build the chord, e.g. "SUPER + SHIFT + Q".
|
chord=""
|
||||||
chord=""
|
# Rebuild "SUPER + SHIFT + Q" from the modmask bits.
|
||||||
i=0
|
i=0
|
||||||
while (( i < ${#MOD_ORDER[@]} )); do
|
while ((i < ${#MOD_ORDER[@]})); do
|
||||||
bit=${MOD_ORDER[i]}
|
bit=${MOD_ORDER[i]}
|
||||||
name=${MOD_ORDER[i + 1]}
|
name=${MOD_ORDER[i + 1]}
|
||||||
if (( modmask & bit )); then
|
if ((modmask & bit)); then
|
||||||
chord+="${name} + "
|
chord+="${name} + "
|
||||||
|
fi
|
||||||
|
i=$((i + 2))
|
||||||
|
done
|
||||||
|
chord+="$key"
|
||||||
|
|
||||||
|
if [[ -n "$submap" ]]; then
|
||||||
|
chord="[$submap] $chord"
|
||||||
fi
|
fi
|
||||||
i=$((i + 2))
|
|
||||||
done
|
|
||||||
chord+="$key"
|
|
||||||
|
|
||||||
if [[ -n "$submap" ]]; then
|
if [[ -n "$description" ]]; then
|
||||||
chord="[$submap] $chord"
|
rows+=("$(printf '%-26s %s' "$chord" "$description")")
|
||||||
fi
|
else
|
||||||
|
rows+=("$(printf '%-26s %s' "$chord" "(no description)")")
|
||||||
|
fi
|
||||||
|
cmds+=("")
|
||||||
|
keys+=("$chord")
|
||||||
|
done < <(hyprctl binds -j | jq -r '.[] | [(.modmask | tostring), .key, .description, .submap] | join("\u001f")')
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ -n "$description" ]]; then
|
if ((${#rows[@]} == 0)); then
|
||||||
rows+=("$(printf '%-26s %s' "$chord" "$description")")
|
echo "show-keybinds: no keybinds found." >&2
|
||||||
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Drop duplicate chords (e.g. media keys bound twice with different flags),
|
# Drop duplicate chords (e.g. media keys bound twice with different flags),
|
||||||
# then sort alphabetically (A-Z).
|
# keeping the first occurrence; carry the matching cmd along. Then sort by
|
||||||
mapfile -t rows < <(printf '%s\n' "${rows[@]}" | awk '{ c = $0; sub(/ {2,}.*/, "", c); if (!seen[c]++) print }' | LC_ALL=C sort -f)
|
# the display column A-Z.
|
||||||
|
declare -A seen=()
|
||||||
|
lines=()
|
||||||
|
for i in "${!rows[@]}"; do
|
||||||
|
if [[ -z "${seen[${keys[$i]}]:-}" ]]; then
|
||||||
|
seen["${keys[$i]}"]=1
|
||||||
|
lines+=("${cmds[$i]}$SEP${rows[$i]}")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
mapfile -t lines < <(printf '%s\n' "${lines[@]}" | LC_ALL=C sort -f -t "$SEP" -k2.29,2)
|
||||||
|
|
||||||
if [[ "${1:-}" == "--print" ]]; then
|
if [[ "${1:-}" == "--print" ]]; then
|
||||||
printf '%s\n' "${rows[@]}"
|
printf '%s\n' "${lines[@]}" | cut -d "$SEP" -f2-
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
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
|
# Default mode: floating kitty + fzf. Rows go through a temp file; the inner
|
||||||
# popup does not depend on kitty forwarding stdin to its child; the previous
|
# --internal-pick run removes it when done, stale leftovers get cleaned on the
|
||||||
# run's file is cleaned up on the next invocation. q closes the window.
|
# next invocation.
|
||||||
rm -f /tmp/keybinds.??????.txt 2>/dev/null || true
|
# ---------------------------------------------------------------------------
|
||||||
|
rm -f /tmp/keybinds.??????.list 2>/dev/null || true
|
||||||
|
list="$(mktemp /tmp/keybinds.XXXXXX.list)"
|
||||||
|
printf '%s\n' "${lines[@]}" >"$list"
|
||||||
|
|
||||||
if command -v kitty >/dev/null 2>&1; then
|
if command -v kitty >/dev/null 2>&1; then
|
||||||
tmp="$(mktemp /tmp/keybinds.XXXXXX.txt)"
|
kitty --override font_size=16 --class keybinds --title Keybinds "$0" \
|
||||||
printf '%s\n' "${rows[@]}" > "$tmp"
|
--internal-pick "$list"
|
||||||
kitty --class keybinds --title Keybinds less -S "$tmp"
|
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
printf '%s\n' "${rows[@]}"
|
# No kitty: fall back to a plain printout.
|
||||||
|
printf '%s\n' "${lines[@]}" | cut -d "$SEP" -f2-
|
||||||
|
rm -f "$list"
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
color0 #45475a
|
||||||
|
color1 #f38ba8
|
||||||
|
color2 #a6e3a1
|
||||||
|
color3 #f9e2af
|
||||||
|
color4 #89b4fa
|
||||||
|
color5 #f5c2e7
|
||||||
|
color6 #94e2d5
|
||||||
|
color7 #a6adc8
|
||||||
|
color8 #585b70
|
||||||
|
color9 #f37799
|
||||||
|
color10 #89d88b
|
||||||
|
color11 #ebd391
|
||||||
|
color12 #74a8fc
|
||||||
|
color13 #f2aede
|
||||||
|
color14 #6bd7ca
|
||||||
|
color15 #bac2de
|
||||||
|
|
||||||
|
cursor #f5e0dc
|
||||||
|
cursor_text_color #1e1e2e
|
||||||
|
background #1e1e2e
|
||||||
|
foreground #cdd6f4
|
||||||
|
selection_foreground #cdd6f4
|
||||||
|
selection_background #585b70
|
||||||
|
active_border_color #cba6f7
|
||||||
|
inactive_border_color #313244
|
||||||
|
url_color #cba6f7
|
||||||
|
|
||||||
|
active_tab_foreground #11111b
|
||||||
|
active_tab_background #cba6f7
|
||||||
|
inactive_tab_foreground #a3b4eb
|
||||||
|
inactive_tab_background #313244
|
||||||
|
cursor_trail_color #a3b4eb
|
||||||
@@ -1,66 +1,153 @@
|
|||||||
# Portable Noctalia config — generated by noctalia-sync-from-gui.sh.
|
|
||||||
# Validate with: noctalia config validate ~/.config/noctalia/config.toml
|
|
||||||
|
|
||||||
[bar.default]
|
[bar.default]
|
||||||
background_opacity = 0.52
|
background_opacity = 0.50999998860061169
|
||||||
capsule = false
|
capsule = true
|
||||||
center = []
|
center = [ "session", "launcher", "control-center", "wallpaper" ]
|
||||||
end = []
|
end = [
|
||||||
|
"tray",
|
||||||
|
"notifications",
|
||||||
|
"network",
|
||||||
|
"bluetooth",
|
||||||
|
"volume",
|
||||||
|
"brightness",
|
||||||
|
"temp",
|
||||||
|
"cpu",
|
||||||
|
"sysmon",
|
||||||
|
"battery",
|
||||||
|
"clock"
|
||||||
|
]
|
||||||
margin_ends = 0
|
margin_ends = 0
|
||||||
panel_overlap = 0
|
panel_overlap = 0
|
||||||
position = "bottom"
|
position = "bottom"
|
||||||
radius = 0
|
radius = 0
|
||||||
start = []
|
start = [ "workspaces", "media" ]
|
||||||
thickness = 28
|
thickness = 28
|
||||||
|
|
||||||
|
[desktop_widgets]
|
||||||
|
enabled = false
|
||||||
|
schema_version = 2
|
||||||
|
widget_order = []
|
||||||
|
|
||||||
|
[desktop_widgets.grid]
|
||||||
|
cell_size = 16
|
||||||
|
major_interval = 4
|
||||||
|
visible = true
|
||||||
|
|
||||||
|
[desktop_widgets.widget]
|
||||||
|
|
||||||
[dock]
|
[dock]
|
||||||
background_opacity = 0.68
|
background_opacity = 0.67999998480081558
|
||||||
|
|
||||||
|
[idle]
|
||||||
|
behavior_order = [ "backlight-dim", "kbd-off", "lock", "screen-off", "suspend" ]
|
||||||
|
|
||||||
|
[idle.behavior.backlight-dim]
|
||||||
|
action = "command"
|
||||||
|
command = "brightnessctl -s set 10"
|
||||||
|
enabled = true
|
||||||
|
resume_command = "brightnessctl -r"
|
||||||
|
timeout = 300.0
|
||||||
|
|
||||||
|
[idle.behavior.kbd-off]
|
||||||
|
action = "command"
|
||||||
|
command = "brightnessctl -sd rgb:kbd_backlight set 0"
|
||||||
|
enabled = true
|
||||||
|
resume_command = "brightnessctl -rd rgb:kbd_backlight"
|
||||||
|
timeout = 300.0
|
||||||
|
|
||||||
|
[idle.behavior.lock]
|
||||||
|
action = "lock"
|
||||||
|
enabled = true
|
||||||
|
timeout = 900.0
|
||||||
|
|
||||||
|
[idle.behavior.screen-off]
|
||||||
|
action = "screen_off"
|
||||||
|
enabled = false
|
||||||
|
timeout = 1800.0
|
||||||
|
|
||||||
|
[idle.behavior.suspend]
|
||||||
|
action = "lock_and_suspend"
|
||||||
|
enabled = true
|
||||||
|
timeout = 2700.0
|
||||||
|
|
||||||
|
[keybinds]
|
||||||
|
down = [ "Down", "Ctrl+j" ]
|
||||||
|
left = [ "Left", "Ctrl+h" ]
|
||||||
|
right = [ "Right", "Ctrl+l" ]
|
||||||
|
up = [ "Up", "Ctrl+k" ]
|
||||||
|
|
||||||
|
[location]
|
||||||
|
auto_locate = true
|
||||||
|
|
||||||
[lockscreen_widgets]
|
[lockscreen_widgets]
|
||||||
enabled = false
|
enabled = false
|
||||||
schema_version = 2
|
schema_version = 2
|
||||||
|
widget_order = [ "lockscreen-login-box@eDP-1" ]
|
||||||
|
|
||||||
|
[lockscreen_widgets.grid]
|
||||||
|
cell_size = 16
|
||||||
|
major_interval = 4
|
||||||
|
visible = true
|
||||||
|
|
||||||
|
[lockscreen_widgets.widget."lockscreen-login-box@eDP-1"]
|
||||||
|
box_height = 196.0
|
||||||
|
box_width = 810.0
|
||||||
|
cx = 960.0
|
||||||
|
cy = 898.0
|
||||||
|
output = "eDP-1"
|
||||||
|
placement_height = 1080.0
|
||||||
|
placement_width = 1920.0
|
||||||
|
rotation = 0.0
|
||||||
|
type = "login_box"
|
||||||
|
|
||||||
|
[lockscreen_widgets.widget."lockscreen-login-box@eDP-1".settings]
|
||||||
|
background_color = "surface_variant"
|
||||||
|
background_opacity = 0.88
|
||||||
|
background_radius = 12.0
|
||||||
|
center_password_text = false
|
||||||
|
input_opacity = 1.0
|
||||||
|
input_radius = 6.0
|
||||||
|
layout = "regular"
|
||||||
|
show_caps_lock = true
|
||||||
|
show_keyboard_layout = true
|
||||||
|
show_login_button = true
|
||||||
|
show_media = true
|
||||||
|
show_session_buttons = true
|
||||||
|
show_unlock_hint = true
|
||||||
|
show_weather = true
|
||||||
|
|
||||||
[shell]
|
[shell]
|
||||||
font_family = "JetBrainsMono Nerd Font Mono"
|
font_family = "JetBrainsMono Nerd Font Mono"
|
||||||
|
telemetry_enabled = true
|
||||||
|
|
||||||
[shell.panel]
|
[shell.panel]
|
||||||
launcher_placement = "attached"
|
launcher_placement = "attached"
|
||||||
transparency_mode = "glass"
|
transparency_mode = "glass"
|
||||||
|
|
||||||
[theme]
|
[theme]
|
||||||
mode = "dark"
|
|
||||||
builtin = "Catppuccin"
|
builtin = "Catppuccin"
|
||||||
|
mode = "dark"
|
||||||
|
|
||||||
[theme.templates]
|
[theme.templates]
|
||||||
enable_builtin_templates = true
|
builtin_ids = [ "gtk3", "gtk4", "hyprland", "kitty" ]
|
||||||
builtin_ids = []
|
enable_builtin_templates = true
|
||||||
|
|
||||||
[wallpaper]
|
[wallpaper]
|
||||||
directory = ""
|
directory = "/home/mathias/nextcloud/Photos/Wallpapers"
|
||||||
|
|
||||||
[idle]
|
[wallpaper.default]
|
||||||
behavior_order = ["backlight-dim", "kbd-off", "lock", "screen-off", "suspend"]
|
path = "/home/mathias/nextcloud/Photos/Wallpapers/eigen/20180318-4825-Teneriffa_LaPalma-2.jpg"
|
||||||
|
|
||||||
[idle.behavior.backlight-dim]
|
[wallpaper.last]
|
||||||
timeout = 300
|
path = "/home/mathias/nextcloud/Photos/Wallpapers/eigen/20180318-4825-Teneriffa_LaPalma-2.jpg"
|
||||||
action = "command"
|
|
||||||
command = "brightnessctl -s set 10"
|
|
||||||
resume_command = "brightnessctl -r"
|
|
||||||
|
|
||||||
[idle.behavior.kbd-off]
|
[wallpaper.monitors.eDP-1]
|
||||||
timeout = 300
|
path = "/home/mathias/nextcloud/Photos/Wallpapers/eigen/20180318-4825-Teneriffa_LaPalma-2.jpg"
|
||||||
action = "command"
|
|
||||||
command = "brightnessctl -sd rgb:kbd_backlight set 0"
|
|
||||||
resume_command = "brightnessctl -rd rgb:kbd_backlight"
|
|
||||||
|
|
||||||
[idle.behavior.lock]
|
[widget.clock]
|
||||||
timeout = 900
|
format = "{:%Y-%m-%d|%H:%M}"
|
||||||
action = "lock"
|
|
||||||
|
|
||||||
[idle.behavior.screen-off]
|
[widget.network]
|
||||||
timeout = 1800
|
show_label = false
|
||||||
action = "screen_off"
|
|
||||||
|
|
||||||
[idle.behavior.suspend]
|
[widget.sysmon]
|
||||||
timeout = 2700
|
stat = "gpu_usage"
|
||||||
action = "lock_and_suspend"
|
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
# Notizen
|
||||||
|
|
||||||
|
## Buntes-Monster mit NFS verbinden
|
||||||
|
|
||||||
|
### Server-Seite (Buntes-Monster)
|
||||||
|
|
||||||
|
`nfs-utils` installieren
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo pacman -S nfs-utils
|
||||||
|
```
|
||||||
|
|
||||||
|
Datei `/etc/exports` bearbeiten: Zeilen anfügen:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/mnt/anbau 192.168.0.0/24(rw,sync,no_subtree_check)
|
||||||
|
/mnt/bilder 192.168.0.0/24(rw,sync,no_subtree_check)
|
||||||
|
```
|
||||||
|
|
||||||
|
Apply exports configuration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo exportfs -rav
|
||||||
|
```
|
||||||
|
|
||||||
|
Or restart the NFS service to reload
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl restart nfs-server
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable NFS Service at Boot
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl enable --now nfs-server
|
||||||
|
```
|
||||||
|
|
||||||
|
### Server-Seite
|
||||||
|
|
||||||
|
`nfs-utils` installieren
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo pacman -S nfs-utils
|
||||||
|
```
|
||||||
|
|
||||||
|
`/etc/fstab`: Zeilen hinzufügen:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
buntes-monster:/mnt/anbau /mnt/anbau nfs rw,sync,addr=192.168.0.4 0 0
|
||||||
|
buntes-monster:/mnt/bilder /mnt/bilder nfs rw,sync,addr=192.168.0.4 0 0
|
||||||
|
```
|
||||||
|
|
||||||
|
(Annahmen: IP buntes-monster: 192.168.0.4)
|
||||||
|
|
||||||
|
Eiträge hinzufügen. Danach Mounts laden:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo mount -a
|
||||||
|
```
|
||||||
|
|
||||||
|
## FSTAB
|
||||||
|
|
||||||
|
`fstab` bearbeiten füt automatische Mounts:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nvim /etc/fstab
|
||||||
|
```
|
||||||
|
|
||||||
|
Eiträge hinzufügen. Danach Mounts laden:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo mount -a
|
||||||
|
```
|
||||||
|
|
||||||
|
### hidrive
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mathias2784@sftp.hidrive.strato.com:/users/mathias2784 /mnt/hidrive fuse.sshfs defaults,_netdev,IdentityFile=/home/mathias/.ssh/id_ed25519,allow_other 0 0
|
||||||
|
```
|
||||||
|
|
||||||
|
### NAS
|
||||||
|
|
||||||
|
```bash
|
||||||
|
//192.168.0.14/Mathias /mnt/nas/mathias cifs credentials=/home/mathias/.nascred,uid=1000,gid=1000,iocharset=utf8,vers=3.1.1,rsize=65536,wsize=65536,cache=strict,noatime 0 0
|
||||||
|
//192.168.0.14/Gemeinsam /mnt/nas/gemeinsam cifs credentials=/home/mathias/.nascred,uid=1000,gid=1000,iocharset=utf8,vers=3.1.1,rsize=65536,wsize=65536,cache=strict,noatime 0 0
|
||||||
|
```
|
||||||
+12
-5
@@ -1,10 +1,15 @@
|
|||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Hyprland compositor package list for setup/hypr/setup.sh
|
# Hyprland compositor package list for setup/hypr/setup.sh
|
||||||
#
|
#
|
||||||
# Wayland compositor, screenshot tool and supporting utilities. The desktop
|
# Wayland compositor, screenshot tool and supporting utilities. Both desktop
|
||||||
# shell (bar, launcher, notifications, lock screen, wallpaper, idle, session
|
# shell frontends are installed: Noctalia and Caelestia. Select the one started
|
||||||
# menu) on this branch is Caelestia (see hypr/.config/hypr/hyprland.lua:
|
# by Hyprland in hypr/.config/hypr/env.lua.
|
||||||
# `caelestia shell -d`). Noctalia lives on main.
|
#
|
||||||
|
# Caelestia requires the upstream `quickshell-git` build. The explicit
|
||||||
|
# `aur/` source prefix below is intentional: yay's --aur mode alone can still
|
||||||
|
# select a repository provider. Do not substitute `noctalia-qs`; although it
|
||||||
|
# provides `quickshell-git`, that fork is incompatible with Caelestia's
|
||||||
|
# Quickshell pragmas.
|
||||||
#
|
#
|
||||||
# - Lines starting with '#' and blank lines are ignored.
|
# - Lines starting with '#' and blank lines are ignored.
|
||||||
# - Use "@pacman", "@aur" or "@npm" markers to switch section.
|
# - Use "@pacman", "@aur" or "@npm" markers to switch section.
|
||||||
@@ -14,6 +19,7 @@
|
|||||||
@pacman
|
@pacman
|
||||||
hyprland
|
hyprland
|
||||||
hypridle
|
hypridle
|
||||||
|
hyprpm
|
||||||
xdg-desktop-portal-hyprland
|
xdg-desktop-portal-hyprland
|
||||||
hyprpolkitagent
|
hyprpolkitagent
|
||||||
pantheon-shortcut-overlay
|
pantheon-shortcut-overlay
|
||||||
@@ -21,12 +27,13 @@ wev
|
|||||||
wl-clipboard
|
wl-clipboard
|
||||||
hyprshot
|
hyprshot
|
||||||
brightnessctl
|
brightnessctl
|
||||||
|
noctalia
|
||||||
wtype
|
wtype
|
||||||
|
|
||||||
@aur
|
@aur
|
||||||
hyprmod
|
hyprmod
|
||||||
caelestia-shell
|
caelestia-shell
|
||||||
caelestia-cli
|
caelestia-cli
|
||||||
quickshell-git
|
aur/quickshell-git
|
||||||
hyprsaver
|
hyprsaver
|
||||||
python-terminaltexteffects
|
python-terminaltexteffects
|
||||||
|
|||||||
+59
-3
@@ -7,6 +7,62 @@ PACKAGES_FILE="$SETUP_DIR/packages.txt"
|
|||||||
# shellcheck source=../lib/common.sh
|
# shellcheck source=../lib/common.sh
|
||||||
source "$SETUP_DIR/../lib/common.sh"
|
source "$SETUP_DIR/../lib/common.sh"
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Create the local shell selection from the tracked example exactly once.
|
||||||
|
# env.lua is ignored by Git so each machine can keep its own choice.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
ensure_shell_config() {
|
||||||
|
local config_dir example_file config_file
|
||||||
|
|
||||||
|
config_dir="$(repo_root)/hypr/.config/hypr"
|
||||||
|
example_file="$config_dir/env.example.lua"
|
||||||
|
config_file="$config_dir/env.lua"
|
||||||
|
|
||||||
|
if [[ -e "$config_file" || -L "$config_file" ]]; then
|
||||||
|
echo "==> Behalte lokale Shell-Auswahl: $config_file"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> Erstelle lokale Shell-Auswahl aus env.example.lua ..."
|
||||||
|
cp "$example_file" "$config_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Keep Caelestia on upstream Quickshell.
|
||||||
|
#
|
||||||
|
# noctalia-qs can satisfy pacman's virtual quickshell-git dependency, but its
|
||||||
|
# parser is not compatible with Caelestia. The explicit aur/quickshell-git
|
||||||
|
# target bypasses that provider, then setup verifies that /usr/bin/qs really
|
||||||
|
# belongs to quickshell-git.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
warn_about_quickshell_provider() {
|
||||||
|
if pacman -Q noctalia-qs >/dev/null 2>&1; then
|
||||||
|
log "noctalia-qs ist installiert; die AUR-Transaktion ersetzt es durch quickshell-git."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
verify_quickshell_runtime() {
|
||||||
|
local owner
|
||||||
|
|
||||||
|
if pacman -Q noctalia-qs >/dev/null 2>&1; then
|
||||||
|
echo "Fehler: noctalia-qs ist weiterhin installiert; Caelestia benoetigt AUR quickshell-git." >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! pacman -Q quickshell-git >/dev/null 2>&1; then
|
||||||
|
echo "Fehler: AUR-Paket quickshell-git wurde nicht installiert." >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
owner="$(pacman -Qoq /usr/bin/qs 2>/dev/null || true)"
|
||||||
|
if [[ "$owner" != "quickshell-git" ]]; then
|
||||||
|
echo "Fehler: /usr/bin/qs gehoert zu '$owner' statt zu quickshell-git." >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Quickshell-Runtime geprueft: quickshell-git"
|
||||||
|
}
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Post-install: run Hyprland environment & desktop integration scripts.
|
# Post-install: run Hyprland environment & desktop integration scripts.
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
@@ -14,9 +70,6 @@ run_hypr_scripts() {
|
|||||||
local scripts_dir
|
local scripts_dir
|
||||||
scripts_dir="$(repo_root)/hypr/.config/hypr/scripts"
|
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 ..."
|
echo "==> Fuehre portal-host-override.sh aus ..."
|
||||||
bash "$scripts_dir/portal-host-override.sh"
|
bash "$scripts_dir/portal-host-override.sh"
|
||||||
|
|
||||||
@@ -33,8 +86,11 @@ main() {
|
|||||||
echo "==> Lese Paketliste: $PACKAGES_FILE"
|
echo "==> Lese Paketliste: $PACKAGES_FILE"
|
||||||
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
|
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
|
||||||
|
|
||||||
|
warn_about_quickshell_provider
|
||||||
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
|
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
|
||||||
|
verify_quickshell_runtime
|
||||||
|
|
||||||
|
ensure_shell_config
|
||||||
run_hypr_scripts
|
run_hypr_scripts
|
||||||
|
|
||||||
echo "Fertig. Hyprland und das Compositor-Okosystem sind eingerichtet."
|
echo "Fertig. Hyprland und das Compositor-Okosystem sind eingerichtet."
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ surge-xt
|
|||||||
lsp-plugins
|
lsp-plugins
|
||||||
calf
|
calf
|
||||||
dragonfly-reverb
|
dragonfly-reverb
|
||||||
|
darktable
|
||||||
|
gimp
|
||||||
|
|
||||||
@aur
|
@aur
|
||||||
numaplayer
|
numaplayer
|
||||||
|
|||||||
+3
-1
@@ -68,7 +68,9 @@ install_aur_pkgs() {
|
|||||||
local -n _pkgs="$1"
|
local -n _pkgs="$1"
|
||||||
if ((${#_pkgs[@]})); then
|
if ((${#_pkgs[@]})); then
|
||||||
log "Installiere AUR-Pakete: ${_pkgs[*]}"
|
log "Installiere AUR-Pakete: ${_pkgs[*]}"
|
||||||
yay -S --needed "${_pkgs[@]}"
|
# --aur selects yay's AUR mode. For names that a repository package
|
||||||
|
# can also provide, use an explicit aur/<package> target in the list.
|
||||||
|
yay -S --aur --needed "${_pkgs[@]}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,10 @@ fzf
|
|||||||
locate
|
locate
|
||||||
ttf-jetbrains-mono-nerd
|
ttf-jetbrains-mono-nerd
|
||||||
ttf-font-awesome
|
ttf-font-awesome
|
||||||
|
btop
|
||||||
|
yt-dlp
|
||||||
|
ffmpeg
|
||||||
|
jc
|
||||||
|
|
||||||
@aur
|
@aur
|
||||||
opencode
|
opencode
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
@pacman
|
@pacman
|
||||||
|
firefox
|
||||||
nextcloud-client
|
nextcloud-client
|
||||||
thunderbird
|
thunderbird
|
||||||
ktouch
|
ktouch
|
||||||
@@ -20,3 +21,12 @@ wine-mono
|
|||||||
wine-gecko
|
wine-gecko
|
||||||
winetricks
|
winetricks
|
||||||
rbw
|
rbw
|
||||||
|
nfs-utils
|
||||||
|
code
|
||||||
|
imv
|
||||||
|
bitwarden
|
||||||
|
|
||||||
|
@aur
|
||||||
|
supersonic-desktop
|
||||||
|
subtui
|
||||||
|
localsend
|
||||||
|
|||||||
@@ -46,3 +46,8 @@ fi
|
|||||||
if command -v fastfetch >/dev/null 2>&1; then
|
if command -v fastfetch >/dev/null 2>&1; then
|
||||||
fastfetch --config ~/.config/fastfetch/config.jsonc
|
fastfetch --config ~/.config/fastfetch/config.jsonc
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Added by LM Studio CLI (lms)
|
||||||
|
export PATH="$PATH:/home/mathias/.lmstudio/bin"
|
||||||
|
# End of LM Studio CLI section
|
||||||
|
|
||||||
|
|||||||
@@ -141,3 +141,16 @@ export HSA_OVERRIDE_GFX_VERSION=11.0.0
|
|||||||
export HIP_VISIBLE_DEVICES=0
|
export HIP_VISIBLE_DEVICES=0
|
||||||
|
|
||||||
fish_add_path -m $HOME/.local/bin
|
fish_add_path -m $HOME/.local/bin
|
||||||
|
|
||||||
|
|
||||||
|
# My shortcuts
|
||||||
|
alias fdh="fd -H"
|
||||||
|
alias fdhi="fd -HI"
|
||||||
|
alias rgh="rg --hidden"
|
||||||
|
alias rghi="rg --hidden --no-ignore"
|
||||||
|
|
||||||
|
export PATH="$HOME/.cargo/bin:$PATH"
|
||||||
|
# Added by LM Studio CLI (lms)
|
||||||
|
|
||||||
|
set -gx PATH $PATH /home/mathias/.lmstudio/bin
|
||||||
|
# End of LM Studio CLI section
|
||||||
|
|||||||
@@ -207,6 +207,13 @@ A feature-rich Neovim setup optimized for Python, JSON, and CSV development.
|
|||||||
- **Linting**: ESLint LSP (fix with `<leader>fx`, or use `<leader>fA` for fix-all actions)
|
- **Linting**: ESLint LSP (fix with `<leader>fx`, or use `<leader>fA` for fix-all actions)
|
||||||
- **Formatting**: Prettier via `<leader>lf`
|
- **Formatting**: Prettier via `<leader>lf`
|
||||||
|
|
||||||
|
### HTML (.html)
|
||||||
|
- **Auto-close tags**: typing `<div` + `>` inserts `</div>` automatically (`nvim-ts-autotag`)
|
||||||
|
- **Auto-rename tags**: `ciw` on an opening tag renames the matching closing tag
|
||||||
|
- **Enter between tags**: expands to indented lines via Treesitter indenting
|
||||||
|
- **Also applies to**: `.vue`, `.tsx`, `.jsx`, `.svelte`, `.astro`, `.xml`, `.php`, `.hbs`
|
||||||
|
- **Requires** the Treesitter parser for the filetype (already auto-installed for html/vue/tsx)
|
||||||
|
|
||||||
### CSV (.csv)
|
### CSV (.csv)
|
||||||
- **Treesitter**: Syntax highlighting
|
- **Treesitter**: Syntax highlighting
|
||||||
- **No wrap**: Full row visibility
|
- **No wrap**: Full row visibility
|
||||||
|
|||||||
@@ -17,11 +17,22 @@ return {
|
|||||||
css = { "prettier" },
|
css = { "prettier" },
|
||||||
scss = { "prettier" },
|
scss = { "prettier" },
|
||||||
yaml = { "prettier" },
|
yaml = { "prettier" },
|
||||||
markdown = { "prettier" },
|
markdown = { "prettier_markdown" },
|
||||||
sh = { "shfmt" },
|
sh = { "shfmt" },
|
||||||
bash = { "shfmt" },
|
bash = { "shfmt" },
|
||||||
rust = { "rustfmt" },
|
rust = { "rustfmt" },
|
||||||
},
|
},
|
||||||
|
formatters = {
|
||||||
|
prettier_markdown = {
|
||||||
|
inherit = "prettier",
|
||||||
|
prepend_args = {
|
||||||
|
"--prose-wrap",
|
||||||
|
"always",
|
||||||
|
"--print-width",
|
||||||
|
"80",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
vim.keymap.set({ "n", "v" }, "<leader>lf", function()
|
vim.keymap.set({ "n", "v" }, "<leader>lf", function()
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
--[[
|
||||||
|
TS-AUTOTAG.LUA
|
||||||
|
|
||||||
|
Auto-close and auto-rename HTML/XML-style tags via Treesitter.
|
||||||
|
|
||||||
|
Why this exists: nvim-autopairs (see autopairs.lua) only handles brackets,
|
||||||
|
quotes and endwise pairs -- it never creates a closing tag. Its only
|
||||||
|
HTML-aware rule fires on <CR> when a close tag ALREADY exists after the
|
||||||
|
cursor, so it can re-indent a pair but cannot create one. This plugin
|
||||||
|
fills that gap: typing `<div` + `>` yields `<div></div>` with the cursor
|
||||||
|
in between, and `ciw` on an opening tag renames its closing counterpart.
|
||||||
|
|
||||||
|
Requires the matching Treesitter parsers. `html`, `vue`, `tsx` and
|
||||||
|
`javascript` are already in treesitter.lua's `ensure_installed` list, and
|
||||||
|
the plugin no-ops in filetypes whose parser is missing, so a fresh machine
|
||||||
|
just needs a restart after the parsers are installed.
|
||||||
|
]]
|
||||||
|
|
||||||
|
return {
|
||||||
|
"windwp/nvim-ts-autotag",
|
||||||
|
-- Load events recommended upstream. BufReadPre/BufNewFile is sufficient
|
||||||
|
-- because the plugin only acts once a filetype's parser is available.
|
||||||
|
event = { "BufReadPre", "BufNewFile" },
|
||||||
|
config = function()
|
||||||
|
require("nvim-ts-autotag").setup({
|
||||||
|
opts = {
|
||||||
|
enable_close = true, -- `<div` + `>` -> `<div></div>`
|
||||||
|
enable_rename = true, -- `ciw` on the open tag renames the close tag
|
||||||
|
enable_close_on_slash = false, -- a trailing `</` does not autoclose
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
"npm": "@ai-sdk/openai-compatible",
|
"npm": "@ai-sdk/openai-compatible",
|
||||||
"name": "LM Studio (local)",
|
"name": "LM Studio (local)",
|
||||||
"options": {
|
"options": {
|
||||||
"baseURL": "http://192.168.0.4:1234/v1"
|
"baseURL": "http://127.0.0.1:1234"
|
||||||
},
|
},
|
||||||
"models": {
|
"models": {
|
||||||
"qwen3.5-35b-a3b": {
|
"qwen3.5-35b-a3b": {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
"$schema" = 'https://starship.rs/config-schema.json'
|
"$schema" = 'https://starship.rs/config-schema.json'
|
||||||
|
palette = "noctalia"
|
||||||
|
|
||||||
format = """
|
format = """
|
||||||
[](red)\
|
[](red)\
|
||||||
@@ -29,7 +30,6 @@ $character"""
|
|||||||
|
|
||||||
right_format = "$cmd_duration"
|
right_format = "$cmd_duration"
|
||||||
|
|
||||||
palette = 'catppuccin_mocha'
|
|
||||||
|
|
||||||
[os]
|
[os]
|
||||||
disabled = false
|
disabled = false
|
||||||
@@ -202,3 +202,46 @@ base = "#1e1e2e"
|
|||||||
mantle = "#181825"
|
mantle = "#181825"
|
||||||
crust = "#11111b"
|
crust = "#11111b"
|
||||||
|
|
||||||
|
# >>> NOCTALIA STARSHIP PALETTE >>>
|
||||||
|
# Noctalia Starship Palette
|
||||||
|
# Generated by Noctalia - do not edit manually
|
||||||
|
|
||||||
|
[palettes.noctalia]
|
||||||
|
# Standard colors
|
||||||
|
blue = "#89b4fa"
|
||||||
|
red = "#f38ba8"
|
||||||
|
green = "#a6e3a1"
|
||||||
|
yellow = "#f9e2af"
|
||||||
|
cyan = "#94e2d5"
|
||||||
|
magenta = "#f5c2e7"
|
||||||
|
white = "#a6adc8"
|
||||||
|
black = "#45475a"
|
||||||
|
|
||||||
|
# Extended palette (Catppuccin-compatible names)
|
||||||
|
rosewater = "#ebd391"
|
||||||
|
flamingo = "#f37799"
|
||||||
|
pink = "#f2aede"
|
||||||
|
mauve = "#f5c2e7"
|
||||||
|
maroon = "#f37799"
|
||||||
|
peach = "#ebd391"
|
||||||
|
teal = "#94e2d5"
|
||||||
|
sky = "#6bd7ca"
|
||||||
|
sapphire = "#74a8fc"
|
||||||
|
lavender = "#f2aede"
|
||||||
|
|
||||||
|
# Text shades
|
||||||
|
text = "#cdd6f4"
|
||||||
|
subtext1 = "#a6adc8"
|
||||||
|
subtext0 = "#585b70"
|
||||||
|
|
||||||
|
# Surface shades
|
||||||
|
overlay2 = "#585b70"
|
||||||
|
overlay1 = "#585b70"
|
||||||
|
overlay0 = "#45475a"
|
||||||
|
surface2 = "#45475a"
|
||||||
|
surface1 = "#45475a"
|
||||||
|
surface0 = "#1e1e2e"
|
||||||
|
base = "#1e1e2e"
|
||||||
|
mantle = "#1e1e2e"
|
||||||
|
crust = "#1e1e2e"
|
||||||
|
# <<< NOCTALIA STARSHIP PALETTE <<<
|
||||||
|
|||||||
@@ -9,3 +9,17 @@ id = "git"
|
|||||||
group = "git"
|
group = "git"
|
||||||
url = "*/"
|
url = "*/"
|
||||||
run = "git"
|
run = "git"
|
||||||
|
|
||||||
|
[opener]
|
||||||
|
imv = [
|
||||||
|
{ run = "imv %s", orphan = true, spread = false, desc = "imv" },
|
||||||
|
]
|
||||||
|
mpv = [
|
||||||
|
{ run = "mpv %s", orphan = true, spread = false, desc = "mpv" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[open]
|
||||||
|
prepend_rules = [
|
||||||
|
{ mime = "image/*", use = "imv" },
|
||||||
|
{ mime = "video/*", use = "mpv" },
|
||||||
|
]
|
||||||
|
|||||||
+81
-4
@@ -31,7 +31,9 @@ say_pass() { printf 'ok: %s\n' "$*"; PASS=$((PASS+1)); }
|
|||||||
# Exclusions: never lint tpm or general vendored plugin trees, whose third-party
|
# Exclusions: never lint tpm or general vendored plugin trees, whose third-party
|
||||||
# scripts may legitimately fail `bash -n` and are not written/maintained here.
|
# scripts may legitimately fail `bash -n` and are not written/maintained here.
|
||||||
EXCLUDE_VENDOR='(/tpm/|/plugins/|/plugins$)'
|
EXCLUDE_VENDOR='(/tpm/|/plugins/|/plugins$)'
|
||||||
mapfile -t SCRIPTS < <(git ls-files '*.sh' 2>/dev/null | grep -vE "$EXCLUDE_VENDOR")
|
mapfile -t SCRIPTS < <(git ls-files '*.sh' 2>/dev/null | grep -vE "$EXCLUDE_VENDOR" | while IFS= read -r script; do
|
||||||
|
[[ -f "$script" ]] && printf '%s\n' "$script"
|
||||||
|
done)
|
||||||
if [[ ${#SCRIPTS[@]} -eq 0 ]]; then
|
if [[ ${#SCRIPTS[@]} -eq 0 ]]; then
|
||||||
mapfile -t SCRIPTS < <(find . -name '*.sh' \
|
mapfile -t SCRIPTS < <(find . -name '*.sh' \
|
||||||
-not -path './.git/*' -not -path '*/.git/*' \
|
-not -path './.git/*' -not -path '*/.git/*' \
|
||||||
@@ -110,7 +112,82 @@ for pkgdir in term basic utils hypr kreation; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# 5. Makefile <-> setup script name consistency.
|
# 5. Keep Caelestia on the upstream AUR Quickshell runtime.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
echo "== Checking Quickshell package selection =="
|
||||||
|
PACKAGE_FILES=()
|
||||||
|
for pkgdir in term basic utils hypr kreation; do
|
||||||
|
PACKAGE_FILES+=("setup/$pkgdir/packages.txt")
|
||||||
|
done
|
||||||
|
|
||||||
|
has_package() {
|
||||||
|
local target="$1" file
|
||||||
|
shift
|
||||||
|
for file in "$@"; do
|
||||||
|
if awk -v target="$target" '
|
||||||
|
{
|
||||||
|
sub(/#.*/, "")
|
||||||
|
gsub(/^[[:space:]]+|[[:space:]]+$/, "")
|
||||||
|
sub(/^[^/]+\//, "")
|
||||||
|
}
|
||||||
|
$0 == target { found = 1 }
|
||||||
|
END { exit(found ? 0 : 1) }
|
||||||
|
' "$file"; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
has_aur_package() {
|
||||||
|
local target="$1" file
|
||||||
|
shift
|
||||||
|
for file in "$@"; do
|
||||||
|
if awk -v target="$target" '
|
||||||
|
{
|
||||||
|
sub(/#.*/, "")
|
||||||
|
gsub(/^[[:space:]]+|[[:space:]]+$/, "")
|
||||||
|
}
|
||||||
|
$0 == "@aur" { in_aur = 1; next }
|
||||||
|
/^@/ { in_aur = 0; next }
|
||||||
|
in_aur && $0 == target { found = 1 }
|
||||||
|
END { exit(found ? 0 : 1) }
|
||||||
|
' "$file"; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if has_package quickshell "${PACKAGE_FILES[@]}" && has_package quickshell-git "${PACKAGE_FILES[@]}"; then
|
||||||
|
say_fail "package lists declare both quickshell and quickshell-git"
|
||||||
|
else
|
||||||
|
say_pass "no mutually exclusive quickshell packages declared"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if has_package noctalia-qs "${PACKAGE_FILES[@]}"; then
|
||||||
|
say_fail "package lists must not install noctalia-qs for Caelestia"
|
||||||
|
else
|
||||||
|
say_pass "incompatible noctalia-qs provider is not declared"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if has_aur_package aur/quickshell-git "${PACKAGE_FILES[@]}"; then
|
||||||
|
say_pass "quickshell-git is explicitly selected from the AUR"
|
||||||
|
else
|
||||||
|
say_fail "quickshell-git must use the explicit aur/quickshell-git target"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if awk '
|
||||||
|
/^[[:space:]]*yay[[:space:]]+-S/ && /--aur/ && /--needed/ { found = 1 }
|
||||||
|
END { exit(found ? 0 : 1) }
|
||||||
|
' setup/lib/common.sh; then
|
||||||
|
say_pass "AUR package installation uses yay --aur mode"
|
||||||
|
else
|
||||||
|
say_fail "AUR package installation does not use yay --aur mode"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# 6. Makefile <-> setup script name consistency.
|
||||||
# Catches typos such as `setup/basic/setuo.sh`
|
# Catches typos such as `setup/basic/setuo.sh`
|
||||||
# (missing '/') in Makefile targets.
|
# (missing '/') in Makefile targets.
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
@@ -126,7 +203,7 @@ while IFS= read -r tok; do
|
|||||||
done < <(grep -P '^\t' Makefile | grep -oE 'setup/[_A-Za-z0-9./-]+\.sh' | sort -u)
|
done < <(grep -P '^\t' Makefile | grep -oE 'setup/[_A-Za-z0-9./-]+\.sh' | sort -u)
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# 6. Makefile <-> stow package name consistency.
|
# 7. Makefile <-> stow package name consistency.
|
||||||
# Catches bugs such as `stow nvim` when the actual package dir is `term/`.
|
# Catches bugs such as `stow nvim` when the actual package dir is `term/`.
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
echo "== Checking Makefile stow targets reference real package dirs =="
|
echo "== Checking Makefile stow targets reference real package dirs =="
|
||||||
@@ -156,7 +233,7 @@ while IFS= read -r pkg; do
|
|||||||
done < <(grep -P '^\t' Makefile | grep -E '\bstow\b' | awk '{print $NF}' | sort -u)
|
done < <(grep -P '^\t' Makefile | grep -E '\bstow\b' | awk '{print $NF}' | sort -u)
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# 7. Central theme drift guard: no hardcoded theme colors outside
|
# 8. Central theme drift guard: no hardcoded theme colors outside
|
||||||
# basic/.config/themes (plus declared mirrors). See
|
# basic/.config/themes (plus declared mirrors). See
|
||||||
# basic/.config/themes/scripts/sync-theme.sh.
|
# basic/.config/themes/scripts/sync-theme.sh.
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user