For old changelog, see changelog/CHANGELOG-{version}.md
- kernel: rope data structure (
mm/rope.rs) — custom B-tree with O(log n) insert/delete, O(1) clone viaArcstructural sharing, and O(log n) position conversion. Zero external dependencies. (#711)
- kernel:
Bufferinternal storage replaced fromVec<String>toRope— all public API signatures unchanged,Buffer::clone()is now O(1) (~16ns vs ~8ms for 100K-line buffer) (#711) - kernel:
BufferSnapshotandblock::Snapshotnow useRopeclone instead ofVec<String>deep copy — snapshot creation is O(1) (#711) - kernel: rope uses line-separator semantics — trailing
\nproduces an empty line inline_count()andline(), matching editor expectations for delete+insert patterns (#732) - search:
position_to_byte/byte_to_positionnow use Buffer's O(log n) rope methods instead of local O(n) helpers — eliminates 2-4 content() materializations per search (#711) - session:
buffer_text_range()uses byte-indexed&strslicing instead ofVec<char>per-line allocation (#711)
- input: remove gratuitous
Box::leakinhandle_pop_result—CommandContext::set()accepts&str, no static lifetime needed (#714) - motions:
geandgEnow correctly distinguish Word vs BigWord boundaries —word_end_backwardwas ignoring theWordBoundaryparameter (#720) - session:
close_windowand compositor close now useWindowLayout::remove()instead of bypassing it — fixes staleactive_indexreturning wrong window after close (#712) - editor:
display_line_countnow uses Unicode display width instead of char count — CJK characters correctly occupy 2 terminal columns (#717) - kernel:
CommandId.nameandOperatorId.namechanged from&'static strtoCow<'static, str>—from_qualified()no longer leaks memory viaBox::leakon every call (#713) - vfs: replace lossy
From<io::Error>withVfsError::from_io(err, path)— error messages now include the file path instead of showing empty string (#715) - vim:
load_personality_manifestnow propagates parse errors instead of swallowing them — module correctly fails to init if vim.toml is corrupted (#718) - lsp: monitor LSP saturator task with watcher — if the task panics,
activeflag is cleared and user is notified instead of silently losing all LSP features (#719) - trace:
init_profiling_with_filternow uses the filter argument viaTracingProfiler::with_filterinstead of discarding it (#716) - kernel:
OptionRegistry::registerholds write lock for entire check-and-insert, fixing TOCTOU race between read and write locks (#721) - testing:
IntegrationTestandStepTestnow query registers via gRPC instead of returning empty HashMap —assert_register!macro is usable (#722)
- statusline: diagnostic counts section (Section X) with Nerd Font error/warning/info/hint icons — only shown when counts > 0
- statusline: git branch icon (), modified icon (●), readonly icon () replace plain text indicators
- statusline: theme-aware colors via
statusline_bg/statusline_fghighlight groups cached ininit() - bufferline: Nerd Font pin icon () and modified dot (●) replace ASCII
*and[+] - bufferline: theme-aware colors via highlight groups cached in
init() - microscope: file type icons rendered next to picker results
- display:
DiagnosticPresenterregistered in bootstrap — diagnostic gutter icons now appear - display:
mode_replacehighlight group added to all 3 builtin themes (Dark, Light, TokyoNight) - illuminate: word reference highlighting on cursor-hold — after 300ms idle, all occurrences of the word under cursor are highlighted with
]]/[[navigation - syntax-treesitter: injection decorations — doc comments (
///,//!) now inherit markdown decorations from child drivers (#696) - hover: markdown rendering in hover popups — bold, italic, code spans, headings, fenced code blocks, and horizontal rules are styled instead of shown as raw syntax (#697)
- microscope: syntax highlighting in preview panel — file previews show tree-sitter-based syntax colors for all supported languages (#698)
- syntax-treesitter: bare fenced code blocks in doc comments inherit parent language —
```without a language tag in Rust doc comments defaults to Rust highlighting (#701) - keybindings:
LeaderKeyProviderservice and in-crate personality adapters — feature modules (git-signs, diagnostics-panel, bufferline, etc.) register vim-aware keybindings with qualified"vim:normal"mode strings and<leader>expansion at bootstrap (#700) - lsp: integration tests for hover (
K) and goto-definition (gd) against real rust-analyzer (#692)
- viewport: overlapping syntax tokens now resolve to the most specific (narrowest) match — fixes injection highlights being hidden by broader parent tokens (#696)
- session: split window inherits cursor and viewport from source —
<C-w>v/<C-w>sno longer reset new pane to line 0 - range-finder:
;/,repeat after label-selectedf/F/t/Tnow advances to the next match instead of re-entering label mode (#663) - server: operator-pending
ds/cs/yswith leap motions now completes —on_command_completefires after pop-result command execution (#663) - gutter: add generic column priority for ordering — columns now sort by
priorityfield (lower = further left) instead of Vec insertion order - tui: dispatch
OptionChangednotifications to client modules —:set nuand:set rnunow toggle line numbers in real-time - lsp: non-blocking hover popup —
K(hover) returns immediately via fire-and-forget async + ArcSwap cache + tick polling, no longer freezes editor for up to 5 seconds - hover: dismiss popup on cursor movement in normal mode via
on_cursor_update() - hover: fix popup requiring two
Kpresses — async task no longer kills the tick consumer before it can deliver the cached LSP result - hover: fix crash on multi-byte characters (box-drawing
─from markdown horizontal rules) — truncation now uses character-aware slicing instead of byte offsets (#692) - hover:
display_width()returns character count instead of byte length for correct popup sizing (#692) - lsp: stabilize flaky diagnostic count assertion — relaxed to
>= 1with at least one error check (#692) - cmdline:
:s/pattern/replacement/now dispatches correctly — ex-command parser splits name at first non-alpha character instead of whitespace (#705) - bufferline:
H/Lbuffer prev/next,:bnext/:bprevious/:bd/:qaex-commands,<Space>bdbinding (#699) - motions: screen-high/low relocated from
H/LtogH/gL(#699) - window:
<C-h/j/k/l>direct window focus navigation in normal mode (#699) - lsp-navigation: diagnostic navigation
]d/[d,]e/[e,]w/[wfor next/prev diagnostic/error/warning (#699)