Skip to content

Bleeding edge (main)

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 May 17:56
44c2f14

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) a counted 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, not UnicodeWidthStr on 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)
  • p over 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_chars of 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) :bdelete no 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) :wincmd is 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.test cases 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