summaryrefslogtreecommitdiffstats
path: root/src/cmdexpand.c
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2022-03-24 11:22:13 +0000
committerBram Moolenaar <Bram@vim.org>2022-03-24 11:22:13 +0000
commit454ce6737cadb82886f1fc0eb9e8666cc59ae42b (patch)
treecb8c34f9a6ebc380a2788eed0c0fc14cd4512ca7 /src/cmdexpand.c
parent98b7fe725ec342d28d7c86293098b233c57c4af9 (diff)
patch 8.2.4617: no completion for :scriptnamesv8.2.4617
Problem: No completion for :scriptnames. Solution: Implement :scriptnames completion. (Yegappan Lakshmanan, closes #10005)
Diffstat (limited to 'src/cmdexpand.c')
-rw-r--r--src/cmdexpand.c73
1 files changed, 58 insertions, 15 deletions
diff --git a/src/cmdexpand.c b/src/cmdexpand.c
index defc282dbb..ca669c0798 100644
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -1709,6 +1709,24 @@ set_context_in_breakadd_cmd(expand_T *xp, char_u *arg, cmdidx_T cmdidx)
return NULL;
}
+
+ static char_u *
+set_context_in_scriptnames_cmd(expand_T *xp, char_u *arg)
+{
+ char_u *p;
+
+ xp->xp_context = EXPAND_NOTHING;
+ xp->xp_pattern = NULL;
+
+ p = skipwhite(arg);
+ if (VIM_ISDIGIT(*p))
+ return NULL;
+
+ xp->xp_context = EXPAND_SCRIPTNAMES;
+ xp->xp_pattern = p;
+
+ return NULL;
+}
#endif
/*
@@ -2072,6 +2090,9 @@ set_context_by_cmdname(
case CMD_profdel:
case CMD_breakdel:
return set_context_in_breakadd_cmd(xp, arg, cmdidx);
+
+ case CMD_scriptnames:
+ return set_context_in_scriptnames_cmd(xp, arg);
#endif
default:
@@ -2495,6 +2516,23 @@ get_breakadd_arg(expand_T *xp UNUSED, int idx)
}
return NULL;
}
+
+/*
+ * Function given to ExpandGeneric() to obtain the possible arguments for the
+ * ":scriptnames" command.
+ */
+ static char_u *
+get_scriptnames_arg(expand_T *xp UNUSED, int idx)
+{
+ scriptitem_T *si;
+
+ if (!SCRIPT_ID_VALID(idx + 1))
+ return NULL;
+
+ si = SCRIPT_ITEM(idx + 1);
+ home_replace(NULL, si->sn_name, NameBuff, MAXPATHL, TRUE);
+ return NameBuff;
+}
#endif
/*
@@ -2584,6 +2622,7 @@ ExpandOther(
{EXPAND_ARGLIST, get_arglist_name, TRUE, FALSE},
#ifdef FEAT_EVAL
{EXPAND_BREAKPOINT, get_breakadd_arg, TRUE, TRUE},
+ {EXPAND_SCRIPTNAMES, get_scriptnames_arg, TRUE, FALSE},
#endif
};
int i;
@@ -2791,6 +2830,8 @@ ExpandGeneric(
int score = 0;
int fuzzy;
int match;
+ int sort_matches = FALSE;
+ int funcsort = FALSE;
fuzzy = cmdline_fuzzy_complete(pat);
*matches = NULL;
@@ -2878,14 +2919,25 @@ ExpandGeneric(
if (ga.ga_len == 0)
return OK;
- // Sort the results. Keep menu's in the specified order.
+ // sort the matches when using regular expression matching and sorting
+ // applies to the completion context. Menus and scriptnames should be kept
+ // in the specified order.
if (!fuzzy && xp->xp_context != EXPAND_MENUNAMES
- && xp->xp_context != EXPAND_MENUS)
+ && xp->xp_context != EXPAND_MENUS
+ && xp->xp_context != EXPAND_SCRIPTNAMES)
+ sort_matches = TRUE;
+
+ // <SNR> functions should be sorted to the end.
+ if (xp->xp_context == EXPAND_EXPRESSION
+ || xp->xp_context == EXPAND_FUNCTIONS
+ || xp->xp_context == EXPAND_USER_FUNC
+ || xp->xp_context == EXPAND_DISASSEMBLE)
+ funcsort = TRUE;
+
+ // Sort the matches.
+ if (sort_matches)
{
- if (xp->xp_context == EXPAND_EXPRESSION
- || xp->xp_context == EXPAND_FUNCTIONS
- || xp->xp_context == EXPAND_USER_FUNC
- || xp->xp_context == EXPAND_DISASSEMBLE)
+ if (funcsort)
// <SNR> functions should be sorted to the end.
qsort((void *)ga.ga_data, (size_t)ga.ga_len, sizeof(char_u *),
sort_func_compare);
@@ -2900,15 +2952,6 @@ ExpandGeneric(
}
else
{
- int funcsort = FALSE;
-
- if (xp->xp_context == EXPAND_EXPRESSION
- || xp->xp_context == EXPAND_FUNCTIONS
- || xp->xp_context == EXPAND_USER_FUNC
- || xp->xp_context == EXPAND_DISASSEMBLE)
- // <SNR> functions should be sorted to the end.
- funcsort = TRUE;
-
if (fuzzymatches_to_strmatches(ga.ga_data, matches, ga.ga_len,
funcsort) == FAIL)
return FAIL;