<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rneovim.git/runtime/lua/vim/_core, branch extregs</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(ui2): use global value of 'fillchars' #42397</title>
<updated>2026-10-16T12:53:34+00:00</updated>
<author>
<name>Evgeni Chasnovski</name>
<email>evgeni.chasnovski@gmail.com</email>
</author>
<published>2026-10-16T12:53:34+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=0ffda0be9e613833d333aa23065cc1af7f8f2293'/>
<id>0ffda0be9e613833d333aa23065cc1af7f8f2293</id>
<content type='text'>
Problem: Custom ui2 window tracks 'fillchars' option to adjust to the
  change of `msgsep` flag. However, 'fillchars' is `:h global-local`
  window option. If it is set locally to the window, ui2 reacts to its
  `msgsep` value and keeps using it afterwards even in other windows.

Solution: Use and react to only global value of 'fillchars'.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem: Custom ui2 window tracks 'fillchars' option to adjust to the
  change of `msgsep` flag. However, 'fillchars' is `:h global-local`
  window option. If it is set locally to the window, ui2 reacts to its
  `msgsep` value and keeps using it afterwards even in other windows.

Solution: Use and react to only global value of 'fillchars'.</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(multicursor): ]C [C use previous cursors if mc inactive #42267</title>
<updated>2026-10-13T14:58:50+00:00</updated>
<author>
<name>IOCRYPOSTO</name>
<email>aadityaiitian1515@gmail.com</email>
</author>
<published>2026-10-13T14:58:50+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=544d8cd7e6289ca98e9104b55cdb963eeda51755'/>
<id>544d8cd7e6289ca98e9104b55cdb963eeda51755</id>
<content type='text'>
Problem:
After clearing cursors, "]C" "[C" do nothing, although the previous
cursor positions ("gQ") may still be useful as marks.

Solution:
If multicursor is not active, "]C" "[C" iterate the
"nvim.multicursor.last" extmarks. They also work as an operator motion
("d]C"), since there is no cascade.

AI-assisted</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
After clearing cursors, "]C" "[C" do nothing, although the previous
cursor positions ("gQ") may still be useful as marks.

Solution:
If multicursor is not active, "]C" "[C" iterate the
"nvim.multicursor.last" extmarks. They also work as an operator motion
("d]C"), since there is no cascade.

AI-assisted</pre>
</div>
</content>
</entry>
<entry>
<title>feat(api): nvim_chan_set()</title>
<updated>2026-10-09T11:16:00+00:00</updated>
<author>
<name>Justin M. Keyes</name>
<email>justinkz@gmail.com</email>
</author>
<published>2026-10-09T00:58:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=d2d8188851430da8bfe8b489ae22f34de5942fff'/>
<id>d2d8188851430da8bfe8b489ae22f34de5942fff</id>
<content type='text'>
Problem:
Only the stdio channel can "own" a server (self-exit on close). After
:restart the TUI reconnects over a socket, so the restarted server does
not have "self-exit" behavior when the channel closes (e.g. by UI
disconnect, host-terminal close, etc.), which leaves a dangling server.

Solution:
- Introduce `nvim_chan_set`. (`nvim_set_client_info` doesn't fit:
  exposing it to Lua would require a `channel` param, which is not
  backwards-compatible, plus it's awkward because it doesn't merge info.)
- Broadcast per-channel properties in the "restart" UI event as an
  opaque dict (a potentially useful pattern for other UI-events in the
  future).
  - UIs are expected to restore the channel properties on restart.
- `nvim_get_chan_info()` reports "detach".
- Remove `nvim__chan_set_detach()`.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
Only the stdio channel can "own" a server (self-exit on close). After
:restart the TUI reconnects over a socket, so the restarted server does
not have "self-exit" behavior when the channel closes (e.g. by UI
disconnect, host-terminal close, etc.), which leaves a dangling server.

Solution:
- Introduce `nvim_chan_set`. (`nvim_set_client_info` doesn't fit:
  exposing it to Lua would require a `channel` param, which is not
  backwards-compatible, plus it's awkward because it doesn't merge info.)
- Broadcast per-channel properties in the "restart" UI event as an
  opaque dict (a potentially useful pattern for other UI-events in the
  future).
  - UIs are expected to restore the channel properties on restart.
- `nvim_get_chan_info()` reports "detach".
- Remove `nvim__chan_set_detach()`.
</pre>
</div>
</content>
</entry>
<entry>
<title>fix(lua): vim._with({ buf, win }) assertion failure #42244</title>
<updated>2026-10-05T15:57:32+00:00</updated>
<author>
<name>Justin M. Keyes</name>
<email>justinkz@gmail.com</email>
</author>
<published>2026-10-05T15:57:32+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=7a8b7c04778d334f60766a0c83933b74e4e237b3'/>
<id>7a8b7c04778d334f60766a0c83933b74e4e237b3</id>
<content type='text'>
Problem:
`vim._with({ buf = 0, win = 0 }, f)` fails an assert in ctx_switch().
vim._with() allows `buf` with `win` when `win` shows `buf`, but
nlua_with() passes both, and ctx_switch() takes only one target.

Solution:
Ignore `buf` if `win` is given; the window implies its buffer.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
`vim._with({ buf = 0, win = 0 }, f)` fails an assert in ctx_switch().
vim._with() allows `buf` with `win` when `win` shows `buf`, but
nlua_with() passes both, and ctx_switch() takes only one target.

Solution:
Ignore `buf` if `win` is given; the window implies its buffer.</pre>
</div>
</content>
</entry>
<entry>
<title>fix(search): correct patlen calculation for semicolon search (#42150)</title>
<updated>2026-09-30T23:50:48+00:00</updated>
<author>
<name>Qiming zhao</name>
<email>chemzqm@gmail.com</email>
</author>
<published>2026-09-30T23:50:48+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=d7d11f86227522a959a44986820f2192fafb87ee'/>
<id>d7d11f86227522a959a44986820f2192fafb87ee</id>
<content type='text'>
Problem:
When repeating search using a semicolon (e.g. `/pat1/;/pat2`), `pat`
advances past both the semicolon and the delimiter ('/' or '?'),
consuming 2 characters, but `patlen` was only decremented by 1.
Consequently, `patlen` in the subsequent search is 1 byte too long and
includes the trailing NUL byte, corrupting `msgbuf` and causing ui2's
search_count handler to fail with 'attempt to concatenate a nil value'.

Solution:
Decrement `patlen` by 2 when skipping ';' and delimiter. Also ensure
ui2 safely guards search_count messages when extracting the search stat.

Fixes #41929

AI-assisted</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
When repeating search using a semicolon (e.g. `/pat1/;/pat2`), `pat`
advances past both the semicolon and the delimiter ('/' or '?'),
consuming 2 characters, but `patlen` was only decremented by 1.
Consequently, `patlen` in the subsequent search is 1 byte too long and
includes the trailing NUL byte, corrupting `msgbuf` and causing ui2's
search_count handler to fail with 'attempt to concatenate a nil value'.

Solution:
Decrement `patlen` by 2 when skipping ';' and delimiter. Also ensure
ui2 safely guards search_count messages when extracting the search stat.

Fixes #41929

AI-assisted</pre>
</div>
</content>
</entry>
<entry>
<title>ci(lua): enable annotation and style checks</title>
<updated>2026-09-30T16:56:01+00:00</updated>
<author>
<name>Lewis Russell</name>
<email>lewis6991@gmail.com</email>
</author>
<published>2026-09-30T13:41:16+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=364b7a3402634251a766c4a3a81117c296839e12'/>
<id>364b7a3402634251a766c4a3a81117c296839e12</id>
<content type='text'>
Problem:

- annotation-usage-error and code-style-check are disabled.
- vim.inspect relies on a dummy self-assignment for docgen, and its help
  omits parameter and option details.
- LuaLS fallback types obscure iterator inference.
- Docgen hardcodes public function names and appends separately sorted
  files, leaving shared helpers under the inspector heading.

Solution:

- Enable annotation-usage-error and code-style-check, and fix misplaced
  annotations.
- Document vim.inspect's callable module directly, removing the dummy
  assignment. Describe its parameters, option defaults and process
  callback.
- Remove LuaLS iterator fallbacks, correct iterator signatures and check
  values that the improved inference identifies as optional.
- Parse callable modules, require bindings and parent module references.
  Derive public names and inherited function docs from these links,
  including missing help for vim.async.semaphore() and vim.version().
- Export vim.lsp.tagfunc directly with lazy loading and document its
  implementation instead of maintaining a wrapper.
- Group files in section_order, replacing append_only and merge_files.
  Merge declarations before sorting each section, placing shared helpers
  in the main vim section and keeping vim.inspect in alphabetical order.
- Add basic parser coverage for callable modules and module links.

AI-assisted
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:

- annotation-usage-error and code-style-check are disabled.
- vim.inspect relies on a dummy self-assignment for docgen, and its help
  omits parameter and option details.
- LuaLS fallback types obscure iterator inference.
- Docgen hardcodes public function names and appends separately sorted
  files, leaving shared helpers under the inspector heading.

Solution:

- Enable annotation-usage-error and code-style-check, and fix misplaced
  annotations.
- Document vim.inspect's callable module directly, removing the dummy
  assignment. Describe its parameters, option defaults and process
  callback.
- Remove LuaLS iterator fallbacks, correct iterator signatures and check
  values that the improved inference identifies as optional.
- Parse callable modules, require bindings and parent module references.
  Derive public names and inherited function docs from these links,
  including missing help for vim.async.semaphore() and vim.version().
- Export vim.lsp.tagfunc directly with lazy loading and document its
  implementation instead of maintaining a wrapper.
- Group files in section_order, replacing append_only and merge_files.
  Merge declarations before sorting each section, placing shared helpers
  in the main vim section and keeping vim.inspect in alphabetical order.
- Add basic parser coverage for callable modules and module links.

AI-assisted
</pre>
</div>
</content>
</entry>
<entry>
<title>refactor(multicursor)!: drop nvim_mcursor #42156</title>
<updated>2026-09-30T11:11:40+00:00</updated>
<author>
<name>Justin M. Keyes</name>
<email>justinkz@gmail.com</email>
</author>
<published>2026-09-30T11:11:40+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=a8062120ad8c144d5da853a611dc9d51708f2d83'/>
<id>a8062120ad8c144d5da853a611dc9d51708f2d83</id>
<content type='text'>
Problem:
`nvim_mcursor` is not fully baked, and not strongly motivated,
currently. The main programmatic interface for cursors is the
"nvim.multicursor" extmarks namespace.

Solution:
Drop `nvim_mcursor`. Add an internal hook so that multicursor can react
when extmarks are added to the "nvim.multicursor" namespace.

TODO:
If extmarks/namespaces are clumsy to work with, we should _fix that_
rather than adding wrappers.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
`nvim_mcursor` is not fully baked, and not strongly motivated,
currently. The main programmatic interface for cursors is the
"nvim.multicursor" extmarks namespace.

Solution:
Drop `nvim_mcursor`. Add an internal hook so that multicursor can react
when extmarks are added to the "nvim.multicursor" namespace.

TODO:
If extmarks/namespaces are clumsy to work with, we should _fix that_
rather than adding wrappers.</pre>
</div>
</content>
</entry>
<entry>
<title>Merge pull request #42134 from lewis6991/emmylua</title>
<updated>2026-09-30T08:29:34+00:00</updated>
<author>
<name>Lewis Russell</name>
<email>lewis6991@gmail.com</email>
</author>
<published>2026-09-30T08:29:34+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=eb601cda5f2b20536b56f3d55ffa0d0ab90b8c26'/>
<id>eb601cda5f2b20536b56f3d55ffa0d0ab90b8c26</id>
<content type='text'>
fix(lua): enable param-type-mismatch diagnostic</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
fix(lua): enable param-type-mismatch diagnostic</pre>
</div>
</content>
</entry>
<entry>
<title>feat(multicursor): zq operator; cursor-local marks #42148</title>
<updated>2026-09-29T23:51:43+00:00</updated>
<author>
<name>Justin M. Keyes</name>
<email>justinkz@gmail.com</email>
</author>
<published>2026-09-29T23:51:43+00:00</published>
<link rel='alternate' type='text/html' href='http://git.josher.dev/rneovim.git/commit/?id=ac9ddec6b855a54193899f95da2d94d8224b31af'/>
<id>ac9ddec6b855a54193899f95da2d94d8224b31af</id>
<content type='text'>
Problem:
- `[count]Q` and `{Visual}Q` are implemented as ad hoc utils, because
  `Q` is not an "operator".
- `Q` always "toggles", it is not "idempotent".
- Various *cursor-relative* marks (`'.`, `'[`) are not saved/restored
  per-cursor, so they don't work during cascade.
- Insert cascade clobbers the primary's `'^` and changelist.

Solution:
- Introduce the `zq{motion}` operator, which places cursors at every
  reachable `{motion}`.
  - `{Visual}Q` is now an alias to `{Visual}zqj`.
- Introduce `1Q` and `2Q` for idempotent cursor placement.
  - Drop `[count]Q`, it's redundant with `zqgn`.
- Classify cursor-relative marks as `type=motion` instead of
  `type=jump`. Save/restore per-cursor during cascade.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
- `[count]Q` and `{Visual}Q` are implemented as ad hoc utils, because
  `Q` is not an "operator".
- `Q` always "toggles", it is not "idempotent".
- Various *cursor-relative* marks (`'.`, `'[`) are not saved/restored
  per-cursor, so they don't work during cascade.
- Insert cascade clobbers the primary's `'^` and changelist.

Solution:
- Introduce the `zq{motion}` operator, which places cursors at every
  reachable `{motion}`.
  - `{Visual}Q` is now an alias to `{Visual}zqj`.
- Introduce `1Q` and `2Q` for idempotent cursor placement.
  - Drop `[count]Q`, it's redundant with `zqgn`.
- Classify cursor-relative marks as `type=motion` instead of
  `type=jump`. Save/restore per-cursor during cascade.</pre>
</div>
</content>
</entry>
</feed>
