Releases: bgunnarsson/binvim
Releases · bgunnarsson/binvim
Release list
v0.5.15
Added
- First-run toolchain setup. Open a file whose language is missing its LSP
or formatter and binvim now says so — a popup (the same overlay style as the
file picker, so a competing notice like Copilot sign-in can't paint over it)
leads with an "Install all missing dependencies" action and itemises what
that covers;Enteropens:installpreselected to that language's bundle so
you review the plan and confirm withy,Escdismisses. The new
<leader>iopens the same preselected installer on demand. The popup fires at
most once per language per session, skips large files and languages that can't
be auto-installed (Razor's OmniSharp), won't open over another overlay or
mid-edit, and never nags about DAP adapters — only the LSP + formatter that
make a language feel set up. Silence it with[install] prompt_on_open = false.
v0.5.14
Fixed
- Pasting over a Visual selection no longer clobbers the register. Visual-mode
p/Pcopied the replaced text into the unnamed register (Vim's default), so
pasting a yank over one line and then over the next replayed the line you had just
overwritten instead of the original yank. The replaced selection is now dropped
rather than yanked, so the register keeps the pasted content and the same yank can
be put down over line after line. - The Files picker highlights the best-scoring fuzzy match, not a greedy one.
The matcher bound each query character to its first occurrence left-to-right, which
scattered the highlight across a path (matchingfooter.cshtmloverFeatures/Footer
instead of the contiguous trailingFooter.cshtml). A dynamic-programming pass now
finds the alignment that maximises the bonus total, so the highlighted characters
track the run a human would pick — contiguous, at word boundaries. - The DAP Console tab scrolls in the same direction as the rest of the UI.
Performance
- Input bursts coalesce into a single render. The event loop redrew the whole
editor once per input event, so a fast trackpad/wheel scroll over a pane — delivered
by the OS as a flood of scroll events — backed up dozens of full-screen frames and
the editor visibly lagged catching up after the gesture. This was most painful with
an AI side pane open: scroll events forwarded to the embedded tool triggered output
floods, and a click to return focus to the code sat behind the whole backlog, so the
cursor took a beat to reappear. The loop now drains everything already queued before
drawing once, collapsing a burst to one frame (capped so a continuous stream can't
starve the PTY drains).
v0.5.13
Fixed
- The mouse wheel now scrolls the AI side panes (
:claude,:codex).
The side pane forwarded the wheel to the embedded tool only when the tool
had enabled DECSET mouse tracking, and otherwise dropped the event. Claude
and Codex render on the normal screen via in-place repaint and never turn
mouse tracking on, so their committed history scrolled into binvim's own
grid scrollback with no way to reach it. The wheel now pages that scrollback
directly — the same fallback the bottom:terminalpane already had — while
mouse-tracking tools (opencode) keep getting the wheel forwarded, and an
alt-screen pager without tracking has the wheel translated to arrow keys.
v0.5.12
Fixed
- Terminal and AI panes are now reachable from the start page. The
start-page input guard only lets a key through while a<leader>chord
is mid-flight, but its hand-maintained list of in-progress sub-leaders
had dropped the terminal (<leader>t…) and test (<leader>s…) menus.
With nothing else open, the follow-up key of those chords was swallowed,
so<leader>tt/<leader>tfnever opened or focused a terminal — the
AI menu only worked because its flag happened to still be listed. The
guard and the which-key timer now share a singleany_leader_pending()
check, so the two lists can't drift apart again.
v0.5.11
Added
- Python / PyPI package backend for
<leader>p. The package manager now
recognises Python projects (.pybuffers /requirements.txt) alongside
.NET, npm, Cargo, and Go. It readsrequirements.txtfor installed packages,
lists every release from PyPI's JSON API (sorted newest-first with a PEP 440
comparator, prereleases behind theTabtoggle), andaddrewrites the
requirement line in place — it never shells out topip, so there's no
guesswork about which interpreter or virtualenv to touch. Because PyPI
retired package search, the search flow resolves an exact package name via
the JSON API instead. NeedscurlonPATH.
v0.5.10
Fixed
- Shift-Left / Shift-Right now scroll the debug pane horizontally again.
The shifted arrow bindings sat below the unshifted Left/Right tab-cycle
arms in the match, so they were unreachable and never fired. They now
precede the cycle arms and scroll long stack-frame paths / console lines
as intended. - The status line now shows a modified marker (
●) for unsaved
buffers. The marker slot after the file path had two identical
branches, so it rendered a blank space whether or not the buffer was
dirty; it now paints a dot when there are unsaved changes.
Changed
- Internal clippy cleanup pass — no behavioural change. Mechanical
lint fixes across the tree (idiomaticabs_diff/div_ceil/
eq_ignore_ascii_case, redundant.max(0)removals, dead-code
pruning) plus scoped#[allow]s where the lint's rewrite would hurt
readability.
v0.5.9
Added
.slnxsolutions are recognised as a .NET workspace root. The .NET 10
XML solution format now anchors workspace-root discovery alongside the
classic.sln, so a buffer deep inside a project resolves to the solution
directory instead of the project directory.
Fixed
- Heavy terminal/AI panes no longer freeze input then "replay" it. A
chatty TUI in a:terminalor AI side pane (e.g. opencode) can queue
megabytes of output between ticks; the drain parsed the entire backlog
in one main-loop pass, blocking the event loop long enough that
keystrokes piled up unread and then fired in a burst once it finished.
PTY drains are now budget-capped per tick, so leftover output catches
up across the following ticks while input stays responsive. - The .NET debug picker no longer offers class libraries. Launching the
debugger listed every project, including class libraries that build then
fail at launch with a missingruntimeconfig.json. The picker now filters
to projects that produce a runnable executable (explicitOutputType
Exe/WinExe, or the Web/Worker SDK), falling back to the full list when
nothing looks runnable so detection gaps never strand a launch.