0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.2.1900: Vim9: command modifiers do not work

Problem:    Vim9: command modifiers do not work.
Solution:   Make most command modifiers work.
This commit is contained in:
Bram Moolenaar
2020-10-24 23:08:38 +02:00
parent 67def64a4e
commit 02194d2bd5
8 changed files with 161 additions and 113 deletions

View File

@@ -1235,36 +1235,103 @@ add_cmd_modifier(char_u *buf, char *mod_str, int *multi_mods)
}
/*
* Add modifiers from "cmdmod.cmod_split" to "buf". Set "multi_mods" when one
* Add modifiers from "cmod->cmod_split" to "buf". Set "multi_mods" when one
* was added. Return the number of bytes added.
*/
size_t
add_win_cmd_modifers(char_u *buf, int *multi_mods)
add_win_cmd_modifers(char_u *buf, cmdmod_T *cmod, int *multi_mods)
{
size_t result = 0;
// :aboveleft and :leftabove
if (cmdmod.cmod_split & WSP_ABOVE)
if (cmod->cmod_split & WSP_ABOVE)
result += add_cmd_modifier(buf, "aboveleft", multi_mods);
// :belowright and :rightbelow
if (cmdmod.cmod_split & WSP_BELOW)
if (cmod->cmod_split & WSP_BELOW)
result += add_cmd_modifier(buf, "belowright", multi_mods);
// :botright
if (cmdmod.cmod_split & WSP_BOT)
if (cmod->cmod_split & WSP_BOT)
result += add_cmd_modifier(buf, "botright", multi_mods);
// :tab
if (cmdmod.cmod_tab > 0)
if (cmod->cmod_tab > 0)
result += add_cmd_modifier(buf, "tab", multi_mods);
// :topleft
if (cmdmod.cmod_split & WSP_TOP)
if (cmod->cmod_split & WSP_TOP)
result += add_cmd_modifier(buf, "topleft", multi_mods);
// :vertical
if (cmdmod.cmod_split & WSP_VERT)
if (cmod->cmod_split & WSP_VERT)
result += add_cmd_modifier(buf, "vertical", multi_mods);
return result;
}
/*
* Generate text for the "cmod" command modifiers.
* If "buf" is NULL just return the length.
*/
int
produce_cmdmods(char_u *buf, cmdmod_T *cmod, int quote)
{
int result = 0;
int multi_mods = 0;
int i;
typedef struct {
int flag;
char *name;
} mod_entry_T;
static mod_entry_T mod_entries[] = {
#ifdef FEAT_BROWSE_CMD
{CMOD_BROWSE, "browse"},
#endif
#if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
{CMOD_CONFIRM, "confirm"},
#endif
{CMOD_HIDE, "hide"},
{CMOD_KEEPALT, "keepalt"},
{CMOD_KEEPJUMPS, "keepjumps"},
{CMOD_KEEPMARKS, "keepmarks"},
{CMOD_KEEPPATTERNS, "keeppatterns"},
{CMOD_LOCKMARKS, "lockmarks"},
{CMOD_NOSWAPFILE, "noswapfile"},
{CMOD_UNSILENT, "unsilent"},
{CMOD_NOAUTOCMD, "noautocmd"},
#ifdef HAVE_SANDBOX
{CMOD_SANDBOX, "sandbox"},
#endif
{0, NULL}
};
result = quote ? 2 : 0;
if (buf != NULL)
{
if (quote)
*buf++ = '"';
*buf = '\0';
}
// the modifiers that are simple flags
for (i = 0; mod_entries[i].name != NULL; ++i)
if (cmod->cmod_flags & mod_entries[i].flag)
result += add_cmd_modifier(buf, mod_entries[i].name, &multi_mods);
// :silent
if (cmod->cmod_flags & CMOD_SILENT)
result += add_cmd_modifier(buf,
(cmod->cmod_flags & CMOD_ERRSILENT) ? "silent!"
: "silent", &multi_mods);
// :verbose
if (p_verbose > 0)
result += add_cmd_modifier(buf, "verbose", &multi_mods);
// flags from cmod->cmod_split
result += add_win_cmd_modifers(buf, cmod, &multi_mods);
if (quote && buf != NULL)
{
buf += result - 2;
*buf = '"';
}
return result;
}
/*
* Check for a <> code in a user command.
* "code" points to the '<'. "len" the length of the <> (inclusive).
@@ -1452,62 +1519,7 @@ uc_check_code(
case ct_MODS:
{
int multi_mods = 0;
typedef struct {
int flag;
char *name;
} mod_entry_T;
static mod_entry_T mod_entries[] = {
#ifdef FEAT_BROWSE_CMD
{CMOD_BROWSE, "browse"},
#endif
#if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
{CMOD_CONFIRM, "confirm"},
#endif
{CMOD_HIDE, "hide"},
{CMOD_KEEPALT, "keepalt"},
{CMOD_KEEPJUMPS, "keepjumps"},
{CMOD_KEEPMARKS, "keepmarks"},
{CMOD_KEEPPATTERNS, "keeppatterns"},
{CMOD_LOCKMARKS, "lockmarks"},
{CMOD_NOSWAPFILE, "noswapfile"},
{0, NULL}
};
int i;
result = quote ? 2 : 0;
if (buf != NULL)
{
if (quote)
*buf++ = '"';
*buf = '\0';
}
// the modifiers that are simple flags
for (i = 0; mod_entries[i].name != NULL; ++i)
if (cmdmod.cmod_flags & mod_entries[i].flag)
result += add_cmd_modifier(buf, mod_entries[i].name,
&multi_mods);
// TODO: How to support :noautocmd?
#ifdef HAVE_SANDBOX
// TODO: How to support :sandbox?
#endif
// :silent
if (msg_silent > 0)
result += add_cmd_modifier(buf,
emsg_silent > 0 ? "silent!" : "silent", &multi_mods);
// TODO: How to support :unsilent?
// :verbose
if (p_verbose > 0)
result += add_cmd_modifier(buf, "verbose", &multi_mods);
// flags from cmdmod.cmod_split
result += add_win_cmd_modifers(buf, &multi_mods);
if (quote && buf != NULL)
{
buf += result - 2;
*buf = '"';
}
result = produce_cmdmods(buf, &cmdmod, quote);
break;
}