Valdemar Lorenzen 60a12110fa perf: bound diff label projection during caret scrolling
The label lag came from repeatedly projecting full viewports while walking backwards from the caret. Skip only candidates whose maximum possible source/wrap and label height cannot reach the target, then retain the original first-target search. Reuse already resolved scope contexts. The conservative bound preserves non-monotonic unified declaration visibility and independent sticky labels. Added regressions for split declaration-visibility ties and unified height changes; architecture updated. Verification: 10,176 differential projections matched; all 964 release tests pass; release binary built. Reduced repro p95: 3.9572ms -> 1.4467ms. Live 160x100 function-dense 360-key burst median catch-up: 22.895ms -> 9.611ms, with final cursor/viewport asserted. Full and no-dependency Clippy checks are blocked by existing repository warnings, including vendored Crossterm, blame, LSP, Markdown, syntax and existing TUI code. Temporary harnesses removed. No remote changes.
2026-10-16 18:52:50 +02:00
2026-10-05 14:04:25 +02:00
2026-10-15 11:56:54 +02:00
2026-10-15 11:56:54 +02:00

vamp

A modal Rust editor with a replaceable frontend and subprocess-isolated Ruby plugins.

Run

Requires current stable Rust and an interactive terminal. Ruby 2.6+ with its standard-library JSON support is required only for configuration/plugins; no Ruby gems are needed to run vamp itself.

cargo run -- --no-config notes.txt
cargo run -- --config examples/config.rb notes.txt

Without a file, vamp opens an unnamed buffer. A nonexistent file opens an empty buffer. cargo run -- --help lists the command-line options.

Getting started

Vamp starts in Normal mode. Press i, type text, then Esc to return to Normal. Type :save (alias :w) and Enter to save, or :save path to name an unnamed buffer. Type :quit (alias :q) and Enter to quit; it refuses unsaved changes in any open buffer. :force_quit (alias :q!) explicitly discards changes and quits.

Task Default keys
Move in Normal h/j/k/l or arrows; w/b/e for words
First/last line in Normal or Visual gt / gb, at first nonblank; Visual extends the selection
Enter/leave Insert i / Esc
Manual LSP completion in Insert Ctrl+n starts/cycles next; Ctrl+j/k cycles next/previous, replacing text live
Edit completion snippet arguments Type to replace the highlighted argument; Tab / Shift+Tab moves next/previous
Save in Normal Space then w, or :w then Enter
Undo/redo in Normal u / U (Shift+u)
Split panes in Normal _ above/below; | left/right; Option/Alt+h/j/k/l changes focus
Close a pane :pane.close; :pane.force_close explicitly discards exclusively displayed unsaved edits
Open/switch tabs in Normal :tab.new opens the current buffer; Ctrl+Option/Alt+h/l switches previous/next
Close a tab :tab.close; :tab.force_close explicitly discards exclusively displayed unsaved edits
Delete/change whole lines in Normal dd / cc; leading counts work (3dd, 2cc)
Search in Normal /, type a literal query, Enter; n/N for next/previous
Select/copy/cut v characterwise or V whole rows, move to extend, then y/d in Visual
Paste in Normal p/P after/before the caret or row for linewise fragments; system clipboard by default
Paste over selected text p / P in Visual replaces every selection, preserving the clipboard
Command palette Ctrl+p; type to filter, arrows select, Enter accepts, Esc cancels
Buffer picker in Normal Space then b l or :buffers; type to search, arrows select, Enter switches, Esc cancels
Floating/docked explorer in Normal or Visual Space then o / Space then e
Repository diff in Normal :diff; choose Before then After, Tab changes category, type to search; Esc closes the selector; Working or checkout-matched pinned After is editable; :diff.close exits the comparison
Diff layout in Normal Space then v cycles split/unified; Space then s flips left/right vs above/below split
Resolve jj working-copy conflicts :resolve; edit marker-free Draft versus Alternative, :resolve.history for inputs/base, :w to save and confirm with jj

Space is the default leader: press its suffix keys in order, not simultaneously. The editing guide contains the complete key table and behavior reference.

Configuration

By default, vamp loads $XDG_CONFIG_HOME/vamp/config.rb, or ~/.config/vamp/config.rb when that environment variable is unset. --config path selects a file explicitly; --no-config bypasses Ruby entirely and uses defaults.

Start with examples/config.rb. The configuration reference covers preferences, bindings, and native LSP setup. Language servers are disabled by default; install a trusted server and explicitly enable it.

Ruby configuration and plugins run with your account's filesystem/process permissions. Subprocess isolation is not a security sandbox; load only trusted scripts.

Current limits

  • Terminal frontend only; no graphical frontend.
  • Modal editing, not full Vim compatibility: characterwise and linewise Visual selections and counted dd/cc, but no block selection, named registers, or general operator–motion grammar. Search is literal, case-sensitive, and single-line.
  • Native opt-in LSP supports diagnostics, go-to-definition, plain-text hover, manual primary-caret completion with snippet arguments, and automatic semantic highlighting—not rename, formatting, or code actions. Completion has no automatic popup or acceptance step; other carets are preserved and translated through the chosen edits. Snippet regex transforms and unresolved variables without defaults are omitted.
  • System clipboard access supports macOS and Linux. Separate clipboard mode keeps internal editing available on unsupported/headless environments.

Performance and subprocess limits are documented in development.

Documentation

Guide Contents
Editing Keys, motions/counts, selections, repeat, clipboard, search, buffers, explorer, palette, syntax highlighting
Configuration Ruby startup, preferences, action/mode reference, key notation, leader/list/tree bindings, native LSP
Plugins Ruby API, capabilities, effects, asynchronous callbacks, isolation, messaging protocol
Architecture Module ownership, session/frontend contracts, terminal lifecycle, syntax caches, native workers
Development Verification commands, test organization, performance and process limits
Project context Terminology and configuration-interface conventions
S
Description
No description provided
Readme 33 MiB
Languages
Rust 98.8%
Ruby 1.2%