Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Beyond vim — what bemtvi adds

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.

Editing

FeatureWhat it is
Helix mode (selection-first)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.
Multi-cursor modeHelix/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.
Keyboard macrosvim’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.
Fonts'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.
Modeless editingAn 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.
The context menuA 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.
Undo stepsvim’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.
ExpressionsHand 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.
Smooth scrollingViewport scrolls slide instead of teleporting (neoscroll.nvim built in), interpolated client-side so it stays smooth even over a remote link. On by default.
Indent detectionA file’s own indentation sets its 'expandtab' / 'shiftwidth' on every read (vim-sleuth built in), per buffer, on every leg. On by default ('indentdetect').
Image previewsOpen an image file and the picture renders inline — ratatui-image in the terminal, a GPU texture in the GUI, an <img> in the browser.

UI surfaces

FeatureWhat it is
UI primitivesA 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.
Permanent docksVSCode-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.
Fuzzy pickerbtv.picker: a server-owned fuzzy finder with streaming Lua sources, live (dynamic) sources, a file/location preview pane, and fully rebindable keys.
Quickfix & named-list dock tabsThe 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.
Gutter textA 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.

Platform

FeatureWhat it is
Native btv.* plugin APIbemtvi’s own Lua API where the server owns every UI surface and plugins provide data and behavior.
WorkspacesThe 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).
Browser editorThe full editor — core, the Lua VM, and the server tick — compiled to WebAssembly, running entirely client-side with no server.
Edit-host split (remote editing)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.
Lua plugin testingbtv.test (describe/it/expect + async) plus a bemtvi --test-plugin runner, so pure-Lua plugins test themselves.