Repository navigation
Bleeding edge (main)
Pre-release
Pre-release
Rolling build of the main branch — not a stable release.
Built from 44c2f144 on 2026-11-03.
[unreleased]
Features
- (demo) Python snippets that exercise the whole snippet grammar (4a53be5)
- Detect a filetype from the name, the path and the
#!, not just the extension (a2b254a) - (decor) A provider draws what an extmark draws, not just highlights (b3a667a)
- Keyboard macros — record on , replay on (38289b1)
- (web) The client declares the chords it can only send via a stand-in (d658550)
- (web) Markdown highlights — both parsers bundled, the inline injection wired (3dd4fea)
- (picker) A diagnostic row leads with its severity, and wears its color (68c0838)
- (web) A browser session comes back the way you left it (1323a6a)
- (undo) The tree kept everything, but nothing could walk it (d8c8b0e)
- An icon with a blank cell beside it may keep the size the font drew it (8c30f0a)
- (keymap) Ctrl+C and Ctrl+V, on the system clipboard, out of the box (ab75490)
- (core) Report line-count and yank changes past 'report' (60b8801)
- Show the partly-typed command in the corner ('showcmd') (2370aa5)
- A bounded compute sandbox, and the expressions it makes possible (401dcaf)
- The expression register, the one whose contents are computed (d937daa)
- Btv.complete.scorer, the picker re-ranker's sibling over the popup (9d4bf77)
- (picker) Results appear as they stream, and the prompt says it is working (65800be)
- A table-returning sandbox seam, and frame-time paint on it (7008552)
- Quickfix rows you render yourself, on a table-shaped sandbox param (da4ae4f)
- An errorformat you can read, on the sandbox's table return (264467a)
- A paint span that draws more than a colour (e8d2ce6)
- A paint span that draws rows of its own (bdd7498)
- Specs for six more examples, and a statusline mirror that isn't empty (53b116a)
- Five more example specs, plus the two layers a spec could not see (66b5743)
- T:menu() and t:decor().line_bg — the last layers a spec could not see (1f23dd5)
- Specs for diagnostic-insert, encoding, endofline, explorer (ca9f301)
- Specs for format-on-save, glob, global-local-options (b821261)
- T:gutter(), and specs for the three gutter/glyph examples (147fac8)
- T:mouse(), so a mouse-driven feature can be tested at all (68bb797)
- T:tabs(), and specs for mouse-widgets, padding, panel, per-region-tabs (634454b)
- Specs for the four plugin examples (8af4325)
- The case operators (gu / gU / g~), and marks that outlive their buffer (65b6c30)
- Setreg('/') arms the search pattern, and t:showcmd() sees the corner (a83ba78)
- T:scroll() sees the slide, and the smart-indent tour types what it promises (63b5176)
- T:matches() sees the search highlight, t:menu() the kind column (1453bd0)
- T:tabline() sees a custom tabline, plus statusline/tabline specs (b5f5ab1)
- T:cmdline() sees the prompt label, and the ui-float demo loses a key clash (df368f5)
- A file's own indentation decides how you indent it (e974f34)
- Render reStructuredText in doc floats (8cec19e)
- 'linebreak' wraps at word boundaries instead of mid-word (ffc5813)
- The doc floats wrap as prose, and are sized to those rows (1fd258f)
- Bemtvi-gui runs on mitsuami instead of winit (4f005fd)
- Bemtvi-gui shows an input method's composition at the cursor (a770107)
- 'imdisable' turns the GUI's input method off, from a config (6afc85a)
- Bemtvi-gui splices an input method's composition in like inline virtual text (0a2e8a0)
- (options) 'background' is a real option, and changing it reloads the scheme (a446c03)
- (plugins) The recommended set installs the v1.0.0 releases (30a2be8)
- (gui) The bem-te-vi pixel-art app icon (ca1f656)
- (colors) The bemtvi colorscheme, the default and fallback everywhere (4859b5e)
- (plugins) The recommended set takes bemtvi-tree and bemtvi-line v1.0.1 (f4286f6)
- The intro screen, with the logo drawn in the terminal (c14120f)
:intro, the example and the docs for the intro screen (451766f)- (undo) An insert session undoes a word at a time (d563212)
- (undo) Pauses, cursor moves and inserted text start an undo step (5636b13)
- (undo) A mapping's output is one undo step (6fd7306)
- (gui) Let the window's Mica show through the backgrounds (c1e7560)
- Modeless editing for the GUI and the web, and font fallback lists (c0f5b05)
- (plugins) The recommended set takes bemtvi-line v1.0.2 (01bf913)
- (plugins) The recommended set takes bemtvi-line v1.0.3 (b74d560)
- (picker) The command palette lists the pickers (cd7610c)
- (gui) Let macOS's vibrancy show through the backgrounds (4303878)
- (modeless) Scroll markers show where each window's view is (59af550)
- (scroll) Sideways scrolls slide, and a drag at a side edge pans (606198e)
- A right-click context menu, and an async clipboard API for Lua (ee9aef0)
- (colorscheme) Bundle every colorscheme neovim ships (06c4618)
- (web) Btv.clipboard reaches navigator.clipboard in the browser (59ef863)
- (embed) Bemtvi embeddable in mitsuami apps, with a single-file editor preset (f4c6630)
- (list) Draw invisible characters with 'list' and 'listchars' (6eb1b67)
- (options) Showwhitespace, a clearer name for 'list' (a84bb8b)
- (list) Edge markers under nowrap, and eol on a full wrapped row (abae5b8)
- (list) Edge markers on by default (dd0d0af)
- (picker) Deprioritized paths, and .gitignore-respecting pickers (258a32e)
- (embed) Views-only sessions, exec_lua args, mounting a view in place (ef9a4df)
- (extmark) Gutter_text, a column of a plugin's own text (1f72192)
- (treesitter) Btv.treesitter.installed, set_query and btv.filetype.match (a7a9fdd)
- (plugins) The recommended set takes the new tree, snippets and markdown-preview releases (fb37ce9)
- (modeless) No Normal mode anywhere, read-only buffers included (05067e4)
- (hl) Btv.hl.blend, a theme's accent faded into its background (fa67457)
- (treesitter) TSInstalled and reload, and fixes the SourceGit port ran into (fdf459e)
Bug Fixes
- (tests) Finish the rename on a line the rebase brought in (816640e)
- Apply the pre-rename audit, with tests for what it changed (76f241c)
- (security) The audit's real findings, with the tests that prove them (3ef7c16)
- A paste is text, not keystrokes — bracket it so it lands verbatim (a8732ad)
- (web) Alt stands in for the Ctrl chords the browser steals (0f73c77)
- (web) A tool the demo's host can't run never RAN, so the pickers fall through (cabe98f)
- A mapping's RHS is allowed to end mid-command (2c1f1b2)
- (mouse) A settled click anchor is history, not something to drag from (46a80fd)
- (web) A config's buffer/window options landed in a catch-all, not the core (a862a5c)
- (tui) A wide glyph no longer swallows the ruler or the background behind it (be343bf)
- (undo) A travel that walked the wrong way, and a clock the browser never wound (a018ec4)
- (insert)
acounted bytes where the character wanted graphemes (8243907) - (undo) U, and g-/g+ stop rewinding out from under a selection (71d1532)
- (gui) The icons were sized by a rule written for emoji (6ae05a3)
- (tui) A skin-tone emoji stole two columns and a heart gave one back (94de650)
- (buffer) A reload that catches a writer mid-write no longer strands the buffer (aad07a4)
- (gui) The colours were counting characters where the glyphs counted cells (c0d5413)
- (web) A cluster's width is not the sum of its codepoints' (5234c34)
- The column grid follows
virtcol, notUnicodeWidthStron a whole string (3d4ad4b) - (gui) The block cursor was a veil over the glyph instead of an inversion (648ae45)
- (cmdline) The wildmenu sat a dock's width right of the line it belongs to (ccf71e3)
- (float) A docs float outlived the tab it was opened in (a996942)
pover a Visual selection puts the register in its place (28e1325)- (test) Every sandbox surface is restored between tests, not a fixed four (12ba4ac)
- A read is not an edit, and a panel that can't take focus must not chase it (181e81e)
- P/P never set the change marks, and two more layers a spec could not see (082b7fa)
- The layer cross could not reach the one dock built to be re-entered (2a3d2d4)
- O/O and typing inside a fold both landed on the wrong line (5efcc12)
- A new .png was an inert preview of nothing; add t:view() (1d3db73)
- Three macro bugs the plugin-test framework could not have found (6b331f5)
- The disambiguation oracle handed a user's own keys to the built-in (11aadb5)
- Three picker examples documented things that could not work (7c36295)
- A chunk's list write and the command that opens it, in the order written (b261669)
- A linewise register's text ends in a newline, however it was made (f470316)
:set a? b?answers both, not just the last one (51a2a4e)- Nvim_set_current_tabpage exists again (132fd05)
- Nvim_win_get_config reports where an aligned float actually sits (9a3063c)
- An extmark placed after load survives the first undo (fa3c456)
- The picker demo's own source honours the split/tab confirm keys (2ba00c8)
- The buffer completion source is one of
sources, not always on (aee79c3) - Soft tabs collapse into the real tab they add up to (9a0e4ce)
- The undo snapshot stopped re-cloning every extmark in the buffer (510e402)
- The case operators bracket what they recased with
'[/'](95d8438) - A joined
:set a? b?report keeps the error styling of its parts (0bbff92) - A completion
min_charsof 0 meant "no gate", not "no buffer source" (d174fa5) - The test-only input primitives are gated, not merely documented as such (a3257b9)
- The view-persist demo lands back in the file, not in its own sidebar (9f2abf6)
- (wasm) The mouse stamp is one clock, reachable from every leg (f150ce1)
- Two Windows bugs — settings written to the cwd, and a cursor that slides (2825a68)
- The picker preview highlights a pane, not the whole file, and not on the keystroke (0036582)
- A grep hit past 65535 chars into a line (5edb6db)
- An autoread reload no longer resets the buffer's options (6439470)
- Nvim_exec_lua reports a failing chunk to the caller (a103a85)
- The detected indent width goes on 'tabstop', not 'shiftwidth' (1307920)
- A file watch that cannot arm no longer pegs a core (5c8557a)
- Doc floats take their colours from the colorscheme, and their format from the server (3494c8f)
- Japanese and other input methods compose in bemtvi-gui on Windows (275b310)
- Bemtvi-gui keeps its input method through a click, and uses it only where keys type (385e89b)
- Bemtvi-gui quits cleanly after input methods were used (d911ed4)
- Clippy passes again, on Windows too (3921d9f)
- Clippy passes again on the newer toolchain (f278a5e)
- Bemtvi-gui leaves macOS input methods their keys, and takes their accents (19c7021)
- Bemtvi-gui lays wide chars out in two cells in its tablines, status rows and menus (f40c0a1)
- Bemtvi-gui follows its window's size on Windows, and shows a dead key's accent (4b012f2)
- (lua) Btv.pos.get and btv.line read the visual anchor and real marks (9e8e8a0)
- (test) Btv.test's baseline waits for the plugins a spec declares (adccfe6)
- (lua) Btv.pos.set writes marks, and '< '> span whole lines after V (2fc6a29)
- (examples) Treesitter-textobjects' spec and notes match what the keys do (58a709d)
- (server) A write that lands while a file watch is arming still reloads (ffef122)
- (hl) The palette's green reads the "added" colour first (6280056)
- (ts) Build grammars with the pinned Zig, never a compiler from PATH (69a774b)
- (gui) The selection and search paint over a span's own background (20e63cb)
- (clipboard) Back "+ / "* with the Win32 clipboard on Windows (d99676d)
- (modeless) Shift with the wheel scrolls sideways (331d35f)
- (modeless) Leaving a buffer, tab or window keeps the caret and selection (549405a)
- (buffers)
:bdeleteno longer panics when another tab shows only that buffer (0746550) - (modeless) A shift-click extends the selection instead of starting a new one (b7d18e7)
- Make bemtvi and its test suite work on Windows (56a039f)
- A three-pass audit for bugs, security holes and freezes (e0482c1)
- (shada) Bump redb to 4.4.0, ending the Windows hang on a damaged store (b190b1c)
- (tests) Make the suite pass on Windows (a361380)
- (contextmenu) A review of the context menu for bugs and costs (73dca67)
- (modeless) Keep the scroll thumb one size wherever the view is (07aa8e4)
- (list) A default that shows, in glyphs nobody types; whitespacechars (d0f7ece)
- (list) Show line ends by default, in a subtler tone (ed221e7)
- (scroll) Park the cursor by screen rows after and the wheel (04ab248)
- (scroll) The wheel over an unfocused window parks by its own rows (a75eb38)
- (virt-text) Inline cells take columns for clicks, wrapping and scrolling (4ff9e19)
- (treesitter) Injected regions past one budget finish, and stop flickering (4a49217)
- (gpu) No caret or solid block cursor without the focus or an active window (e66dfe3)
- (gpu) Explicit default fonts, and text stays in a font lacking a weight (3e91544)
- (view) A double-click selects the word in a view with no on_select (eb81569)
- (gpu) A span's own background slides with the text (44c2f14)
Performance
- Apply a paste as one edit, and make
.replay it faithfully (abc3b7b) - (extmark) A multi-key message refreshes only the marks it moved (f414d69)
- (extmark) The Lua mirror re-sends only the namespaces that changed (6382f6d)
Refactor
- [breaking] The project is bemtvi, and its plugin API is btv.* (f1f2235)
- (picker) The sources that faked columns now declare them (74f07c9)
- (web) Borrow the column math from Rust instead of mirroring it in JS (957f14e)
- (gui) Bemtvi-gpu, bemtvi-mitsuami and the bemtvi-gui binary (ee49152)
Documentation
- Describe bemtvi as neovim-inspired; record the commit co-author convention (8f3a892)
- The README stopped tracking the editor, and three plans never landed (2f2a4b9)
- The expression surfaces, in the book and as runnable examples (7a826db)
- The plugin-testing guide catches up with the baseline and the screen (a955eb8)
- Four comments that landed on the wrong item, and a stylua miss (c272bdd)
- Plan bemtvi-gui on mitsuami, replacing winit (7ed765f)
- Plan standard undo grouping (word-sized steps, tree kept) (8ebd730)
- (undo) The undo-steps feature page and a runnable example (a0fb0f8)
- (claude)
:wincmdis not an ex command (336bb35) - (plans) Bemtvi-tree's yank_path is on btv.clipboard now (23f086e)
- The editor, not the GUI, recognizes the dialog and workspace lines (aae6334)
- (plans) Screen-reader access to the GUI editor (parked) (bf2d178)
- (plans) List Phase 2 includes eol on a full wrapped row (80002b2)
Testing
- (e2e) The PTY suite stops reading the developer's data dir (710d4bd)
- The examples test themselves, and
btv.testcases become hermetic (b6ce09b) - Specs for examples/which-key and examples/ui-complete (4a7bd61)
- Specs for examples/treesitter-start and examples/ts-install (20a0090)
- Specs for the workspace, telescope-parity and view-persist examples (db5a373)
- Specs for the remote-config and code-action LSP examples (8a9b41f)
- Specs for the last three LSP examples, and every example now has one (4a5668b)
- The view-persist spec stops losing the sidebar it is testing (8845fa8)
- (plugins) The recommended set's pins reach the written plugins.lua (110c4a7)
- (ts-install) Wait for :TSInstallInfo's listing, which now opens off-tick (e577e62)
Miscellaneous
- The repo lives at bemtvi/bemtvi now (449d9d3)
- (demo) Refresh the edit-host demo's plugin set, and fix what it surfaced (76ff5bb)
- (wasm) Link the edit-host with em++, which is where __cpp_exception lives (068b1b9)
- Install the second wasm target the edit-host build needs (7909b57)
- Take mitsuami from its pushed branch, pinned by commit (cd73709)
- The Linux GUI AppImage bundles GTK 4's runtime data (dcedcfe)
- Pin the AppImage's GTK plugin to a commit and its hash (0c13de0)
- Pin linuxdeploy and its AppImage plugin to tagged releases and hashes (0dacdda)
- Take mitsuami 1.2.0 from crates.io instead of the git pin (c54ac31)
- Take mitsuami 1.3.1 (76d5e77)
- Take mitsuami 1.3.2 (6494e1c)
- Take mitsuami 1.3.3 (bd8a79a)
- (web) The demo bundles the plugins at their release tags (15d9d89)
- (deps) Upgrade dependencies, ureq 3, and raise rust-version to 1.95 (65018b5)
- (deps) Mitsuami from crates.io, 2.0.0 (9fced25)
Other
stylua --check .tells the truth again (f7a559d)- Update readme (d67e473)
- Stylua over examples/, and the hook now keeps them formatted (4a64a48)
- Merge branch 'gui-on-mitsuami' (6520aea)
- Update readme (84068dc)
- Fix (281862c)
- (list) Edge markers off by default again (a39e9aa)
- Fix memory blow up on live_grep (820e0b8)
- Add logo (07774af)
Verify a download's provenance:
gh attestation verify <file> --repo bemtvi/bemtvi