From 85d77ef90db5395a887f3d4205bdae5c474ff065 Mon Sep 17 00:00:00 2001 From: Prad Nukala Date: Tue, 6 Oct 2026 11:38:28 -0400 Subject: [PATCH] refactor(hyprland): replace kitty-herdr with tern and adjust keybindings - Replaced `kitty-herdr` with `tern` as the default scratchpad terminal across configs, scripts, and docs. - Remapped window resize controls to `SUPER + CTRL + HJKL` and monitor navigation to `ALT` modifiers. - Removed the `scrolloverview` plugin configuration and cleaned up obsolete menu bindings. --- docs/desktop/hyprland.mdx | 10 +-- dot_config/hypr/bindings.lua | 67 ++++++------------- dot_config/hypr/hyprland.lua | 7 +- dot_local/bin/executable_omarchy-cycle | 6 +- .../bin/executable_omarchy-toggle-scratch | 2 +- 5 files changed, 35 insertions(+), 57 deletions(-) diff --git a/docs/desktop/hyprland.mdx b/docs/desktop/hyprland.mdx index d92eef2..ba1900d 100644 --- a/docs/desktop/hyprland.mdx +++ b/docs/desktop/hyprland.mdx @@ -59,7 +59,8 @@ Omarchy's default bindings stay enabled. `omarchy_default_bindings` and `omarchy | --- | --- | | `^brave-www\.tldraw\.com__-Default$` | Workspace 3 | | `^tldraw-offline$` | Workspace 5, fullscreen | -| `^com\.anthropic\.Claude$`, `^kitty-herdr$` | `special:scratchpad silent` | +| `^so\.stencil\.tern$` | `special:scratchpad silent` | +| `^com\.anthropic\.Claude$` | `special:claude silent` | | `^com\.fastmail\.Fastmail$` | `special:fastmail silent` | | `^Beeper$` | `special:beeper silent` | | `brave-(www\.)?youtube\.com__.*`, title not matching `.*Picture.?in.?[Pp]icture.*` | Float, pin, size 30% × 30% of the monitor, move to `10, monitor_h*0.7-10` (bottom-left corner) | @@ -176,7 +177,7 @@ Every binding defined in `bindings.lua`. Bindings not listed here are Omarchy de | `ALT + Q` / `W` / `E` / `R` / `T` | Switch to workspace 1 / 2 / 3 / 4 / 5 | — | | `ALT + SHIFT + Q` / `W` / `E` / `R` / `T` | Move window to workspace 1 / 2 / 3 / 4 / 5 | — | | `SUPER + CTRL + S` | `omarchy-toggle-scratch scratchpad` | share menu | -| `SUPER + A` | `omarchy-toggle-scratch scratchpad` | — | +| `SUPER + A` | `omarchy-toggle-scratch scratchpad` (Tern) | — | | `SUPER + O` | Focus next monitor | pop window out | | `SUPER + SHIFT + O` | Move window to next monitor | Obsidian | | `SUPER + CTRL + SHIFT + J` | Move window to next monitor | — | @@ -276,7 +277,7 @@ Focuses an app's window, cycles to the next one on repeated presses, or launches | `ghostty` | `ghostty` | `ghostty` | | `browser` | zen, brave, chromium, google-chrome, firefox, librewolf, vivaldi, microsoft-edge, helium — excluding `chrome-`/`webapp-` web apps | `omarchy-launch-browser` | | `brave` | `^brave` (Brave Origin and its web apps) | `brave-origin` | -| `terminal` | kitty, alacritty, ghostty, foot, wezterm — excluding `^kitty-herdr$` (the scratchpad terminal) | `omarchy-launch-terminal` | +| `terminal` | kitty, alacritty, ghostty, foot, wezterm (Tern, the scratchpad terminal, does not match) | `omarchy-launch-terminal` | | `ai` | `claude\|hermes` | `hermes desktop` | | anything else | `^APP$` | the argument as a command | @@ -343,7 +344,8 @@ omarchy-toggle-scratch [scratchpad|fastmail|beeper] | Profile | Special workspace | Home monitor | Residents (class → launch) | | --- | --- | --- | --- | -| `scratchpad` | `special:scratchpad` | Apple Studio Display | `com.anthropic.Claude` → `claude-desktop`; `kitty-herdr` → `kitty --class=kitty-herdr --config ~/.config/kitty/herdr.conf` | +| `scratchpad` | `special:scratchpad` | Apple Studio Display | `so.stencil.tern` → `tern` | +| `claude` | `special:claude` | Apple Studio Display | `com.anthropic.Claude` → `claude-desktop` | | `fastmail` | `special:fastmail` | focused | `com.fastmail.Fastmail` → `gtk-launch fastmail` | | `beeper` | `special:beeper` | focused | `Beeper` → `gtk-launch beeper` | diff --git a/dot_config/hypr/bindings.lua b/dot_config/hypr/bindings.lua index 0a74114..c111f44 100644 --- a/dot_config/hypr/bindings.lua +++ b/dot_config/hypr/bindings.lua @@ -123,7 +123,7 @@ o.bind("SUPER + CTRL + J", "Next workspace", hl.dsp.focus({ workspace = "e+1" }) o.bind("SUPER + CTRL + K", "Previous workspace", hl.dsp.focus({ workspace = "e-1" })) -- Scratch workspaces. Omarchy's SUPER + S is taken by the region screenshot --- below, so the main toggle (kitty/herdr) lands on SUPER + CTRL + S, with +-- below, so the main toggle (Tern) lands on SUPER + CTRL + S, with -- SUPER + A (free in Omarchy) as the home-row alias. Claude Desktop has its -- own scratch workspace on SUPER + SHIFT + A and SUPER + C (the latter -- replaces Omarchy's universal copy). SUPER + ALT + S (send window to the @@ -138,7 +138,7 @@ o.bind("SUPER + CTRL + K", "Previous workspace", hl.dsp.focus({ workspace = "e-1 -- under SUPER + CTRL + ALT + E / M in the Applications block below. hl.unbind("SUPER + CTRL + S") -- was: share menu o.bind("SUPER + CTRL + S", "Toggle scratch workspace", "omarchy-toggle-scratch scratchpad") -o.bind("SUPER + A", "Toggle Herdr scratch workspace", "omarchy-toggle-scratch scratchpad") +o.bind("SUPER + A", "Toggle Tern scratch workspace", "omarchy-toggle-scratch scratchpad") hl.unbind("SUPER + SHIFT + A") -- was: ChatGPT web app o.bind("SUPER + SHIFT + A", "Toggle Claude scratch workspace", "omarchy-toggle-scratch claude") hl.unbind("SUPER + C") -- was: universal copy @@ -156,11 +156,12 @@ end hl.unbind("SUPER + O") -- was: pop window out hl.unbind("SUPER + SHIFT + O") -- was: Obsidian (moved to SUPER + CTRL + ALT + O) -o.bind("SUPER + O", "Focus next monitor", hl.dsp.focus({ monitor = "+1" })) -o.bind("SUPER + SHIFT + O", "Move window to next monitor", hl.dsp.window.move({ monitor = "+1" })) -o.bind("SUPER + CTRL + SHIFT + J", "Move window to next monitor", hl.dsp.window.move({ monitor = "+1" })) -o.bind("SUPER + CTRL + SHIFT + K", "Move window to previous monitor", hl.dsp.window.move({ monitor = "-1" })) +o.bind("ALT + O", "Focus next monitor", hl.dsp.focus({ monitor = "+1" })) +o.bind("ALT + SHIFT + O", "Move window to next monitor", hl.dsp.window.move({ monitor = "+1" })) + +o.bind("ALT + SHIFT + J", "Move window to next monitor", hl.dsp.window.move({ monitor = "+1" })) +o.bind("ALT + SHIFT + K", "Move window to previous monitor", hl.dsp.window.move({ monitor = "-1" })) -- Named workspaces, in place of niri-dynamic-workspaces. o.bind("SUPER + SHIFT + CTRL + ALT + W", "Workspace w", hl.dsp.focus({ workspace = "name:w" })) @@ -175,10 +176,15 @@ o.bind("SUPER + SHIFT + R", "Cycle window size back", "omarchy-cycle-window-size -- Alt+Shift+hjkl. Hyprland resizes by pixels, not by percent, so 100 px -- replaces the niri 10%. -o.bind("ALT + H", "Shrink window width", hl.dsp.window.resize({ x = -100, y = 0, relative = true })) -o.bind("ALT + L", "Grow window width", hl.dsp.window.resize({ x = 100, y = 0, relative = true })) -o.bind("ALT + K", "Shrink window height", hl.dsp.window.resize({ x = 0, y = -100, relative = true })) -o.bind("ALT + J", "Grow window height", hl.dsp.window.resize({ x = 0, y = 100, relative = true })) +hl.unbind("SUPER + CTRL + H") -- was: toggle window gaps +hl.unbind("SUPER + CTRL + L") -- was: toggle window gaps +hl.unbind("SUPER + CTRL + K") -- was: toggle window gaps +hl.unbind("SUPER + CTRL + J") -- was: toggle window gaps + +o.bind("SUPER + CTRL + H", "Shrink window width", hl.dsp.window.resize({ x = -100, y = 0, relative = true })) +o.bind("SUPER + CTRL + L", "Grow window width", hl.dsp.window.resize({ x = 100, y = 0, relative = true })) +o.bind("SUPER + CTRL + K", "Shrink window height", hl.dsp.window.resize({ x = 0, y = -100, relative = true })) +o.bind("SUPER + CTRL + J", "Grow window height", hl.dsp.window.resize({ x = 0, y = 100, relative = true })) -- Same width steps on SUPER + , / SUPER + . (the < and > keys). Key names are -- the lower-case xkb keysyms; "COMMA"/"PERIOD" would not match. @@ -233,9 +239,6 @@ o.bind("SUPER + CTRL + ALT + T", "tldraw offline", "omarchy-launch-or-focus tldr hl.unbind("SUPER + CTRL + ALT + W") -- was: toggle weather -- gtk-launch takes the desktop-entry id: TLDraw.desktop, not tldraw_offline, -- which does not exist (the old command could only focus, never launch). -o.bind("SUPER + CTRL + ALT + W", "tldraw", "omarchy-launch-or-focus tldraw \"gtk-launch TLDraw\"") - -o.bind("SUPER + CTRL + ALT + SPACE", "Sticky notes", "omarchy-launch-or-focus sticky \"gtk-launch io.github.faridjaff.StickyNotesCanvas\"") hl.unbind("SUPER + SHIFT + G") -- was: Signal -- The ssh/mosh command and tmux keymaps live in ~/.config/kitty/goliath.conf @@ -270,44 +273,16 @@ o.bind("SUPER + F24", "Dictate to Hermes", "voxtype record toggle --profile herm -- Omarchy menu. SUPER + ALT + SPACE is the apps menu. hl.unbind("SUPER + SHIFT + SPACE") -- was: toggle top bar -o.bind("SUPER + SHIFT + SPACE", "Emojis", "omarchy-shell shell toggle omarchy.emojis") - hl.unbind("SUPER + P") -- was: pseudo window -o.bind("SUPER + P", "Clipboard manager", "omarchy-shell shell toggle omarchy.clipboard") +hl.unbind("SUPER + SPACE") -- was: pseudo window + +-- Omarchy's SUPER + SPACE is ALT + SPACE, so the key is free in Omarchy. +o.bind("ALT + SPACE", "Toggle Launcher", "omarchy-menu toggle launcher") -- Mod+Shift+Return was the vicinae window switcher. ScrollOverview on -- ALT + TAB below takes that job, so SUPER + SHIFT + RETURN keeps its default -- job of opening the browser. - --- ─── ScrollOverview plugin ────────────────────────────────────────────────── - -if hl.plugin.scrolloverview then - hl.config({ - plugin = { - scrolloverview = { - gesture_distance = 300, -- how far is the "max" for the gesture - scale = 0.5, -- preferred overview scale - workspace_gap = 100, - layout = "vertical", -- vertical or horizontal - wallpaper = 2, -- 0: global only, 1: per-workspace only, 2: both - blur = true, -- blur only the main overview wallpaper - shadow = { - enabled = true, - range = 50, - }, - }, - }, - }) - - -- Omarchy puts two binds on ALT + TAB: focus next window, and reveal the - -- active window on top. Both go, and the overview takes the key. Written with - -- o.bind and a description, so it shows up in the keybindings menu. - hl.unbind("ALT + TAB") - o.bind("ALT + TAB", "Toggle overview", function() - hl.plugin.scrolloverview.overview("toggle all") - end) -end - +-- -- flea --default: begin. Written by `flea --default`; `flea --default off` removes the block whole. hl.unbind("SUPER + SHIFT + F") o.bind("SUPER + SHIFT + F", "File manager", { launch = 'flea --gui' }) diff --git a/dot_config/hypr/hyprland.lua b/dot_config/hypr/hyprland.lua index 7f48234..45a4477 100644 --- a/dot_config/hypr/hyprland.lua +++ b/dot_config/hypr/hyprland.lua @@ -50,9 +50,10 @@ o.window([[^tldraw-offline$]], { workspace = "5", fullscreen = true }) -- them; "silent" leaves the reveal to the script. Under the master layout the -- first window to appear takes the master slot; the rest stack beside it. -- --- SUPER + A / SUPER + CTRL + S: kitty/herdr; SUPER + SHIFT + A: Claude --- Desktop. Each alone on its own workspace, Studio Display. -o.window([[^kitty-herdr$]], { workspace = "special:scratchpad silent" }) +-- SUPER + A / SUPER + CTRL + S: Tern; SUPER + SHIFT + A: Claude Desktop. +-- Each alone on its own workspace, Studio Display. Tern has no per-window +-- class flag, so every Tern window lands on the scratchpad. +o.window([[^so\.stencil\.tern$]], { workspace = "special:scratchpad silent" }) o.window([[^com\.anthropic\.Claude$]], { workspace = "special:claude silent" }) -- SUPER + CTRL + ALT + E / M: Fastmail and Beeper, each alone on the -- focused monitor. diff --git a/dot_local/bin/executable_omarchy-cycle b/dot_local/bin/executable_omarchy-cycle index 84223fc..1612e3b 100755 --- a/dot_local/bin/executable_omarchy-cycle +++ b/dot_local/bin/executable_omarchy-cycle @@ -129,9 +129,9 @@ elif [[ $APP == "brave" ]]; then DEFAULT_SPAWN="brave-origin" elif [[ $APP == "terminal" ]]; then - # Cycle all terminals. kitty-herdr is the SUPER + A scratch terminal - # (omarchy-toggle-scratch owns it), so it stays out of the rotation. - INSTANCES=($(addresses_matching '(kitty|alacritty|ghostty|foot|wezterm)' '^kitty-herdr$')) + # Cycle all terminals. Tern (so.stencil.tern) is the SUPER + A scratch + # terminal and the pattern below already leaves it out. + INSTANCES=($(addresses_matching '(kitty|alacritty|ghostty|foot|wezterm)')) DEFAULT_LAUNCHER="omarchy-launch-terminal" elif [[ $APP == "ai" ]]; then diff --git a/dot_local/bin/executable_omarchy-toggle-scratch b/dot_local/bin/executable_omarchy-toggle-scratch index 8c651eb..4300f29 100755 --- a/dot_local/bin/executable_omarchy-toggle-scratch +++ b/dot_local/bin/executable_omarchy-toggle-scratch @@ -25,7 +25,7 @@ case ${1:-scratchpad} in scratchpad) NAME="scratchpad" HOME_MONITOR="Apple Computer Inc StudioDisplay 0x984262A7" - MEMBERS=("kitty-herdr|kitty --class=kitty-herdr --config $HOME/.config/kitty/herdr.conf") + MEMBERS=("so.stencil.tern|tern") ;; claude) NAME="claude"