From 726d1a92d243a8b7cb4b221d64e4523b7a89aaf4 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Wed, 29 Jul 2026 19:09:48 +0200 Subject: feat(options): lua closure/function options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: Cannot assign Lua functions/closures to "func" ('completefunc', 'tagfun', …) or "expr" ('foldexpr', 'indentexpr', …) options. Solution: - Store "func"/"expr" options as `Callback` instead of string. - Delete oceans of copy-pasted code. - BREAKING: LuaRef returned via RPC/Vimscript is now represented as `""` (like what `:map` shows) instead of `nil`. - Note: `man.vim` still uses `v:lua` string, bc it's a vimscript ftplugin. Helped-by: Lewis Russell --- test/functional/api/command_spec.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'test/functional/api/command_spec.lua') diff --git a/test/functional/api/command_spec.lua b/test/functional/api/command_spec.lua index 554bd5b695..7bc3790801 100644 --- a/test/functional/api/command_spec.lua +++ b/test/functional/api/command_spec.lua @@ -187,9 +187,10 @@ describe('nvim_get_commands', function() addr = NIL, bang = false, bar = false, - callback = NIL, -- RPC serializes Lua callback as NIL. - complete = NIL, -- RPC serializes Lua callback as NIL. - preview = NIL, -- RPC serializes Lua callback as NIL. + -- RPC serializes Lua func as "" (normalized below). + callback = '', + complete = '', + preview = '', complete_arg = NIL, count = NIL, definition = '', @@ -268,6 +269,10 @@ describe('nvim_get_commands', function() ]]) -- TODO(justinmk): Order is stable but undefined. Sort before return? local commands = api.nvim_get_commands({ builtin = false }) + -- Normalize the volatile ref id in the "" funcref hints. + for _, k in ipairs({ 'callback', 'complete', 'preview' }) do + commands.PreviewLuaCmd[k] = (commands.PreviewLuaCmd[k]:gsub('', '')) + end eq({ Cmd2 = cmd2, Cmd3 = cmd3, -- cgit