neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 5cfbc35aa8381f3e199be248fbb94b05c16f82ff
parent 80753332d1fe8035b54d1bd8936e222801620c36
Author: glepnir <glephunter@gmail.com>
Date:   Mon,  2 Jun 2025 06:03:35 +0800

fix(api): add missing nargs field to user command Lua callbacks #34210

Problem: nvim_create_user_command() Lua callbacks were missing the documented nargs field in the options table passed to the callback function.

Solution: Add nargs field derivation from command argument type flags in nlua_do_ucmd(), using the same logic as nvim_parse_cmd().
Diffstat:
Msrc/nvim/lua/executor.c | 20++++++++++++++++++++
Mtest/functional/api/command_spec.lua | 10++++++++++
2 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c @@ -2206,6 +2206,26 @@ int nlua_do_ucmd(ucmd_T *cmd, exarg_T *eap, bool preview) } lua_setfield(lstate, -2, "count"); + char nargs[2]; + if (cmd->uc_argt & EX_EXTRA) { + if (cmd->uc_argt & EX_NOSPC) { + if (cmd->uc_argt & EX_NEEDARG) { + nargs[0] = '1'; + } else { + nargs[0] = '?'; + } + } else if (cmd->uc_argt & EX_NEEDARG) { + nargs[0] = '+'; + } else { + nargs[0] = '*'; + } + } else { + nargs[0] = '0'; + } + nargs[1] = NUL; + lua_pushstring(lstate, nargs); + lua_setfield(lstate, -2, "nargs"); + // The size of this buffer is chosen empirically to be large enough to hold // every possible modifier (with room to spare). If the list of possible // modifiers grows this may need to be updated. diff --git a/test/functional/api/command_spec.lua b/test/functional/api/command_spec.lua @@ -227,6 +227,7 @@ describe('nvim_create_user_command', function() line1 = 1, line2 = 1, mods = '', + nargs = '*', smods = { browse = false, confirm = false, @@ -267,6 +268,7 @@ describe('nvim_create_user_command', function() line1 = 1, line2 = 1, mods = '', + nargs = '*', smods = { browse = false, confirm = false, @@ -307,6 +309,7 @@ describe('nvim_create_user_command', function() line1 = 1, line2 = 1, mods = '', + nargs = '*', smods = { browse = false, confirm = false, @@ -347,6 +350,7 @@ describe('nvim_create_user_command', function() line1 = 10, line2 = 10, mods = 'confirm unsilent botright horizontal', + nargs = '*', smods = { browse = false, confirm = true, @@ -387,6 +391,7 @@ describe('nvim_create_user_command', function() line1 = 1, line2 = 42, mods = '', + nargs = '*', smods = { browse = false, confirm = false, @@ -427,6 +432,7 @@ describe('nvim_create_user_command', function() line1 = 1, line2 = 1, mods = '', + nargs = '*', smods = { browse = false, confirm = false, @@ -479,6 +485,7 @@ describe('nvim_create_user_command', function() line1 = 1, line2 = 1, mods = '', + nargs = '?', smods = { browse = false, confirm = false, @@ -520,6 +527,7 @@ describe('nvim_create_user_command', function() line1 = 1, line2 = 1, mods = '', + nargs = '?', smods = { browse = false, confirm = false, @@ -572,6 +580,7 @@ describe('nvim_create_user_command', function() line1 = 1, line2 = 1, mods = '', + nargs = '0', smods = { browse = false, confirm = false, @@ -612,6 +621,7 @@ describe('nvim_create_user_command', function() line1 = 1, line2 = 1, mods = '', + nargs = '0', smods = { browse = false, confirm = false,