Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
263 commits
Select commit Hold shift + click to select a range
46cc3cb
docs(sdd): record the measurement traps this campaign met
metaphorics Oct 28, 2026
c14f47f
perf(editor): cache the option and register mirrors
metaphorics Oct 28, 2026
5d9b46e
style: apply rustfmt to the modules this campaign touched
metaphorics Oct 28, 2026
f62f931
docs: restate the slow edit path after the mirror fix
metaphorics Oct 28, 2026
9e10ca3
fix(window): copy window options only where upstream copies them
metaphorics Oct 28, 2026
512ca1b
fix(eval): answer "." from the :h modifier of a bare name
metaphorics Oct 28, 2026
ea8ad9e
docs: close the slow edit gap and list the remaining timeouts
metaphorics Oct 28, 2026
99393e0
feat(eval): implement call() and bind a Partial dictionary as self
metaphorics Oct 28, 2026
564de3a
fix(fs): route getfperm to the filesystem dispatcher
metaphorics Oct 28, 2026
29ecf19
docs: record the final counts for this tranche
metaphorics Oct 28, 2026
8f46d34
feat(eval): honour the uniq() comparator
metaphorics Oct 28, 2026
0928e93
docs: sync the final counts after the uniq comparator
metaphorics Oct 28, 2026
e9a6fd4
test(eval): cover call() and the uniq() comparator
metaphorics Oct 28, 2026
5ad0222
docs(sdd): record the failure slices cut for the next wave
metaphorics Oct 28, 2026
8da65f8
docs(sdd): record what the terminal probe showed
metaphorics Oct 28, 2026
8746163
fix(lua): keep the loader's relative path entries like upstream
metaphorics Oct 28, 2026
a93e702
chore(lua): apply rustfmt to the strict regex compiler
metaphorics Oct 28, 2026
3fa6889
fix(terminal): mark the buffer and pump job output during :sleep
metaphorics Oct 28, 2026
5e8dbcc
feat(builtins): answer win_findbuf and getcmdwintype
metaphorics Oct 28, 2026
56f083b
fix(mode): refuse a put count whose text length overflows
metaphorics Oct 28, 2026
7c0a007
fix(lua): read v:exiting as vim.NIL before shutdown
metaphorics Oct 28, 2026
8ebdd32
fix(server): flush terminal jobs on the Lua wait path
metaphorics Oct 28, 2026
a76714b
feat(history): add the five history tables and their builtins
metaphorics Oct 28, 2026
aaa779d
feat(ex): complete the put path and the missing command cluster
metaphorics Oct 28, 2026
89f062b
feat(channel): implement the channel and terminal functions upstream has
metaphorics Oct 28, 2026
8ee39b8
feat(lua): implement vim._core.keyparse and fix the Tab termcode
metaphorics Oct 28, 2026
eeae23f
fix(ex): honour the abandon gate and a bang-terminated modifier
metaphorics Oct 28, 2026
68f8481
feat(ex): add cpfile/lpfile and the forced-abandon unload
metaphorics Oct 28, 2026
6a0b5e2
feat(builtins): add the timer family and seven missing queries
metaphorics Oct 28, 2026
c58b2ac
feat(ex): add the listdo family, autocmd flags, :defer and mid-sleep …
metaphorics Oct 28, 2026
f6c8a2e
fix(eval): run a closure against every live editor map
metaphorics Oct 28, 2026
cb4a034
feat(builtins): add shiftwidth, haslocaldir, bufloaded, msgpack and d…
metaphorics Oct 28, 2026
6f62361
feat(ex): deliver stored funcrefs as values, add checkhealth and dire…
metaphorics Oct 28, 2026
42beb24
fix(timers): keep a stopped timer visible until its delivery ends
metaphorics Oct 28, 2026
e05e8fd
chore(builtins): drop imports the shared predicate replaced
metaphorics Oct 28, 2026
79d9213
fix(timers): keep an in-flight timer listed through timer_stopall
metaphorics Oct 28, 2026
022ad66
fix(runtime): source Lua plugins as Lua
metaphorics Oct 29, 2026
b58ba06
feat(uv): add uv.pipe and pipe:open, and make v:vim_did_enter a trans…
metaphorics Oct 29, 2026
c9ebeca
feat(uv): add an owned-descriptor spawn entry
metaphorics Oct 29, 2026
fb3e2c4
feat(uv): let Lua spawn with its own pipe descriptors
metaphorics Oct 29, 2026
e5c3746
docs(report): record the pipe registry result and the difftool shift
metaphorics Oct 29, 2026
f8da21d
fix(uv): keep pipe descriptor reuse safe
metaphorics Oct 29, 2026
c687a28
docs(report): record the pipe registry, the reuse fix, and the diffto…
metaphorics Oct 29, 2026
17a6c24
fix(uv): mark spawned descriptors only after the spawn starts
metaphorics Oct 29, 2026
c94cdaf
docs(report): fix the commit record and mark the Ex-command cause as …
metaphorics Oct 29, 2026
f0797e8
fix(quickfix): jump through a list whose entries are all invalid
metaphorics Oct 29, 2026
1fbd944
docs(report): record the quickfix nonevalid result
metaphorics Oct 29, 2026
fbc48a2
test(quickfix): pin all-invalid and mixed-list jumps
metaphorics Oct 29, 2026
65fb2fd
feat(autocmd): fire WinClosed when a window goes away
metaphorics Oct 29, 2026
47625dd
fix(layout): split the outermost frame for botright windows
metaphorics Oct 29, 2026
3ca8241
feat(startup): support -d and report v:argf
metaphorics Oct 29, 2026
3e75314
docs(report): record the green difftool spec
metaphorics Oct 29, 2026
b72a751
refactor(layout): share one directory listing implementation
metaphorics Oct 29, 2026
1306330
fix(editor): keep the upper window's view when a root split shrinks it
metaphorics Oct 29, 2026
b425af0
fix(uv): let a child see end-of-file on its own stdin
metaphorics Oct 29, 2026
44ba18e
fix(uv): answer vim.system the way its callers expect
metaphorics Oct 29, 2026
9fb8593
docs(report): record the lua group measurement and the stdin EOF fix
metaphorics Oct 29, 2026
e606c75
docs(report): record the completed lua group measurement
metaphorics Oct 29, 2026
3459fd0
docs(report): record the reference-binary control for the timeout test
metaphorics Oct 29, 2026
ec0b16f
fix(uv): keep scheduled work out of a fast-only wait
metaphorics Oct 29, 2026
9406c36
docs(report): correct the system_spec counts and record the timeout f…
metaphorics Oct 29, 2026
b7b1eab
docs(report): record the timer-precision cause for the async timeout
metaphorics Oct 29, 2026
974ee58
test(lua): cover the vim._core.keyparse Lua shape
metaphorics Oct 29, 2026
575ab4b
docs(report): record the keyparse coverage
metaphorics Oct 29, 2026
41df505
docs(report): record why dict watchers need a plumbed call context
metaphorics Oct 29, 2026
4ec9b8b
fix(usercmd): expand `<q-bang>` to the quoted bang
metaphorics Oct 29, 2026
9acd3b2
refactor(path): derive the URL predicate from one source
metaphorics Oct 29, 2026
4e74e2c
fix(path): keep a URL name out of the working directory
metaphorics Oct 29, 2026
6a599cb
docs(report): record the plugin group measurement and the dir listing…
metaphorics Oct 29, 2026
345b5bc
test(api): pin that a URL buffer name stays absolute
metaphorics Oct 29, 2026
d6d8b7f
docs(report): record the OptionSet gap and the buffer-name regression
metaphorics Oct 29, 2026
4f56421
feat(autocmd): fire OptionSet from the option API
metaphorics Oct 29, 2026
4a9ad2a
docs(report): record the OptionSet dispatch and its remaining scope
metaphorics Oct 29, 2026
1dd4c70
feat(autocmd): fire OptionSet from the legacy option setter
metaphorics Oct 29, 2026
4fec3e9
refactor(options): read an option value the same way everywhere
metaphorics Oct 29, 2026
40b4e80
feat(autocmd): fire OptionSet from `:set`
metaphorics Oct 29, 2026
a78df1e
test(autocmd): cover the legacy option setter
metaphorics Oct 29, 2026
74836a0
docs(report): record the three OptionSet callers
metaphorics Oct 29, 2026
78e2bed
fix(api): report the option flags the request carried
metaphorics Oct 29, 2026
f4ff8a5
docs(report): record what blocks each remaining gap
metaphorics Oct 29, 2026
b600ffa
docs(report): record the full oldtest measurement and its clusters
metaphorics Oct 29, 2026
2567809
docs(report): separate the E5108 causes and mark the health cause unc…
metaphorics Oct 29, 2026
a20c5e0
fix(autocmd): run a body under the script that defined it
metaphorics Oct 29, 2026
6011096
docs(report): record the oldtest delta from the script-scope fix
metaphorics Oct 29, 2026
49a2ebc
feat(excmd): add `:doautocmd`
metaphorics Oct 29, 2026
0f17849
docs(report): record the :doautocmd addition
metaphorics Oct 29, 2026
0eca8cf
docs(report): record the red proof for :doautocmd
metaphorics Oct 29, 2026
45d2c27
fix(excmd): match `:doautocmd` to the reference contract
metaphorics Oct 29, 2026
c785631
docs(report): record the doautocmd contract corrections
metaphorics Oct 29, 2026
6d41a9f
docs(report): record the ex_cmds functional group measurement
metaphorics Oct 29, 2026
e69592a
docs(report): mark the ex_cmds run partial and correct the E5108 cause
metaphorics Oct 29, 2026
bdfa2f9
docs(report): record the dict-watcher design that fits the port
metaphorics Oct 29, 2026
50e8f04
docs(report): record the scope-dict subscript defect and the reverted…
metaphorics Oct 29, 2026
9d37f7f
fix(lvalue): write `g:['k'] = v` into the scope itself
metaphorics Oct 29, 2026
797d5a5
fix(lvalue): remove `g:['k']` from the scope on `:unlet`
metaphorics Oct 29, 2026
2a44b9e
docs(report): record the scope-dict fixes and their red proofs
metaphorics Oct 29, 2026
23f150e
docs(report): record the dict-notifications result and the rpcnotify …
metaphorics Oct 29, 2026
421cd0e
docs(report): record the client-channel sink the rpcnotify gap needs
metaphorics Oct 29, 2026
208bff3
docs(report): state the PTY ownership constraint precisely
metaphorics Oct 29, 2026
70c6677
docs(report): scope the E5108 host claim to the oldtest path
metaphorics Oct 29, 2026
de637e0
fix(lvalue): quote the missing key in E716 and prove the error surface
metaphorics Oct 29, 2026
5eeb6b5
docs(report): identify the checkhealth callback path as the E5108 cause
metaphorics Oct 29, 2026
cef2725
feat(dictwatch): fire watchers for dictionary targets
metaphorics Oct 29, 2026
e28c0eb
docs(report): record the Ex command inventory
metaphorics Oct 29, 2026
127e70a
test(api): drop a test whose mutation survives
metaphorics Oct 29, 2026
d898b6b
test(types): drop two assertions whose mutations survive
metaphorics Oct 29, 2026
bb7df47
feat(dictwatch): register and fire scope-namespace watchers
metaphorics Oct 29, 2026
72425a2
feat(excmd): add :pwd, :list, :number, :uptime, and :tabs
metaphorics Oct 29, 2026
acbc643
feat(rpc): deliver `rpcnotify` to the client channel
metaphorics Oct 29, 2026
563155b
docs(report): record the round summary and group measurements
metaphorics Oct 29, 2026
6eb7527
test(dictwatch): violate the watcher contract from seven angles
metaphorics Oct 29, 2026
acab17b
docs(report): record the dict-notifications result after the round
metaphorics Oct 29, 2026
c1cc1ee
feat(excmd): add :recover, :diffsplit, :helptags, :match, and :checkpath
metaphorics Oct 29, 2026
36779d3
feat(dictwatch): notify from remove(), extend(), and filter()
metaphorics Oct 29, 2026
933a033
docs(report): record the builtin producer measurement and the scope d…
metaphorics Oct 29, 2026
a32f365
fix(checkhealth): give the native path a Lua host
metaphorics Oct 29, 2026
6ad2825
docs(report): record the health spec result after the host seam
metaphorics Oct 29, 2026
9e8cf66
feat(dictwatch): record scope mutations from the dictionary builtins
metaphorics Oct 29, 2026
d09809e
docs(report): identify the scope dict identity as the remaining cause
metaphorics Oct 29, 2026
646eecc
fix(scope): give each scope namespace one dictionary identity
metaphorics Oct 29, 2026
fcc6324
docs(report): record the scope identity result and the six remaining …
metaphorics Oct 29, 2026
99b92a0
feat(dictwatch): notify from API variable writes
metaphorics Oct 29, 2026
a95b4e4
docs(report): record the API write route and the shared-registry gap
metaphorics Oct 29, 2026
543ea80
docs(report): record the Miri sanitizer result and its scope
metaphorics Oct 29, 2026
848ad70
feat(pty): drain terminal output without an executor borrow
metaphorics Oct 29, 2026
e791900
feat(dictwatch): complete the watcher notification paths
metaphorics Oct 29, 2026
209621e
docs(report): record the watcher completion result
metaphorics Oct 29, 2026
4f83074
docs(report): record the ex_cmds jump after the watcher completion
metaphorics Oct 29, 2026
81e7e73
feat(dictwatch): record changedtick at command boundaries
metaphorics Oct 29, 2026
d221e9b
docs(report): record the changedtick boundary result
metaphorics Oct 29, 2026
644dba0
fix(dictwatch): keep a mid-round deletion in the current round
metaphorics Oct 29, 2026
9d73630
docs(report): record the mid-round deletion fix at 69 of 70
metaphorics Oct 29, 2026
e85d433
fix(window): let `:close` hide a hideable buffer
metaphorics Oct 29, 2026
55a3810
docs(report): record dict notifications at 70 of 70
metaphorics Oct 29, 2026
5625bfb
feat(directory): model the four directory scopes separately
metaphorics Oct 29, 2026
b550a51
fix(echo): stop the cycle crash and keep `:echon` continuations
metaphorics Oct 29, 2026
bd51416
docs(report): record the cd and echo spec progress
metaphorics Oct 29, 2026
8a99bd9
fix(swapfile): read block zero, and report a live owner as W325
metaphorics Oct 29, 2026
a6ef3c1
docs(report): record what each remaining functional cluster needs
metaphorics Oct 29, 2026
b5edebc
fix(typval): render floats the way `:echo` does
metaphorics Oct 29, 2026
c9cd14d
refactor(dir): let the nvim.dir plugin drive directory buffers
metaphorics Oct 29, 2026
bcb2f1c
docs(report): record the dir_spec cutover, the float fix, and each re…
metaphorics Oct 29, 2026
c62fe91
feat(uv): bind `getuid` and `kill`
metaphorics Oct 29, 2026
0a6f41c
fix(maparg): emit callback dictionaries and the reference buffer flag
metaphorics Oct 29, 2026
ee9e5d6
feat(excmd): honour `:browse` the way the reference does without a GUI
metaphorics Oct 29, 2026
dec1876
docs(report): record dir_spec at 24 of 38 with grouped causes
metaphorics Oct 29, 2026
e81c7bd
fix(lua): keep the pipe descriptor registry compilable off unix
Oct 30, 2026
23754bb
fix(dir): select an entry by exact line, and let a modified unnamed b…
metaphorics Oct 30, 2026
69d2c4f
docs(report): record the activation attempt at 25 of 38
metaphorics Oct 30, 2026
d3a5c16
docs(report): expand the dir_spec failure map to one row per test
metaphorics Oct 30, 2026
1346bf1
fix(defer): fire deferred Funcref and Partial values through the eval…
Oct 30, 2026
d241147
fix(lua): queue empty pipe writes behind pending data
Oct 30, 2026
5aa245f
fix(uv): set pipe endpoint nonblock flags independently
Oct 30, 2026
a305912
fix(registers): bump the mirror version when setreg clears a slot
Oct 30, 2026
53008e5
fix(api): overflow scoped variable writes onto the seed pair at depth…
Oct 30, 2026
91d21fb
fix(buffer): resolve `#` to the window's alternate buffer
metaphorics Oct 30, 2026
86eaa33
docs(report): record the alternate-buffer result and the reverted no-op
metaphorics Oct 30, 2026
00f9a7d
fix(edit): honour `:keepalt` on the buffer switch
metaphorics Oct 30, 2026
ea7b9ce
fix(dir): activate listing entries through a third executor tier
metaphorics Oct 30, 2026
8641687
docs(report): record dir_spec at 30 of 38 and the syntax verdict
metaphorics Oct 30, 2026
51b596e
fix(messages): record a notify message in `:messages`
metaphorics Oct 30, 2026
c48d09a
fix(call): close a `:call` argument list at its own parenthesis
metaphorics Oct 30, 2026
1f3b65b
fix(uv): format fs errors as luv does
metaphorics Oct 30, 2026
8c335c3
docs(report): record dir_spec at 32 of 38 and the untested message ch…
metaphorics Oct 30, 2026
249eae9
fix(edit): unload the abandoned buffer when neither 'hidden' nor 'buf…
metaphorics Oct 30, 2026
fa458ac
fix(mkdir): read the mode through the canonical number converter
metaphorics Oct 30, 2026
d2ba915
fix(printf): keep an unrecognized specifier literally
metaphorics Oct 30, 2026
0b74ade
fix(mapping): consume the normal-mode count when a mapping runs
metaphorics Oct 30, 2026
b7e25ae
feat(normal): bind `CTRL-^` to the alternate file
metaphorics Oct 30, 2026
8792cba
fix(mapping): clear the typed count only for mappings that consume it
metaphorics Oct 30, 2026
deed8f3
fix(call): scan quoted strings with Vimscript quoting rules
metaphorics Oct 30, 2026
690d3ba
test(eval): pin single-quote parsing for a trailing backslash
metaphorics Oct 30, 2026
7e4f854
docs(report): record dir_spec at 35 of 38
metaphorics Oct 30, 2026
8978060
fix(excmd): split a bar after `:unlet`
metaphorics Oct 30, 2026
708dbb7
fix(mapcheck): answer with the function reference of a callback mapping
metaphorics Oct 30, 2026
df4cfdd
docs(report): record dir_spec at 36 of 38
metaphorics Oct 30, 2026
fe1d9bd
refactor(excmd): one command-end scanner handles a top-level comment
metaphorics Oct 30, 2026
d9f1025
test(let): computed-name assignment reaches the scope a later read uses
metaphorics Oct 30, 2026
fd4ccc6
fix(script): keep a script's variables across a nested call or source
metaphorics Oct 30, 2026
d4d8130
feat(builtin): buflisted()
metaphorics Oct 30, 2026
435bd8d
fix(if): strip a trailing comment from the condition
metaphorics Oct 30, 2026
9d79f27
fix(let): do not read `@@=` as the expression register
metaphorics Oct 30, 2026
1a15c66
fix(register): make `@@` name the unnamed register
metaphorics Oct 30, 2026
3992e5d
fix(function): keep a local constant local to its call
metaphorics Oct 30, 2026
8007299
feat(builtin): readdir()
metaphorics Oct 30, 2026
8822141
docs(report): record dir_spec at 37 of 38 and the netrw defect chain
metaphorics Oct 30, 2026
8372abd
fix(buffer): resolve predicates through `find_buffer`
metaphorics Oct 30, 2026
ec23489
fix(uv): name the path in a filesystem error and use libuv's wording
metaphorics Oct 30, 2026
e98691c
fix(buffer): fire `BufHidden` and `BufUnload` when `:edit` abandons a…
metaphorics Oct 30, 2026
126d14e
feat(syntax): `:syntax` records groups, lists them, and loads a buffe…
metaphorics Oct 30, 2026
1f92945
refactor(edit): let the directory plugin own `'filetype'`
metaphorics Oct 30, 2026
156209f
Revert "refactor(edit): let the directory plugin own `'filetype'`"
metaphorics Oct 30, 2026
9515709
docs(report): record dir_spec at 38 of 38 and the reverted filetype c…
metaphorics Oct 30, 2026
4539a66
fix(getcwd): let the scoped builtin answer every form
metaphorics Oct 30, 2026
02da1b0
fix(echo): format a Float with `%g` rules and the reference's special…
metaphorics Oct 30, 2026
cfb8821
feat(echo): render funcrefs, partials, and cycles as the reference does
metaphorics Oct 30, 2026
4671b30
fix(cd): keep directory scope through `:edit!`, context switches, and…
metaphorics Oct 30, 2026
4ca820c
docs(report): record the refreshed functional gate
metaphorics Oct 30, 2026
9b6fa08
fix(echo): spell a Funcref as `function('name')` in a message
metaphorics Oct 30, 2026
ae7d5d3
refactor(echo): one formatter answers `string()` too
metaphorics Oct 30, 2026
39fb0e7
docs(report): record the gate at ae7d5d3 and the two echo blockers
metaphorics Oct 30, 2026
f336445
fix(echo): raise E724 from `string()`, never from `:echo`
metaphorics Oct 30, 2026
2db197c
fix(scope): keep a self-reference across the editor mirror sync
metaphorics Oct 30, 2026
db0647b
fix(script): one anonymous string source per session
metaphorics Oct 30, 2026
e691945
feat(eval): bind a dictionary as self when its member is callable
metaphorics Oct 30, 2026
232b100
docs(report): record the gate at e691945 and the dictionary-order class
metaphorics Oct 30, 2026
1eaf27c
chore(script): drop the allocation trace left from the id investigation
metaphorics Oct 30, 2026
7d0a51c
feat(eval): implement getscriptinfo()
metaphorics Oct 30, 2026
99ae4bc
fix(script): keep `<SNR>` literal inside a double-quoted string
metaphorics Oct 30, 2026
5f0bdce
fix(source): run a sourced file past an error and outside the caller
metaphorics Oct 30, 2026
1e04fc4
fix(eval): report getscriptinfo argument faults as the reference does
metaphorics Oct 30, 2026
6834e8b
fix(buffer): `bufname()` trims a name under the current directory
metaphorics Oct 30, 2026
68a578d
feat(lua): provide the UTF helpers the runtime module calls
metaphorics Oct 30, 2026
b5eeb80
fix(shada): stream the entry framing instead of reading the whole file
metaphorics Oct 30, 2026
439f64c
fix(include): report E484 when an include cannot be read
metaphorics Oct 30, 2026
e323045
fix(loop): a failed dispatch keeps the queued work
metaphorics Oct 30, 2026
55f7817
fix(lua): keep a truncated sequence's width and drop the casts
metaphorics Oct 30, 2026
0d31288
fix(lua): take the reference's UTF-8 lead table and the real maxint
metaphorics Oct 30, 2026
237588b
test(loop): name the requeue test for the failure it drives
metaphorics Oct 30, 2026
6ecff11
feat(statusline): render each window's 'statusline' on screen
metaphorics Oct 30, 2026
2db8d93
feat(statusline): honour 'laststatus' and refuse re-entrant rendering
metaphorics Oct 30, 2026
d20a9ed
fix(uv): close the completion queue under its own lock
metaphorics Oct 31, 2026
22cc8b6
fix(lua): mpack parity for nonfinite numbers and session options
metaphorics Oct 31, 2026
3fa954e
feat(statusline): one global row for 'laststatus' 3
metaphorics Oct 31, 2026
30e80ce
fix(window): report and set window heights in text rows
metaphorics Oct 31, 2026
173672f
fix(api): preserve block width and binary rows in loaded contexts
metaphorics Oct 31, 2026
cbb7313
fix(lua): mpack numbers pick integer and float32 tokens
metaphorics Oct 31, 2026
4da391a
feat(dict): store dictionaries in the reference's hash table
metaphorics Oct 31, 2026
047ad0c
fix(treesitter): apply ancestor and parent predicates in emit
metaphorics Oct 31, 2026
6079a0c
fix(lua): strip the runtime prefix from exec_file errors
metaphorics Oct 31, 2026
9a408ec
fix(script): honour $NVIM_APPNAME in runtime and stdpath
metaphorics Oct 31, 2026
59a464e
fix(loop): keep sibling timers when one callback panics
metaphorics Oct 31, 2026
0df6567
feat(api): speak the reference's ShaDa context wire format
metaphorics Oct 31, 2026
d4127d3
feat(eval): getjumplist returns the reference's shape and window rules
metaphorics Oct 31, 2026
110c6a2
fix(api): context regs and jumps encode like the reference's ShaDa
metaphorics Oct 31, 2026
e27e85c
fix(editor): record jumps like the reference and reset the view on sw…
metaphorics Oct 31, 2026
ec17cf9
fix(eval): expand resolves alternate and numbered buffer names
metaphorics Oct 31, 2026
c988868
fix(eval): apply filename modifiers before the unnamed-source rule
metaphorics Oct 31, 2026
0785b4a
feat(options): report where an option was last set
metaphorics Oct 31, 2026
8adf966
refactor(editor): export OptionLastSet for API provenance reads
metaphorics Oct 31, 2026
c569356
fix(api): keep the script context for internal option writes
metaphorics Oct 31, 2026
45613a8
fix(excmd): :normal ends at its own newline
metaphorics Oct 31, 2026
c6ad1ba
feat(eval): strftime and uv.available_parallelism
metaphorics Oct 31, 2026
4e5a90b
fix(system): exact child environments and expanded option defaults
Oct 31, 2026
8fa054a
fix(mode): visual selection tracks the moved corner
Oct 31, 2026
1606dd0
fix(mapping): :map listings print special keys and reference columns
Oct 31, 2026
b24dcfe
feat(session): :mksession writes and restores a real session
Oct 31, 2026
e142450
fix(session): tab and buffer directories restore through a session
Oct 31, 2026
d2e5591
feat(messages): mapping listings carry per-piece highlights
Oct 31, 2026
184f8d1
feat(pack): vim.pack runs on real editor seams
Oct 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/terminal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ jobs:
- run: rustup toolchain install 1.98.0 --profile minimal
- run: cargo test --locked -p ox-tui --lib
- run: cargo test --locked -p ox-sys --lib
- name: Check the whole workspace for the host MSVC target
run: cargo check --locked --workspace --all-targets
- run: cargo test --locked -p ox-editor --test platform_startup
- run: rustup target add i686-pc-windows-msvc
- name: Preserve libuv uname behavior under WOW64
run: cargo test --locked -p ox-sys --lib --target i686-pc-windows-msvc
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -142,3 +142,4 @@ tmtags
# copies the ABI-compatible reference build artifacts here so the
# `parser/<lang>.*` runtime lookup resolves them).
runtime/parser/
target-*/
1,541 changes: 1,541 additions & 0 deletions .outline/sdd/reports/2026-10-28-completion-campaign.md

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 0 additions & 13 deletions crates/ox-api/src/api_function_names.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1849,19 +1849,6 @@ pub(crate) const API_FUNCTIONS: &[FunctionMetadata] = &[
("follow", TypeRef::Boolean, false),
],
},
FunctionMetadata {
name: "nvim_mcursor",
since: 15,
deprecated_since: None,
method: false,
fast: false,
textlock: false,
returns: TypeRef::Integer,
params: &[
("buf", TypeRef::Buffer, false),
("pos", TypeRef::Named("ArrayOf(Integer, 2)"), false),
],
},
FunctionMetadata {
name: "nvim_get_color_by_name",
since: 1,
Expand Down
61 changes: 58 additions & 3 deletions crates/ox-api/src/autocmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,61 @@ pub(crate) fn fire_filetype(
result
}

/// Plans and executes `Event::OptionSet` for one committed option change
/// (`apply_optionset_autocmd_now`, option.c:2099-2134).
///
/// The option's full name is the match text. The six `v:option_*` values are
/// published before the plan runs and put back afterwards, whatever the
/// callbacks do, so a nested dispatch restores its own values on the way out
/// and never leaks them into the outer dispatch.
pub(crate) fn fire_option_set(
session: &ApiSession,
name: &str,
scope: ox_editor::OptionSetScope,
old: &Object,
old_local: Option<&Object>,
old_global: Option<&Object>,
new: &Object,
) -> Result<(), ApiError> {
// Upstream skips the event while startup runs (`starting`,
// option.c:2147) and while a dispatch is already in flight
// (`*get_vim_var_str(VV_OPTION_TYPE) != NUL`, option.c:2102). Startup in
// this port has finished exactly when `v:vim_did_enter` is 1, which
// upstream sets at the same point it clears `starting`.
let started = session.with_editor(|editor| {
matches!(
editor.vvars().get(&OxStr::from("vim_did_enter")),
Some(Object::Integer(1))
)
});
let firing = session.with_state(|state| state.option_set_in_flight);
if !started || firing {
return Ok(());
Comment on lines +288 to +290

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Share the OptionSet recursion guard with the Ex setter

When an OptionSet handler triggered by :set changes an option through vim.api.nvim_set_option_value(), this guard allows another OptionSet dispatch. The Ex helper fire_optionset_autocmd() in excmd_exec.rs guards through the published v:option_type and never sets session.option_set_in_flight, so that flag remains false throughout the outer handler; this API path then plans the nested event with nested: true. Consequently, Lua plugins receive callbacks that the documented non-recursive event must suppress. Check the shared published guard, or use one guard across both setter paths, to preserve callback ordering.

AGENTS.md reference: AGENTS.md:L5-L5

Useful? React with 👍 / 👎.

}
let saved = session.with_editor_mut(|editor| {
editor.publish_option_set(scope, old, old_local, old_global, new)
});
session.with_state_mut(|state| state.option_set_in_flight = true);
let match_name = OxStr::from(name);
let buffer = session.with_editor(|editor| editor.current_buffer());
let plan = session.with_editor_mut(|editor| {
editor.autocmds_mut().plan(
Event::OptionSet,
AutocmdContext {
buffer,
file_name: None,
match_name: Some(match_name.as_bytes()),
nested: true,
data: None,
},
)
});
let result = execute_firing_plan(session, plan);
session.with_state_mut(|state| state.option_set_in_flight = false);
session.with_editor_mut(|editor| editor.restore_option_set(saved));
result
}

fn text(value: &OxStr, what: &str) -> Result<String, ApiError> {
String::from_utf8(value.0.clone())
.map_err(|_| ApiError::validation(format!("{what} must be valid UTF-8")))
Expand Down Expand Up @@ -525,7 +580,7 @@ fn autocmd_kind(opts: &Dict) -> Result<AutocmdKind, ApiError> {
let callback = opts.get(&OxStr::from("callback"));
match (command, callback) {
(Some(Object::String(command)), None) => {
Ok(AutocmdKind::ExString(text(command, "command")?))
Ok(AutocmdKind::ExString { source: text(command, "command")?, script: None })
}
(None, Some(Object::LuaRef(callback))) => Ok(AutocmdKind::LuaCallback(
u64::try_from(*callback).map_err(|_| ApiError::validation("Invalid 'callback'"))?,
Expand Down Expand Up @@ -826,7 +881,7 @@ fn autocmd_definition(item: &AutocmdDefinition) -> Dict {
entries.push((
OxStr::from("command"),
match &item.kind {
AutocmdKind::ExString(command) => Object::String(OxStr::from(command.as_str())),
AutocmdKind::ExString { source: command, .. } => Object::String(OxStr::from(command.as_str())),
AutocmdKind::VimscriptFunction(_) | AutocmdKind::LuaCallback(_) => {
Object::String(OxStr::from(""))
}
Expand All @@ -845,7 +900,7 @@ fn autocmd_definition(item: &AutocmdDefinition) -> Dict {
Object::LuaRef(i32::try_from(*callback).unwrap_or(i32::MAX)),
));
}
AutocmdKind::ExString(_) => {}
AutocmdKind::ExString { .. } => {}
}
entries.push((
OxStr::from("pattern"),
Expand Down
30 changes: 19 additions & 11 deletions crates/ox-api/src/buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -867,6 +867,11 @@ pub fn nvim_buf_set_var(
value: Object,
) -> Result<(), ApiError> {
let buffer = resolve_buffer(session, buffer)?;
if crate::global::host_present(session) {
return crate::runtime::with_command_executor(session, |session, executor| {
executor.set_buffer_var(session, buffer, name, value)
});
}
session.with_editor_mut(|editor| {
if name.as_bytes() == b"changedtick" {
return Err(ApiError::validation(format!(
Expand Down Expand Up @@ -899,6 +904,11 @@ pub fn nvim_buf_del_var(
name: OxStr,
) -> Result<(), ApiError> {
let buffer = resolve_buffer(session, buffer)?;
if crate::global::host_present(session) {
return crate::runtime::with_command_executor(session, |session, executor| {
executor.del_buffer_var(session, buffer, name)
});
}
session.with_editor_mut(|editor| {
if name.as_bytes() == b"changedtick" {
return Err(ApiError::validation(format!(
Expand Down Expand Up @@ -1518,7 +1528,6 @@ mod tests {
use std::cell::RefCell;
use std::rc::Rc;


use super::*;

#[test]
Expand All @@ -1527,16 +1536,15 @@ mod tests {
let buffer = editor.borrow_mut().create_buffer(true).unwrap();
let session = ApiSession::new(editor);

assert!(nvim_buf_attach(
&session,
buffer,
false,
Dict(vec![(
OxStr::from("on_bytes"),
Object::LuaRef(41),
)]),
)
.unwrap());
assert!(
nvim_buf_attach(
&session,
buffer,
false,
Dict(vec![(OxStr::from("on_bytes"), Object::LuaRef(41),)]),
)
.unwrap()
);
assert!(nvim_buf_detach(&session, buffer).unwrap());

session.with_editor_mut(|editor| {
Expand Down
Loading
Loading