1
0
forked from aniani/vim

patch 7.4.1898

Problem:    User commands don't support modifiers.
Solution:   Add the <mods> item. (Yegappan Lakshmanan, closes #829)
This commit is contained in:
Bram Moolenaar
2016-06-04 22:08:55 +02:00
parent fd89d7ea81
commit 63a60ded3f
5 changed files with 180 additions and 2 deletions

View File

@@ -6413,6 +6413,26 @@ uc_split_args(char_u *arg, size_t *lenp)
return buf;
}
static size_t
add_cmd_modifier(char_u *buf, char *mod_str, int *multi_mods)
{
size_t result;
result = STRLEN(mod_str);
if (*multi_mods)
result += 1;
if (buf != NULL)
{
if (*multi_mods)
STRCAT(buf, " ");
STRCAT(buf, mod_str);
}
*multi_mods = 1;
return result;
}
/*
* Check for a <> code in a user command.
* "code" points to the '<'. "len" the length of the <> (inclusive).
@@ -6436,8 +6456,8 @@ uc_check_code(
char_u *p = code + 1;
size_t l = len - 2;
int quote = 0;
enum { ct_ARGS, ct_BANG, ct_COUNT, ct_LINE1, ct_LINE2, ct_REGISTER,
ct_LT, ct_NONE } type = ct_NONE;
enum { ct_ARGS, ct_BANG, ct_COUNT, ct_LINE1, ct_LINE2, ct_MODS,
ct_REGISTER, ct_LT, ct_NONE } type = ct_NONE;
if ((vim_strchr((char_u *)"qQfF", *p) != NULL) && p[1] == '-')
{
@@ -6463,6 +6483,8 @@ uc_check_code(
type = ct_LT;
else if (STRNICMP(p, "reg>", l) == 0 || STRNICMP(p, "register>", l) == 0)
type = ct_REGISTER;
else if (STRNICMP(p, "mods>", l) == 0)
type = ct_MODS;
switch (type)
{
@@ -6586,6 +6608,90 @@ uc_check_code(
break;
}
case ct_MODS:
{
int multi_mods = 0;
typedef struct {
int *varp;
char *name;
} mod_entry_T;
static mod_entry_T mod_entries[] = {
#ifdef FEAT_BROWSE_CMD
{&cmdmod.browse, "browse"},
#endif
#if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
{&cmdmod.confirm, "confirm"},
#endif
{&cmdmod.hide, "hide"},
{&cmdmod.keepalt, "keepalt"},
{&cmdmod.keepjumps, "keepjumps"},
{&cmdmod.keepmarks, "keepmarks"},
{&cmdmod.keeppatterns, "keeppatterns"},
{&cmdmod.lockmarks, "lockmarks"},
{&cmdmod.noswapfile, "noswapfile"},
{NULL, NULL}
};
int i;
result = quote ? 2 : 0;
if (buf != NULL)
{
if (quote)
*buf++ = '"';
*buf = '\0';
}
#ifdef FEAT_WINDOWS
/* :aboveleft and :leftabove */
if (cmdmod.split & WSP_ABOVE)
result += add_cmd_modifier(buf, "aboveleft", &multi_mods);
/* :belowright and :rightbelow */
if (cmdmod.split & WSP_BELOW)
result += add_cmd_modifier(buf, "belowright", &multi_mods);
/* :botright */
if (cmdmod.split & WSP_BOT)
result += add_cmd_modifier(buf, "botright", &multi_mods);
#endif
/* the modifiers that are simple flags */
for (i = 0; mod_entries[i].varp != NULL; ++i)
if (*mod_entries[i].varp)
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);
#ifdef FEAT_WINDOWS
/* :tab */
if (cmdmod.tab > 0)
result += add_cmd_modifier(buf, "tab", &multi_mods);
/* :topleft */
if (cmdmod.split & WSP_TOP)
result += add_cmd_modifier(buf, "topleft", &multi_mods);
#endif
/* TODO: How to support :unsilent?*/
/* :verbose */
if (p_verbose > 0)
result += add_cmd_modifier(buf, "verbose", &multi_mods);
#ifdef FEAT_WINDOWS
/* :vertical */
if (cmdmod.split & WSP_VERT)
result += add_cmd_modifier(buf, "vertical", &multi_mods);
#endif
if (quote && buf != NULL)
{
buf += result - 2;
*buf = '"';
}
break;
}
case ct_REGISTER:
result = eap->regname ? 1 : 0;
if (quote)