bemtvi speaks vim at the keyboard: keystrokes, modes, ex-commands, and options
track vim/neovim’s observable editing behavior. On top of
that baseline it grows a handful of features vim and neovim don’t have natively —
modern editing and UI surfaces that fit the modal grammar rather than fighting
it.
This page is the index. Each feature below has a full guide linked from its name;
the one-liner is the elevator pitch.
An opt-in selection-first editing model (:helix): noun→verb on a persistent anchor..head range, multi-selection as the default. Motions re-select, verbs act now with no operator-pending wait — match mode, surround, regex-select, and per-selection everything.
Helix/Sublime-style multi-editing: drop N cursors in a dedicated placement mode, then have motions, operators, visual mode, and insert all act on every cursor at once.
vim’s record-and-replay on bemtvi’s keys: <F2>{reg} records what you typed (mappings included, so a Lua keymap replays), {count}<F3>{reg} plays it back, and a failed keystroke ends the run — so 99<F3>a stops at the end of the buffer. The macro is a plain register holding readable key notation.
'guifont' as a fallback list, tried in order for every character in the GUI and the browser, each font with its own weight, scale and OpenType features (btv.ui.font). A font that isn’t installed is reported.
An opt-in GUI and web editing model (:set modeless): a buffer rests in Insert, Shift with an arrow selects, typing replaces a selection, and the familiar Ctrl (Command on macOS) chords copy, paste, undo, find and open the command palette. No Normal mode to fall into; the terminal client refuses it.
A right-click opens a menu at the pointer in every session: undo, the clipboard verbs, the LSP verbs and the command palette. It is built from groups (btv.contextmenu) that each buffer lists in its own order, so a config or a plugin can reorder it, edit a group, or add one whose rows load asynchronously.
vim’s undo tree with GUI-sized steps: typing undoes about a word at a time (a step ends at a separator, a line break, a switch between typing and deleting, a pause, or a cursor move), while a paste, a mapping’s output, a snippet and a . repeat each stay one step.
Hand bemtvi a small Lua expression where a fixed rule is not enough: :s/…/\=…/ computes each replacement, 'foldexpr' decides fold levels, and btv.fold.text / btv.indent.expr / btv.filetype.detect / btv.picker.scorer answer the questions the core will not guess at. They run in a stateless, deadline-bounded second Lua VM.
Viewport scrolls slide instead of teleporting (neoscroll.nvim built in), interpolated client-side so it stays smooth even over a remote link. On by default.
A file’s own indentation sets its 'expandtab' / 'shiftwidth' on every read (vim-sleuth built in), per buffer, on every leg. On by default ('indentdetect').
A layered toolkit for plugin UIs — a Vue-shaped reactive component model (btv.component), plugin-owned content surfaces (btv.view), ready-made async widgets (btv.ui input/confirm/select), and floating windows — all server-owned and sharing one geometry vocabulary.
VSCode-style editable edge panels (file tree, terminals, problem lists) that are global across tabs, toggle independently of windows, and carry their own tabs and options.
The quickfix list and named lists open as bottom-dock tabs by default ('qfdock') — several searches side by side, entries jumping into the main area — with the btv.qf.* sinks and the picker’s <C-q> / <Tab> multi-select. Location lists keep vim’s split behavior.
A column of a plugin’s own text between the line numbers and the text (the gutter_text extmark key): a diff’s old and new line numbers, a blame hash and author. It isn’t part of the line, so a sideways scroll, a click, $ and wrapping all keep working.
The VSCode “open a folder” model: --workspace <dir> opens a directory as a persistent project session, restoring its layout/tabs/buffers and carrying per-workspace option overrides (btv.wso).
Edit on a remote machine with zero typing lag: the editor and Lua run locally while an bemtvi --daemon serves the filesystem, processes, and watching over ssh or QUIC.