Releases: not-elm/orzma
Release list
v0.3.0
Highlights
The default shortcuts are now Alt chords
Until 0.2, the stock pane and vi-mode shortcuts started with <Leader>. Tapping the leader before every key made frequent actions, such as moving between panes, awkward, so they are now direct Alt chords:
| Action | 0.2 | 0.3 |
|---|---|---|
| Move between panes | <Leader>h / j / k / l |
Alt+h / j / k / l |
| Split a pane | <Leader>i / o |
Alt+i / o |
| Close a pane | <Leader>p |
Alt+p |
| Resize a pane | <Leader:r>Shift+H / J / K / L |
Alt+Shift+H / J / K / L |
| Enter vi mode | <Leader>s |
Alt+s |
This is a breaking change. Before you upgrade:
- macOS: the right Option key is now
Alt(option_as_altdefaults to"right"), so it no longer types special characters. A Japanese (JIS) keyboard has no right Option key; setoption_as_alt = "left"or"both"there. - The
Altchords orzma binds no longer reach the shell, such as readline'sAlt+candAlt+r. - If your configuration binds one of these chords to another action, orzma does not start until you rebind one of the two.
- Repeatable bindings are now written
r:<Leader>x. A configuration that still uses<Leader:r>xis ignored as a whole.
The leader key is still there for your own bindings, and you can bind the 0.2 keys back: Upgrading has the snippet, and Default Key Bindings lists every key.
Tabs
orzma now keeps several pane layouts as tabs, listed in a tab bar at the top of the window, so you can keep several screens going at once and switch between them. The shells in the tabs you are not looking at keep running.
| Action | Key |
|---|---|
| Open a new tab | Alt+c |
| Next / previous tab | Alt+] / Alt+[ |
| Show tab 1–9 | Alt+1 … Alt+9 |
| Rename the tab | Alt+r |
| Close the tab | Alt+Shift+X |
The mouse works too: click a tab to show it, + to open one, × to close one, double-click to rename, and drag to reorder. A tab you have not named shows the title of its active pane, and a new tab starts in the working directory of the active pane. Closing the last pane of a tab closes the tab, and closing the last tab quits orzma.
See Panes and Tabs for details.
Also in this release
Cmd+click (Ctrl+click on Windows and Linux) opens a URL printed as plain text, such as the address a development server prints.- orzma's shortcuts, other than
copyandpaste, now run while a web page has focus. Setdirect-chords-over-webview = falsein[shortcuts]to give them back to the page. - The wheel scrolls about three lines per cell of travel instead of six.
- The macOS download is a
.dmginstead of a.zip. - orzmd and orzbrowser draw their interface in the page. Quit them with
q;Ctrl+cno longer quits. - Fixed: the window closed when the display went to sleep, and
Cmdstayed held afterCmd+Shift+5on macOS.
PR
⚠️ Breaking Changes
- feat: add workspaces with a top tab bar by @not-elm in #370
- feat(input): count Alt per key, excluding AltGr and a composing Option key (PR-A of 3) by @not-elm in #376
- feat!: mark repeatable bindings with r: and let an abandoned leader key reach its direct chord (PR-B of 3) by @not-elm in #377
- feat!: bind the stock pane, workspace, and vi-mode shortcuts to Alt chords (PR-C of 3) by @not-elm in #378
🚀 Features
- ci(release): publish each release once, from a reviewed draft by @not-elm in #366
- feat(release): ship the macOS app as a dmg instead of a zip by @not-elm in #368
- feat(input): let direct shortcuts fire over a focused webview by @not-elm in #369
- feat(orzmd): draw the rail, find box, outline sidebar, and toast in the page by @not-elm in #371
- feat: open URLs detected in plain text with Cmd/Ctrl+click (PR-B of 2) by @not-elm in #373
- feat(orzbrowser): draw the toolbar and address bar in a webview, with free search by @not-elm in #375
- feat(orzmd): handle every key in the page with smooth scrolling by @not-elm in #381
- feat: scroll 3 lines per cell of wheel travel by default, like Alacritty by @not-elm in #382
- feat(ui): draw workspace tabs as rounded pills inside the tab bar by @not-elm in #383
- feat(ui): color the displayed workspace tab with the app icon's violet by @not-elm in #385
- refactor: rename workspaces to tabs by @not-elm in #388
- feat: label unnamed tabs with their active pane's title by @not-elm in #390
🐛 Fixes
- fix: keep the window open when its monitor disappears on display sleep by @not-elm in #367
- fix(input): release modifiers macOS reports up after Cmd+Shift+5 by @not-elm in #387
📚 Documentation
- docs(book): restructure the user guide around installation, reference, and upgrade pages by @not-elm in #386
Full Changelog: v0.2.1...v0.3.0
v0.2.1
What's Changed
⚡ Performance
- perf: shrink the Windows install from 574 MiB to 496 MiB by @not-elm in #363
- perf(bundle): shrink the macOS app by 65 MiB by pruning the CEF framework by @not-elm in #364
🐛 Fixes
- fix(bundle): drop the debug CEF render process from the macOS app by @not-elm in #360
- fix(windows): build the MSI render process under a short target dir by @not-elm in #359
Full Changelog: v0.2.0...v0.2.1
v0.2.0
Breaking changes since v0.1.0
v0.2.0 replaces the tmux integration with a built-in multiplexer, moves vi mode into orzma itself, and changes how webviews are addressed. Read this list before upgrading, especially if you keep a config.toml or maintain a program that uses the webview protocol.
tmux integration has been removed
orzma no longer speaks tmux control mode, so tmux -CC no longer switches orzma into integration mode. Panes now come from orzma's built-in multiplexer: you split, focus, resize, and kill them with the [shortcuts] actions. Windows, sessions, pane zoom, renaming, and detaching have no equivalent. Plain tmux still runs inside a pane like any other program.
Configuration
orzma now ignores a configuration it cannot read instead of refusing to start. A syntax error, an unknown section or key, or a malformed binding makes orzma start with every setting at its default and print the reason to standard error. As a result, an outdated v0.1.0 config no longer fails loudly. If your settings seem to have no effect, start orzma from a terminal (/Applications/orzma.app/Contents/MacOS/orzma) and read the error. Conflicts still stop startup: a key bound to two actions, or a font family that is not installed.
Remove or rewrite the following. Otherwise orzma ignores the whole file:
-
Removed shortcut actions. Delts]
:detach-session,zoom-pane,new-window,kill-window,next-window,previous-window,next-session,previous-session,select-window-0…select-window-9,rename-window,rename-session`. -
Removed
[scrollback]section (seed-lines). It only applied when attaching to tmux. - **Fonts are chosen by family name0.1.0,normal,bold,italic,andbold_italicunder[font]were paths to font files. Each one is now a table with afamilyand astyle, looked up among the installed system fonts. A family that is not installed stops orzma from starting. Unknown keys under[font]are now rejected instead of ignored.# v0.1.0 [font] normal = "~/Library/Fonts/MyMono-Regular.ttf" bold = "~/Library/Fonts/MyMono-Bold.ttf" # v0.2.0 [font.normal] family = "MyMono" style = "Regular" [font.bold] style = "Bold" # family is taken from [font.normal]
Other changes:
- New default shortcuts on macOS:
copy = "Cmd+C",increase-font-size = "Cmd+Plus",decrease-font-size = "Cmd+-", andreset-font-size = "Cmd+0". If your config already binds one of these chords to another action, orzma stops at startup with a duplicate-binding error. Unbind the new action (for examplecopy = "" kill-paneno longer asks for confirmation. It ends the active pane's shell right away.- Removed
[mouse]keys.drag_threshold_px,autoscroll_base_period_ms,
autoscroll_min_period_ms, andauo anything. orzma still ignoresunknown[mouse]` keys, so you don't need to edit them out.
Vi mode
orzma now provides vi mode itself in every pane, in place of Alacritty's vi mode and tmux copy-mode.
The [vi-mode] table is unchanged,
- The search and jump actions (
/,?,n,N,f,F,t,T) are not implemented yet. Vi mode swallows those keys and does nothing. toggle-rect-selection(Ctrl+Ves instead of a rectangle.
Webview protocol
This section is for programs that talk to the control socket directly. orzma 0.2.0 and a v0.1.0 client cannot work together. If you use ratatui_orzma, see the next section instead.
ts are addressed by host-minted instances, not by handles.** register now replies {"ok":true,"handle":"…","instance":"…"}. The instance (32 lowercase hex digits) is what mount, unmount, focus, and navigate address. To place the same handle more than once, request another instance with the new new_instance op. The client-chosen instance_id of the OSC form no longer exists. new_instance is answered with a reply that has no op field, just like register, and replies to both requests come back in the order they were sent.
focustakes{"instance": "<instance>" | null}.nullalways removes focus. In v0.1.0,{"handle":"…","instance":null}focused the handle's default placement; it now removes focus instead.navigatetakesinstanceinstead ofhandle. orzma silently skips anavigatethat has no
instance.- Unmount-all has a wider scope.
ESC _ Ounmount ESC \with no parameters removes every placement in the terminal, whichever program mounted it. The v0.1.0 form removed only the calling program's views. urlChangedrequires the bridgress changes only if it was
es have new fields and a new op.callandcompositingnow includeinstance. A newfocus_changedpush (handle,instance,focused) reports every focus change. Clients must ignore pushes with anopthey don't recognize.- Clicking a webview now gives it keyboard focus. Outside vi mode, clicking an interactive view sends keys to the page. Only the view's forward keys and orzma's
<Leader>shortcuts still reach the TUI. List the keys your TUI needs to keep inforward_keys(you can replace the list later withset_forward_keys), or register the view withinteractive: false. - Identifier formats changed. A handle is now 26 base32 characters, and a token is
orzma:followed by 26 base32 characters. Keep treating both as opaque.
ratatui_orzma 0.2.0
ratatui_orzma 0.2.0 speaks only the v0.2.0 protocol, so upgrade the SDK and orzma together.
WebviewHandle::id()has been removed. Usehandle_id()for the registration (aHandleId) andinstance_id()for its default placement.WebviewWidget::newnow takes a placement instance id. Passing aHandleIddoesn't compile.WebviewWidget::focused()andis_focused()have been removed. UseWebviewHandle::focus()orWebviewInstance::focus()to take focus andOrzma::blur()to release it.WebviewHandle::read_focus_changes()tells you the current focus state.OrzmaErrorhas two new variantsed. Exhaustivematch`es need armsfor them.$TMUX_PANEno longer stands in for$ORZMA_TOKEN. Both$ORZMA_SOCKand$ORZMA_TOKENmust be set.
// v0.1.0
f.render_stateful_widget(
WebviewWidget::new(view.id()).f
area,
&mut *orzma.frame(),
);
// v0.2.0
f.render_stateful_widget(
WebviewWidget::new(view.instance_id()),
area,
&mut *orzma.frame(),
);
view.focus()?; // call once, after the page has composited@orzma/web 0.2.0 has no API changes.
What's Changed
⚠️ Breaking Changes
- Update Bevy and CEF versions. by @not-elm in #255
- feat(font): resolve terminal + UI font by system family name by @not-elm in #262
- refactor!: remove tmux mode (PR-0 of the local multiplexer plan) by @not-elm in #264
- fix: wire the APC webview mount path end to end by @not-elm in #269
- feat!: add the built-in multiplexer with a Bevy-free backend thread (PR-1) by @not-elm in #276
- refactor!: rename the mux crates and types to the orzmux prefix by @not-elm in #278
- feat(webview): focus the page on click and keep forward keys on the TUI by @not-elm in #345
- fix: repair user-visible leftovers of removed designs by @not-elm in #357
🚀 Features
- feat(clipboard): migrate to Bevy system_clipboard; remove orzma Clipboard resource by @not-elm in #259
- feat: support the Windows platform by @not-elm in #277
- feat(orzmux): sample and log queue depths to diagnose buffer saturation by @not-elm in #279
- feat(orzma_vt): implement CHA, VPA and HPA so absolute cursor addressing moves the cursor by @not-elm in #285
- feat(orzma_vt): implement IRM so insert mode shifts the row instead of overwriting by @not-elm in #286
- feat(orzma_vt): implement DECTCEM so an application can hide the cursor by @not-elm in #287
- feat(orzma_vt): implement DECAWM so a program can turn autowrap off by @not-elm in #289
- feat(orzma_vt): implement HPR, SCOSC/SCORC and the CSI ^ spelling of SD by @not-elm in #290
- feat(orzma_tty, input): send the terminfo kcbt and kich1 strings for Shift-Tab and Insert by @not-elm in #292
- feat(orzma_vt): implement OSC 4 and OSC 104 so a program can recolor the palette by @not-elm in #297
- feat(orzma_vt): implement DECSTR so tput init restores the modes by @not-elm in #300
- feat(orzma_vt): implement cursor blink (DECSET 12) and DECSCUSR by @not-elm in #301
- feat(orzma_vt): implement OSC 10/11 and OSC 110/111 so nvim can read the background by @not-elm in #303
- feat: implement OSC 52 so a program can write the system clipboard by @not-elm in #305
- feat(input): resize panes by dragging the divider between them by @not-elm in #308
- feat(orzma...
v0.1.0
chore(licenses): regenerate THIRD-PARTY-LICENSES for marked-alert Commit 01f4e5d added the marked-alert npm dependency without regenerating the aggregated third-party license file, tripping the licenses-check drift gate in CI. Regenerate it to add the marked-alert 2.1.2 (MIT) entry. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>