<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rneovim.git/test/functional/lua, branch master</title>
<subtitle>Neovim fork with Rahm's personal hacks.</subtitle>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/'/>
<entry>
<title>fix(snippet): preserve the full TM_DIRECTORY path (#42408)</title>
<updated>2026-10-16T22:18:03+00:00</updated>
<author>
<name>Volodymyr Chernetskyi</name>
<email>volodymyr_chernetskyi@goodyear.com</email>
</author>
<published>2026-10-16T22:18:03+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=23c4872afa1291632c2b29fa67b5614b0fbe3791'/>
<id>23c4872afa1291632c2b29fa67b5614b0fbe3791</id>
<content type='text'>
Problem:
TM_DIRECTORY expands to the directory's basename, losing its parent path.

Solution:
Remove the tail modifier when expanding the current file's directory.
Extend the existing known-variable test to check the full directory path.

AI-assisted</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
TM_DIRECTORY expands to the directory's basename, losing its parent path.

Solution:
Remove the tail modifier when expanding the current file's directory.
Extend the existing known-variable test to check the full directory path.

AI-assisted</pre>
</div>
</content>
</entry>
<entry>
<title>refactor(watch): extract watchdirs into a class</title>
<updated>2026-10-16T18:29:39+00:00</updated>
<author>
<name>Lewis Russell</name>
<email>lewis6991@gmail.com</email>
</author>
<published>2026-10-06T11:10:52+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=d2c8b216198968ae810e54716296065f1945b0ca'/>
<id>d2c8b216198968ae810e54716296065f1945b0ca</id>
<content type='text'>
Problem: watchdirs() keeps its state in large nested callbacks in
_watch.lua, which makes its directory tracking logic harder to change.

Solution: Move the backend into its own module and store its state in a
WatchDirs instance. Split setup, event handling and cleanup into
methods. Extend the existing test to cover cancellation while a
directory stat is pending.

AI-assisted
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem: watchdirs() keeps its state in large nested callbacks in
_watch.lua, which makes its directory tracking logic harder to change.

Solution: Move the backend into its own module and store its state in a
WatchDirs instance. Split setup, event handling and cleanup into
methods. Extend the existing test to cover cancellation while a
directory stat is pending.

AI-assisted
</pre>
</div>
</content>
</entry>
<entry>
<title>fix(diagnostic): use logical positions for counted jumps #42394</title>
<updated>2026-10-16T15:16:20+00:00</updated>
<author>
<name>Volodymyr Chernetskyi</name>
<email>volodymyr_chernetskyi@goodyear.com</email>
</author>
<published>2026-10-16T15:16:20+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=4bbc08553f035911e591913f4253163c4e5c0985'/>
<id>4bbc08553f035911e591913f4253163c4e5c0985</id>
<content type='text'>
Problem:
After edits move diagnostic ranges, counted jumps resume searching from
their original positions. This can revisit the same diagnostic and hang
the default first/last diagnostic mappings.

Solution:
Advance the search origin using the diagnostic's current logical position.
Test forward and backward counted jumps after inserting or deleting a
line, including jumps to the last or first diagnostic without wrapping.

AI-assisted</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
After edits move diagnostic ranges, counted jumps resume searching from
their original positions. This can revisit the same diagnostic and hang
the default first/last diagnostic mappings.

Solution:
Advance the search origin using the diagnostic's current logical position.
Test forward and backward counted jumps after inserting or deleting a
line, including jumps to the last or first diagnostic without wrapping.

AI-assisted</pre>
</div>
</content>
</entry>
<entry>
<title>feat(inspector): support ranges in vim.inspect_pos</title>
<updated>2026-10-16T10:35:15+00:00</updated>
<author>
<name>Lewis Russell</name>
<email>lewis6991@gmail.com</email>
</author>
<published>2026-09-28T08:39:32+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=9244da12e400ec0291450a5e9400d995e7a29b83'/>
<id>9244da12e400ec0291450a5e9400d995e7a29b83</id>
<content type='text'>
Problem: Highlight inspection is limited to a single position, and its
result types do not document the fields shared by different highlight
sources.

Solution: Accept end_row/end_col in vim.inspect_pos to inspect a range.
Keep range ends exclusive and retain the existing single-position
behavior.

Support Ex line ranges in :Inspect, including Visual selections.
Document named result types, expose shared highlight fields, and keep
the existing extmark details and buffer field for compatibility.

AI-assisted
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem: Highlight inspection is limited to a single position, and its
result types do not document the fields shared by different highlight
sources.

Solution: Accept end_row/end_col in vim.inspect_pos to inspect a range.
Keep range ends exclusive and retain the existing single-position
behavior.

Support Ex line ranges in :Inspect, including Visual selections.
Document named result types, expose shared highlight fields, and keep
the existing extmark details and buffer field for compatibility.

AI-assisted
</pre>
</div>
</content>
</entry>
<entry>
<title>feat(diagnostic): add source option to virtual_lines handler (#42371)</title>
<updated>2026-10-15T17:09:59+00:00</updated>
<author>
<name>Aradhya Jain</name>
<email>aradhyaj736@gmail.com</email>
</author>
<published>2026-10-15T17:09:59+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=8f5f17f415ea382a97f4cc04f89873cadf5c244b'/>
<id>8f5f17f415ea382a97f4cc04f89873cadf5c244b</id>
<content type='text'>
vim.diagnostic.Opts.VirtualText has a `source` option to prefix
diagnostic messages with their source (`'if_many'` or always), but the
newer virtual_lines handler never got the same option, even though the
shared helpers it needs (diagnostic_shared.prefix_source/count_sources)
are already render-target-agnostic and used by virtual_text as-is.

Add the same `source` field to vim.diagnostic.Opts.VirtualLines and
apply it in the virtual_lines handler right after message formatting,
mirroring virtual_text's own ordering (format first, then prefix the
source onto the already-formatted message).</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
vim.diagnostic.Opts.VirtualText has a `source` option to prefix
diagnostic messages with their source (`'if_many'` or always), but the
newer virtual_lines handler never got the same option, even though the
shared helpers it needs (diagnostic_shared.prefix_source/count_sources)
are already render-target-agnostic and used by virtual_text as-is.

Add the same `source` field to vim.diagnostic.Opts.VirtualLines and
apply it in the virtual_lines handler right after message formatting,
mirroring virtual_text's own ordering (format first, then prefix the
source onto the already-formatted message).</pre>
</div>
</content>
</entry>
<entry>
<title>fix(api): nvim_buf_call() from expression for window in non-current tabpage #42352</title>
<updated>2026-10-14T15:43:58+00:00</updated>
<author>
<name>Justin M. Keyes</name>
<email>justinkz@gmail.com</email>
</author>
<published>2026-10-14T15:43:58+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=c4452903e37bce5bc80d2b582d8ba54fa1edf89b'/>
<id>c4452903e37bce5bc80d2b582d8ba54fa1edf89b</id>
<content type='text'>
Problem:
- nvim_buf_call() aborts (assert) when called from an expression evaluated
  for a window in another tabpage ('foldexpr', 'statusline'), because
  `curwin` is not in `curtab`.
- After it returns, `curwin` is wrong if it switched windows.
- `vim._with{win=…, keepcwd=true}` does not undo `:lcd` if `win` is in
  another tabpage.

Solution:
- Allow `curwin` outside `curtab`, and restore if it was outside
  `curtab` at `ctx_switch()`.
- Find the target window in any tabpage when restoring its dirs.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
- nvim_buf_call() aborts (assert) when called from an expression evaluated
  for a window in another tabpage ('foldexpr', 'statusline'), because
  `curwin` is not in `curtab`.
- After it returns, `curwin` is wrong if it switched windows.
- `vim._with{win=…, keepcwd=true}` does not undo `:lcd` if `win` is in
  another tabpage.

Solution:
- Allow `curwin` outside `curtab`, and restore if it was outside
  `curtab` at `ctx_switch()`.
- Find the target window in any tabpage when restoring its dirs.</pre>
</div>
</content>
</entry>
<entry>
<title>fix(api): nvim_set_option_value() "remove" ignores non-adjacent items #42351</title>
<updated>2026-10-14T14:47:30+00:00</updated>
<author>
<name>Justin M. Keyes</name>
<email>justinkz@gmail.com</email>
</author>
<published>2026-10-14T14:47:30+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=613988b5aa6ef3cc465135838b163849e3b386cc'/>
<id>613988b5aa6ef3cc465135838b163849e3b386cc</id>
<content type='text'>
Problem:
`nvim_set_option_value('fo', {'c','r','o'}, {operation='remove'})` does
nothing on "jcqrol": the items are joined into one `:set-=` value, which
only matches a contiguous substring. Removing map keys, e.g. {'eol','space'}
from 'listchars', never matches. `vim.opt:remove{…}` inherits this.

(Regression from f34ee3da80e8; 429338e74bf4 fixed the case where the
flags are adjacent and in order.)

Solution:
Remove each item separately.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
`nvim_set_option_value('fo', {'c','r','o'}, {operation='remove'})` does
nothing on "jcqrol": the items are joined into one `:set-=` value, which
only matches a contiguous substring. Removing map keys, e.g. {'eol','space'}
from 'listchars', never matches. `vim.opt:remove{…}` inherits this.

(Regression from f34ee3da80e8; 429338e74bf4 fixed the case where the
flags are adjacent and in order.)

Solution:
Remove each item separately.</pre>
</div>
</content>
</entry>
<entry>
<title>fix(diagnostic): "Failed to delete autocmd" after noautocmd bwipeout #42303</title>
<updated>2026-10-12T09:44:45+00:00</updated>
<author>
<name>Justin M. Keyes</name>
<email>justinkz@gmail.com</email>
</author>
<published>2026-10-12T09:44:45+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=0f17fab61970cb453879a8f3cf7bc22c94e2e51a'/>
<id>0f17fab61970cb453879a8f3cf7bc22c94e2e51a</id>
<content type='text'>
Problem:
Handlers defer `show()` on unloaded buffers with a buffer-local BufRead
autocmd whose id is stored per-namespace:
- `noautocmd bwipeout` deletes the autocmd, so the next show/hide fails.
- Showing another buffer in the same namespace cancels the pending show.

Solution:
Handlers skip unloaded buffers. The existing global BufRead autocmd
shows cached diagnostics when the buffer loads.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
Handlers defer `show()` on unloaded buffers with a buffer-local BufRead
autocmd whose id is stored per-namespace:
- `noautocmd bwipeout` deletes the autocmd, so the next show/hide fails.
- Showing another buffer in the same namespace cancels the pending show.

Solution:
Handlers skip unloaded buffers. The existing global BufRead autocmd
shows cached diagnostics when the buffer loads.</pre>
</div>
</content>
</entry>
<entry>
<title>Merge pull request #42198 from lewis6991/watch-pruning</title>
<updated>2026-10-06T09:22:44+00:00</updated>
<author>
<name>Lewis Russell</name>
<email>lewis6991@gmail.com</email>
</author>
<published>2026-10-06T09:22:44+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=b03d8f1788185afcd396fe5fe45a72850079b12b'/>
<id>b03d8f1788185afcd396fe5fe45a72850079b12b</id>
<content type='text'>
perf(watch): skip directories outside include glob prefixes</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
perf(watch): skip directories outside include glob prefixes</pre>
</div>
</content>
</entry>
<entry>
<title>fix(vim.fs): find{follow=true} skips symlink targets of the given `type` #42246</title>
<updated>2026-10-05T16:53:44+00:00</updated>
<author>
<name>Justin M. Keyes</name>
<email>justinkz@gmail.com</email>
</author>
<published>2026-10-05T16:53:44+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=cb075627fe76589f68ea5c0ebf99ca89d6ab7b5b'/>
<id>cb075627fe76589f68ea5c0ebf99ca89d6ab7b5b</id>
<content type='text'>
Problem:
`vim.fs.find()` checks `type` against the symlink itself, so
`{ type='file', follow=true }` skips symlinked files (e.g. `:helptags`).

Solution:
With `follow=true`, a symlink has the type of its target. Thus
`type='link'` only matches broken symlinks (like `find -L -type l`).</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
`vim.fs.find()` checks `type` against the symlink itself, so
`{ type='file', follow=true }` skips symlinked files (e.g. `:helptags`).

Solution:
With `follow=true`, a symlink has the type of its target. Thus
`type='link'` only matches broken symlinks (like `find -L -type l`).</pre>
</div>
</content>
</entry>
</feed>
