<feed xmlns='http://www.w3.org/2005/Atom'>
<title>neovim/test/functional/lua/vim_spec.lua, branch master</title>
<subtitle>Vim-fork focused on extensibility and usability</subtitle>
<id>http://git.waynecole.info/neovim/atom?h=master</id>
<link rel='self' href='http://git.waynecole.info/neovim/atom?h=master'/>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/neovim/'/>
<updated>2026-04-17T23:10:20Z</updated>
<entry>
<title>perf(vim.fn): call Lua-implemented vim.fn.xx() directly #39166</title>
<updated>2026-04-17T23:10:20Z</updated>
<author>
<name>Justin M. Keyes</name>
<email>justinkz@gmail.com</email>
</author>
<published>2026-04-17T23:10:20Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/neovim/commit/?id=0d4d285bd2c19697164175280b32bf93e3a7b1da'/>
<id>urn:sha1:0d4d285bd2c19697164175280b32bf93e3a7b1da</id>
<content type='text'>
Problem:
- Builtin "Vimscript" functions (f_xx) are mostly implemented in C.
  Partly that's because there is some boilerplate required to call out
  to Lua.
- Calls to `vim.fn.foo()` always marshall over the Lua &lt;=&gt; Vimscript
  ("typval") bridge, even if `fn.foo()` is implemented entirely in Lua:
  ```
  Lua =&gt; typval =&gt; Object =&gt; Lua =&gt; Object =&gt; typval =&gt; Lua.
  ```

Solution:
Functions declared in eval.lua with `func_lua` are implemented in
entirely in Lua (`_core/vimfn.lua`).

- `gen_eval.lua` wires `func_lua` entries to `lua_wrapper`, which handles
  the typval conversion for Vimscript callers (slow path).
- `nlua_call()` detects `func_lua` functions and calls the Lua
  implementation directly. This eliminates all conversion overhead for
  Lua callers (fast path).
- Validate at build-time that `func`, `func_float`, and `func_lua` are
  mutually exclusive.
- Migrate `hostname()` as a toy example, to show the idea.</content>
</entry>
<entry>
<title>test: replace busted with local harness</title>
<updated>2026-04-15T11:09:25Z</updated>
<author>
<name>Lewis Russell</name>
<email>lewis6991@gmail.com</email>
</author>
<published>2026-03-25T13:33:17Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/neovim/commit/?id=55f9c2136e52d8719495b6021ce7e8d64c5141fe'/>
<id>urn:sha1:55f9c2136e52d8719495b6021ce7e8d64c5141fe</id>
<content type='text'>
Replace the busted-based Lua test runner with a repo-local harness.

The new harness runs spec files directly under `nvim -ll`, ships its own
reporter and lightweight `luassert` shim, and keeps the helper/preload
flow used by the functional and unit test suites.

Keep the file boundary model shallow and busted-like by restoring `_G`,
`package.loaded`, `package.preload`, `arg`, and the process environment
between files, without carrying extra reset APIs or custom assertion
machinery.

Update the build and test entrypoints to use the new runner, add
black-box coverage for the harness itself, and drop the bundled
busted/luacheck dependency path.

AI-assisted: Codex
</content>
</entry>
<entry>
<title>fix(lua): make vim.deep_equal cycle-safe</title>
<updated>2026-04-15T08:26:45Z</updated>
<author>
<name>Lewis Russell</name>
<email>lewis6991@gmail.com</email>
</author>
<published>2026-03-26T15:25:13Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/neovim/commit/?id=e289f9579c73b4f6da105dfad87bd90e0dc6d973'/>
<id>urn:sha1:e289f9579c73b4f6da105dfad87bd90e0dc6d973</id>
<content type='text'>
AI-assisted: Codex
</content>
</entry>
<entry>
<title>fix(messages): truncate warning messages only in display (#38901)</title>
<updated>2026-04-09T04:11:32Z</updated>
<author>
<name>zeertzjq</name>
<email>zeertzjq@outlook.com</email>
</author>
<published>2026-04-09T04:11:32Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/neovim/commit/?id=9c5fba5df0b60cd25ac2c180a7d82fca47a105e6'/>
<id>urn:sha1:9c5fba5df0b60cd25ac2c180a7d82fca47a105e6</id>
<content type='text'>
For now, add a private "_truncate" flag to nvim_echo, using a truncation
method similar to showmode().</content>
</entry>
<entry>
<title>fix(lua): drop support for boolean `buf` in `vim.keymap` #38432</title>
<updated>2026-03-23T12:00:53Z</updated>
<author>
<name>skewb1k</name>
<email>skewb1kunix@gmail.com</email>
</author>
<published>2026-03-23T12:00:53Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/neovim/commit/?id=9a5641b4b57082d3de3574a2776b55dcd444143c'/>
<id>urn:sha1:9a5641b4b57082d3de3574a2776b55dcd444143c</id>
<content type='text'>
Problem:
`vim.keymap.*.Opts.buf` allows `boolean` aliases for more widely
used `integer?` values, `true` -&gt; `0` and `false` -&gt; `nil`. This
conversion is unnecessary and can be handled at call sites.

Solution:
As a follow-up to deprecating the `buffer` option, drop support for
boolean values for the new `buf` option. The deprecated `buffer`
continues to support booleans for backward compatibility.</content>
</entry>
<entry>
<title>feat(lua): replace `buffer` with `buf` in vim.keymap.set/del #38360</title>
<updated>2026-03-21T16:00:06Z</updated>
<author>
<name>skewb1k</name>
<email>skewb1kunix@gmail.com</email>
</author>
<published>2026-03-21T16:00:06Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/neovim/commit/?id=4d3a67cd620152d11ab9b5f5bdd973f84cc2d44b'/>
<id>urn:sha1:4d3a67cd620152d11ab9b5f5bdd973f84cc2d44b</id>
<content type='text'>
The `buffer` option remains functional but is now undocumented.
Providing both will raise an error. Since providing `buf` was disallowed
before, there is no code that will break due to using `buffer` alongside
`buf`.</content>
</entry>
<entry>
<title>fix: wait() checks condition twice on each interval (#37837)</title>
<updated>2026-02-13T13:02:40Z</updated>
<author>
<name>zeertzjq</name>
<email>zeertzjq@outlook.com</email>
</author>
<published>2026-02-13T13:02:40Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/neovim/commit/?id=9c5ade9212d897db590aeb6a2a5340e73ffe44d0'/>
<id>urn:sha1:9c5ade9212d897db590aeb6a2a5340e73ffe44d0</id>
<content type='text'>
Problem:  wait() checks condition twice on each interval.
Solution: Don't schedule the due callback. Also fix memory leak when
          Nvim exits while waiting.

No test that the condition isn't checked twice, as testing for that can
be flaky when there are libuv events from other sources.</content>
</entry>
<entry>
<title>fix(lua): close vim.defer_fn() timer if vim.schedule() failed (#37647)</title>
<updated>2026-02-01T13:29:19Z</updated>
<author>
<name>zeertzjq</name>
<email>zeertzjq@outlook.com</email>
</author>
<published>2026-02-01T13:29:19Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/neovim/commit/?id=1906da52dbc9876046ec9866a5aae25309d7587e'/>
<id>urn:sha1:1906da52dbc9876046ec9866a5aae25309d7587e</id>
<content type='text'>
Problem:
Using vim.defer_fn() just before Nvim exit leaks luv handles.

Solution:
Make vim.schedule() return an error message if scheduling failed.
Make vim.defer_fn() close timer if vim.schedule() failed.</content>
</entry>
<entry>
<title>build: move shared.lua to _core/</title>
<updated>2025-12-30T06:44:52Z</updated>
<author>
<name>Justin M. Keyes</name>
<email>justinkz@gmail.com</email>
</author>
<published>2025-12-21T02:51:54Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/neovim/commit/?id=1d70c96e5b390c23b021930544c44d1d1e95f04f'/>
<id>urn:sha1:1d70c96e5b390c23b021930544c44d1d1e95f04f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>docs(lua): iInconsistent vim.keymap param name #37026</title>
<updated>2025-12-21T00:26:44Z</updated>
<author>
<name>Bryan Turns</name>
<email>95263942+BryanTurns@users.noreply.github.com</email>
</author>
<published>2025-12-21T00:26:44Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/neovim/commit/?id=bef68ba266038b94a532ce76e315dd71089939f3'/>
<id>urn:sha1:bef68ba266038b94a532ce76e315dd71089939f3</id>
<content type='text'>
Problem: vim.keymap.del has 'modes' as it's first argument while vim.keymap.set
has 'mode' as it's first argument despite both 'mode' and 'modes' taking in the
same type input of String or String[].

Solution: Updated vim.keymap.set docs to refer to it's first argument
as 'modes'.</content>
</entry>
</feed>
