diff options
author | bfredl <bjorn.linse@gmail.com> | 2022-05-29 15:23:51 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-29 15:23:51 +0200 |
commit | ebad151a2a1943ca0d4e07485c416e0762f7f096 (patch) | |
tree | db29ae0e06df1882588430f813cd60b30c6b3018 /src | |
parent | d4bb15af526abd9c18d791f147aa6200c5ba0b03 (diff) | |
parent | 9988d2f214963b3cac70026d6ad4bb058837afd9 (diff) | |
download | rneovim-ebad151a2a1943ca0d4e07485c416e0762f7f096.tar.gz rneovim-ebad151a2a1943ca0d4e07485c416e0762f7f096.tar.bz2 rneovim-ebad151a2a1943ca0d4e07485c416e0762f7f096.zip |
Merge pull request #18792 from famiu/feat/nvim_create_user_command/smods
feat(api): pass structured modifiers to commands
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/api/vim.c | 2 | ||||
-rw-r--r-- | src/nvim/lua/executor.c | 56 |
2 files changed, 58 insertions, 0 deletions
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index dd0b75bbfb..5c3c16d6b0 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -2501,6 +2501,8 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * /// - count: (number) Any count supplied |<count>| /// - reg: (string) The optional register, if specified |<reg>| /// - mods: (string) Command modifiers, if any |<mods>| +/// - smods: (table) Command modifiers in a structured format. Has the same +/// structure as the "mods" key of |nvim_parse_cmd()|. /// @param opts Optional command attributes. See |command-attributes| for more details. To use /// boolean attributes (such as |:command-bang| or |:command-bar|) set the value to /// "true". In addition to the string options listed in |:command-complete|, the diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c index 0009420281..a826dd07d3 100644 --- a/src/nvim/lua/executor.c +++ b/src/nvim/lua/executor.c @@ -40,6 +40,7 @@ #include "nvim/undo.h" #include "nvim/version.h" #include "nvim/vim.h" +#include "nvim/window.h" static int in_fast_callback = 0; @@ -1913,6 +1914,61 @@ void nlua_do_ucmd(ucmd_T *cmd, exarg_T *eap) lua_pushstring(lstate, buf); lua_setfield(lstate, -2, "mods"); + lua_newtable(lstate); // smods table + + lua_pushinteger(lstate, cmdmod.tab); + lua_setfield(lstate, -2, "tab"); + lua_pushinteger(lstate, p_verbose); + lua_setfield(lstate, -2, "verbose"); + + if (cmdmod.split & WSP_ABOVE) { + lua_pushstring(lstate, "aboveleft"); + } else if (cmdmod.split & WSP_BELOW) { + lua_pushstring(lstate, "belowright"); + } else if (cmdmod.split & WSP_TOP) { + lua_pushstring(lstate, "topleft"); + } else if (cmdmod.split & WSP_BOT) { + lua_pushstring(lstate, "botright"); + } else { + lua_pushstring(lstate, ""); + } + lua_setfield(lstate, -2, "split"); + + lua_pushboolean(lstate, cmdmod.split & WSP_VERT); + lua_setfield(lstate, -2, "vertical"); + lua_pushboolean(lstate, msg_silent != 0); + lua_setfield(lstate, -2, "silent"); + lua_pushboolean(lstate, emsg_silent != 0); + lua_setfield(lstate, -2, "emsg_silent"); + lua_pushboolean(lstate, eap->did_sandbox); + lua_setfield(lstate, -2, "sandbox"); + lua_pushboolean(lstate, cmdmod.save_ei != NULL); + lua_setfield(lstate, -2, "noautocmd"); + + typedef struct { + bool *set; + char *name; + } mod_entry_T; + static mod_entry_T mod_entries[] = { + { &cmdmod.browse, "browse" }, + { &cmdmod.confirm, "confirm" }, + { &cmdmod.hide, "hide" }, + { &cmdmod.keepalt, "keepalt" }, + { &cmdmod.keepjumps, "keepjumps" }, + { &cmdmod.keepmarks, "keepmarks" }, + { &cmdmod.keeppatterns, "keeppatterns" }, + { &cmdmod.lockmarks, "lockmarks" }, + { &cmdmod.noswapfile, "noswapfile" } + }; + + // The modifiers that are simple flags + for (size_t i = 0; i < ARRAY_SIZE(mod_entries); i++) { + lua_pushboolean(lstate, *mod_entries[i].set); + lua_setfield(lstate, -2, mod_entries[i].name); + } + + lua_setfield(lstate, -2, "smods"); + if (nlua_pcall(lstate, 1, 0)) { nlua_error(lstate, _("Error executing Lua callback: %.*s")); } |