v1.9.0
Thank you 🙏
This is our biggest release so far, with patches from 30 community contributors. Thank you to everyone who tried ttt, reported issues, reviewed changes, and sent patches. Your feedback and the plugins you're building continue to shape the editor.
Also, big thanks to @aahoughton for identifying and fixing security issues in the plugin sandbox
Highlights
- Two-way plugin RPC: We saw people building ttt plugins that needed fast communication with other binaries, so we added two-way RPC to let plugins and external tools exchange requests and responses.
- Richer plugins: Custom dialogs, multiline inputs, editor decorations, terminal control, regex, and native multi-file diff views.
- Plugin discovery and permissions: A Featured section, new community plugins, and tighter filesystem and network permission handling.
- Editor improvements: Open piped stdin in a tab, opt-in Save All and Quit, customizable icons, and better controls for large files.
- Git improvements: Create branches from Changes, navigate detail controls by keyboard, and view commit messages as Markdown.
- Reliability fixes: Search and replace, Save As, undo cursor restoration, LSP formatting, and terminal shutdown.
- Platform support: Android ARM64 and Windows ARM64 builds, FreeBSD installer support, and downloadable checksums.
More
What's Changed (112 pull requests)
What's Changed
- feat(plugins): add pdf-viewer to the community registry by @sercanatalik in #836
- docs: document Scoop installation on Windows by @premiuslol in #911
- fix(editor): ask before Save As replaces an existing file by @jayhemnani9910 in #910
- feat(plugin): add ttt.clipboard_read behind a clipboard.read permission by @peterheo in #912
- fix(editor): apply final newline and trim settings when saving a new file by @jayhemnani9910 in #909
- refactor(app): remove unused working tree wrapper by @dannyward630 in #922
- Update windows install order README.md by @eugenioenko in #923
- feat(plugin): scope fs.read and fs.write to manifest paths by @eugenioenko in #908
- fix(lsp): build valid file URIs for Windows paths by @eugenioenko in #935
- docs(plugins): list missing permissions by @danielmrdev in #928
- fix: send Ctrl+K and chord keys to focused terminal by @ulrichheringer in #924
- fix: recompute find matches after buffer edits by @ulrichheringer in #925
- fix(editor): ask before Save As replaces a dangling symlink or hard link by @adamsiwiec1 in #926
- fix(undo): restore the cursor when undoing line commands by @mangeshraut712 in #927
- feat(plugins): add omarchy-theme to the community registry by @danielmrdev in #929
- feat(plugins): show file types on plugin details by @danielmrdev in #930
- fix(search): scope find results to active tab by @danielmrdev in #931
- feat(git): add New Branch action to Changes panel by @danielmrdev in #932
- feat(ui): show file icons across editor surfaces by @danielmrdev in #934
- chore: remove audit docs by @eugenioenko in #941
- fix(search): show no matches on image and binary tabs by @mangeshraut712 in #946
- fix(search): refresh F3 matches after edits with find closed by @mangeshraut712 in #947
- test(terminal): check Ctrl+K reaches the shell through the PTY by @ulrichheringer in #949
- fix(git): compare the gutter against the index instead of HEAD by @adamsiwiec1 in #951
- fix(search): clear find highlights when closing find on a content tab by @cristianchiriac in #950
- fix(plugin): paste into the focused input of a plugin panel by @aahoughton in #954
- feat(plugin): inputs that wrap onto several rows by @aahoughton in #956
- feat(plugin): add ttt.decorations for line tints and text highlights by @aahoughton in #960
- docs(plugin): mention optional wrapping in the Input introduction by @paoValle in #968
- fix(plugin): route Copy and Cut commands to the focused input by @adamsiwiec1 in #969
- fix(plugin): revoke permissions a manifest no longer declares by @ulrichheringer in #961
- fix(search): keep a missing final newline when replacing in files by @jayhemnani9910 in #964
- fix(plugin): clear a plugin's decorations when it unloads by @aahoughton in #966
- feat(icons): let users override any UI glyph from settings by @ulrichheringer in #963
- fix(lsp): close signature help when the active tab changes by @ulrichheringer in #962
- feat(editor): add opt-in save all and quit by @rafjaf in #977
- feat(plugin): add hide decoration style by @eugenioenko in #980
- fix(plugin): check every redirect of a plugin's HTTP request by @aahoughton in #982
- fix(plugin): don't grant denied permissions or lose approval prompts by @aahoughton in #984
- feat(plugin): notes between lines in ttt.decorations by @aahoughton in #986
- feat(plugin): let network.http name any destination, local ones included by @aahoughton in #985
- feat(plugin): show or focus a plugin's panel, and follow growing content by @aahoughton in #991
- fix(plugin): request approval when enabling a plugin with additional permissions by @aazminu in #992
- fix(ui): style only the inserted dirty marker in tab labels by @aazminu in #993
- feat: terminal argv, per-tab specs, labels, and a ttt.terminal plugin API by @alytaphoenix in #994
- fix(icons): use named icons for remaining search controls by @aazminu in #995
- fix(icons): keep action glyphs consistent across font modes by @eugenioenko in #1004
- feat(plugins): add a curated Featured section by @eugenioenko in #1003
- fix(plugin): expose the app version during approval initialization by @wangyusheng1985 in #1001
- fix(terminal): reject an invalid explicit working directory by @orshih6 in #1005
- fix(icons): keep tab close and unsaved markers consistent by @eugenioenko in #1006
- feat(cli): open piped stdin in an untitled tab by @jayhemnani9910 in #1008
- docs(plugin): complete terminal API and permission scope documentation by @Hrushikesh-ramilla in #1013
- chore(plugins): bump pdf-viewer to 0.4.0 in the community registry by @sercanatalik in #1017
- perf(image): zlib-compress Kitty image data by @sercanatalik in #1020
- fix(plugin): clear status items and on_uninstall tabs when a plugin goes away by @adamsiwiec1 in #1015
- fix(plugin): reject stale approvals after a plugin is disabled by @webdevsamran in #1009
- fix(ui): render terminal labels using display widths by @eugenioenko in #1023
- feat(plugin): add a ttt.regex module for RE2 regular expressions by @jayhemnani9910 in #1016
- feat(config): add editor.largeFiles.wordWrapMaxMB setting (#942) by @montionugera in #970
- fix(lsp): dismiss signature help after asynchronous file navigation by @aazminu in #1011
- fix(plugin): bound oversized clear rectangles by @dannyward630 in #1014
- feat(editor): limit automatic reloads for large files by @eugenioenko in #1025
- feat(git): navigate detail controls by keyboard by @ulrichheringer in #1022
- release: publish checksums.txt alongside the release binaries by @lab1207 in #1030
- fix(herdr): route right-click to ttt in the plugin pane by @eugenioenko in #1027
- fix(plugin): keep anchors and word boundaries from matching inside a character by @jay23606 in #1026
- fix(plugin): load plugin directories behind a symlink by @lab1207 in #1031
- feat(plugins): allow per-widget Markdown wrap width by @Hrushikesh-ramilla in #1049
- fix(plugins): refresh dynamic button labels by @eugenioenko in #1047
- fix(markdown): keep prose wrapping tied to the viewport by @eugenioenko in #1045
- feat(plugins): add multiline input and minimum rows by @eugenioenko in #1043
- feat(plugins): support custom widget dialogs by @eugenioenko in #1041
- feat(plugins): support controlled input values by @eugenioenko in #1044
- feat(plugins): support full-width Markdown dividers by @eugenioenko in #1046
- feat(plugins): open native multi-file diff details by @eugenioenko in #1042
- fix(ui): replace every match, not just the listed ones by @lab1207 in #1032
- fix(editor): save relative Save As names into the workspace folder by @adamsiwiec1 in #1048
- fix(search): Replace All stop replaying stale matches for a file that no longer match by @bluzername in #1055
- fix(search): accept ripgrep no-match batches by @motodriver in #1054
- fix(plugins): drop plugin input while an approval dialog is open by @eugenioenko in #1057
- fix(plugins): stop panel:text clipping at the panel's mirror column by @eugenioenko in #1063
- fix(debug): report terminal focus and the active terminal tab by @orshih6 in #1060
- fix(widgets): let the dropdown take focus and open from the keyboard by @lab1207 in #1061
- fix(plugin): report a failed permission reduction instead of ignoring it by @lab1207 in #1062
- fix(terminal): clip a fullwidth rune at the scrollbar column by @lab1207 in #1070
- fix(widgets): draw button and dropdown labels by display width by @lab1207 in #1071
- fix(widgets): draw the checkbox label by display width by @lab1207 in #1072
- fix(ui): do not open a right-docked panel from the bottom edge by @lab1207 in #1075
- fix(widgets): measure keyvalue keys by display width by @tyza66 in #1076
- fix(lsp): apply a formatting result to the file it was requested for by @lab1207 in #1078
- test(plugin): a denied legacy network grant does not come back by @lab1207 in #1079
- feat(git): render commit detail messages as Markdown by @huskyhao in #1081
- fix(plugins): cancel README loads when detail tabs close by @eugenioenko in #1086
- refactor(git): use shared tasks for opening commit diffs by @eugenioenko in #1087
- fix(lsp): reject formatting results for a reopened buffer by @bfs2021 in #1089
- feat(plugins): two-way plugin RPC and gated input APIs by @eugenioenko in #1058
- Update README.md to remove extra sectons by @eugenioenko in #1098
- docs(install): pass INSTALL_DIR to installer shell by @eugenioenko in #1100
- Add install support for FreeBSD by @briandowns in #1101
- fix(search): honor empty replacement rescan results instead of stale offsets by @Hrushikesh-ramilla in #1097
- test(plugin): prove a legacy network denial is persisted by @bfs2021 in #1090
- fix(ui): open bottom panel overflow menu by @danielmrdev in #1093
- feat(release): add Android and Windows ARM64 builds by @eugenioenko in #1106
- test(plugin): cover permission-save failure while enabling a plugin by @LuckTerence in #1094
- chore: update vendorHash by @github-actions[bot] in #1108
- fix(editor): use current selection for Ctrl+D occurrences by @eugenioenko in #1107
- feat(image): detect Falcon terminal for Kitty graphics by @mike-ward in #1103
- fix(terminal): drain queued output before reporting process exit by @eugenioenko in #1110
- docs(readme): acknowledge new contributors by @eugenioenko in #1111
- fix(terminal): deliver PTY hangup before forcing shell exit by @eugenioenko in #1113
- test(terminal): wait for the shell to settle before hangup tests close by @eugenioenko in #1115
New Contributors (26)
New Contributors
- @premiuslol made their first contribution in #911
- @peterheo made their first contribution in #912
- @dannyward630 made their first contribution in #922
- @danielmrdev made their first contribution in #928
- @ulrichheringer made their first contribution in #924
- @adamsiwiec1 made their first contribution in #926
- @mangeshraut712 made their first contribution in #927
- @cristianchiriac made their first contribution in #950
- @paoValle made their first contribution in #968
- @aazminu made their first contribution in #992
- @alytaphoenix made their first contribution in #994
- @wangyusheng1985 made their first contribution in #1001
- @orshih6 made their first contribution in #1005
- @Hrushikesh-ramilla made their first contribution in #1013
- @webdevsamran made their first contribution in #1009
- @montionugera made their first contribution in #970
- @lab1207 made their first contribution in #1030
- @jay23606 made their first contribution in #1026
- @bluzername made their first contribution in #1055
- @motodriver made their first contribution in #1054
- @tyza66 made their first contribution in #1076
- @huskyhao made their first contribution in #1081
- @bfs2021 made their first contribution in #1089
- @briandowns made their first contribution in #1101
- @LuckTerence made their first contribution in #1094
- @mike-ward made their first contribution in #1103
Full Changelog: v1.8.0...v1.9.0