docs(desktop): document Umbriel smart move behavior

This commit is contained in:
Prad Nukala committed 2026-10-16 14:37:56 -04:00
1 parent 98f4ccc1e6
commit ddbc6471b9
3 files changed
+19 -5

No files matched your search

+2 -2
View File
@@ -6,7 +6,7 @@ sidebar:
---
:::note[Role gating]
`.chezmoiignore.tmpl` skips the Linux desktop layer unless the machine runs Linux **and** its role is `desktop` or `laptop`. The gated targets are `~/.config/niri`, `~/.config/hypr`, `~/.config/umbriel`, `~/.config/uwsm`, `~/.config/noctalia`, `~/.config/vicinae`, `~/.config/niri-dynamic-workspaces`, `~/.config/fontconfig`, `~/.config/mimeapps.list`, `~/.config/xdg-terminals.list`, `~/.config/systemd`, `~/.local/bin/kitty-day-save`, `~/.local/bin/niri-launch`, `~/.local/bin/umbriel-launch`, `~/.local/bin/cp-appid`, `~/.local/bin/projects-sync`, and `~/.config/fish/auto-Niri.fish`. On `mac` and `server` roles these are not applied.
`.chezmoiignore.tmpl` skips the Linux desktop layer unless the machine runs Linux **and** its role is `desktop` or `laptop`. The gated targets are `~/.config/niri`, `~/.config/hypr`, `~/.config/umbriel`, `~/.config/uwsm`, `~/.config/noctalia`, `~/.config/vicinae`, `~/.config/niri-dynamic-workspaces`, `~/.config/fontconfig`, `~/.config/mimeapps.list`, `~/.config/xdg-terminals.list`, `~/.config/systemd`, `~/.local/bin/kitty-day-save`, `~/.local/bin/niri-launch`, `~/.local/bin/umbriel-launch`, `~/.local/bin/umbriel-smart-move`, `~/.local/bin/cp-appid`, `~/.local/bin/projects-sync`, and `~/.config/fish/auto-Niri.fish`. On `mac` and `server` roles these are not applied.
`~/.config/waybar`, the `omarchy-*` scripts, the `niri-launch-ai` / `-browser` / `-terminal` / `-webapp` wrappers, and `~/.local/bin/tmux-niri-title` are **not** listed there, so chezmoi applies them on every role and OS. Only the exact path `.local/bin/niri-launch` is ignored, not the wrappers that call it.
:::
@@ -16,7 +16,7 @@ Three Wayland compositors are configured side by side. niri is the original setu
| Page | Covers |
| --- | --- |
| [niri](/desktop/niri) | `~/.config/niri` (base config, Noctalia colors, the `config.d/` fragments, per-display profiles), niri helper scripts, the `niri-launch*` launchers, `cp-appid`, the `nirinit` user service |
| [Umbriel](/desktop/umbriel) | `~/.config/umbriel` (session, layout, outputs, rules, scratchpads, binds) and `umbriel-launch` |
| [Umbriel](/desktop/umbriel) | `~/.config/umbriel` (session, layout, outputs, rules, scratchpads, binds), `umbriel-launch`, and `umbriel-smart-move` |
| [Hyprland](/desktop/hyprland) | `~/.config/hypr` Lua config on Omarchy: bindings, input, look and feel, monitors, hyprsunset, the portal; every `omarchy-*` script in `~/.local/bin`. `~/.config/omarchy` (shell, hooks, menus, themes) is the [prdlk/omarchy](https://github.com/prdlk/omarchy) external, see [externals](/chezmoi/externals-and-ignore#app-externals) |
| [Waybar](/desktop/waybar) | `~/.config/waybar`: module layout, stylesheet, the `window_pill.py` title module |
| [Fonts and default apps](/desktop/fonts-and-apps) | `~/.config/fontconfig/fonts.conf`, `~/.config/mimeapps.list`, the Victor Mono Nerd Font packages |
+16 -3
View File
@@ -18,6 +18,7 @@ Linux `desktop` and `laptop` roles only (`.chezmoiignore.tmpl`). `umbriel` and i
| `dot_config/umbriel/rules.toml` | `~/.config/umbriel/rules.toml`: scratchpads, window and layer rules |
| `dot_config/umbriel/binds.toml` | `~/.config/umbriel/binds.toml` |
| `dot_local/bin/executable_umbriel-launch` | `~/.local/bin/umbriel-launch` |
| `dot_local/bin/executable_umbriel-smart-move` | `~/.local/bin/umbriel-smart-move` |
Umbriel watches these files and applies a valid save immediately; `umbriel config validate` checks them without a session. Include paths resolve against the symlinks in `~/.config/umbriel`, not the chezmoi source. Defining `[keybinds]` replaces Umbriel's built-in binds, so `binds.toml` is the complete set.
@@ -138,7 +139,7 @@ Noctalia's bar, panels, notifications, dock, OSD, and desktop widgets get blur t
| `Mod+WheelUp` / `Mod+WheelDown` | focus left / right |
| `Mod+Left` / `Mod+Right` / `Mod+Up` | focus the output in that direction |
| `Mod+O`, `Super+Ctrl+J` / `Super+Ctrl+K` | next / previous output |
| `Mod+Shift+H` / `Mod+Shift+L` | move column left / right |
| `Mod+Shift+H` / `Mod+Shift+L` | [smart move](#smart-move) left / right: consume or expel, then on to the next output |
| `Super+Ctrl+Shift+H` / `Super+Ctrl+Shift+L` | move column first / last |
| `Mod+Shift+J` / `Mod+Shift+K` | move column to next / previous workspace |
| `Mod+Shift+Down` / `Mod+Shift+Up` | move column to the right / left output |
@@ -151,10 +152,22 @@ Noctalia's bar, panels, notifications, dock, OSD, and desktop widgets get blur t
| `Mod+Ctrl+F` | fullscreen |
| `Mod+C` | center column |
| `Mod+Ctrl+O` | toggle floating |
| `Mod+W` | toggle the workspace between the scrolling and master layouts |
| `Mod+Shift+W` | tab / untab the column |
| `Mod+W` | toggle the workspace between the scrolling and dwindle layouts |
| `Mod+G` | tab the focused window with the windows stacked in its column, or stack a tab group again (scrolling layout; dwindle has no columns). Windows join a group by dragging onto its tab bar |
| `Mod+Q` | close window |
| `Mod+1`…`Mod+9`, `Alt+Q W E R Y U I O` | workspace 1–9 / 1–8 |
| `Mod+Shift+1`…`9`, `Alt+Shift+Q`…`O` | move window to that workspace |
Workspaces are dynamic per output. Not carried over: niri's named `w`/`h`/`x` workspaces (`niri-dynamic-workspaces`), center-visible-columns, window-only screenshots, the vicinae window switcher (use the overview), the Linear and AI-cycle launchers whose keys now toggle scratchpads, and the Omarchy-only Hyprland binds (`omarchy-pip`, `omarchy-summon`, notification dismiss, strata in the terminal's cwd).
### Smart move [#smart-move]
`umbriel-smart-move left|right` ports niri's `consume-or-expel-window-left/right` and continues across outputs. In the scrolling layout it picks one action for the focused window:
| Focused window | Action |
| --- | --- |
| stacked with other windows in its column | expel it to a new column on that side |
| alone, with a column on that side | consume it into that column |
| alone, at the strip's end | move it to the output on that side (nothing at the outermost output) |
Two presses step a window past its neighbour: the first stacks it into the neighbour's column, the second expels it on the far side. On dwindle and master workspaces it runs `window-move-or-output-left/right`. Floating and scratchpad windows stay put.