aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2022-05-29 15:23:51 +0200
committerGitHub <noreply@github.com>2022-05-29 15:23:51 +0200
commitebad151a2a1943ca0d4e07485c416e0762f7f096 (patch)
treedb29ae0e06df1882588430f813cd60b30c6b3018 /src
parentd4bb15af526abd9c18d791f147aa6200c5ba0b03 (diff)
parent9988d2f214963b3cac70026d6ad4bb058837afd9 (diff)
downloadrneovim-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.c2
-rw-r--r--src/nvim/lua/executor.c56
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"));
}