ash,hush: tab completion of functions and aliases

Since commit 9e2a5668f (ash,hush: allow builtins to be tab-completed,
closes 7532) ash and hush have supported tab completion of builtins.

Other shells, bash and ksh for example, also support tab completion
of functions and aliases.

Add such support to ash and hush.

function                                             old     new   delta
ash_command_name                                       -      92     +92
hush_command_name                                      -      63     +63
ash_builtin_name                                      17       -     -17
hush_builtin_name                                     38       -     -38
------------------------------------------------------------------------------
(add/remove: 2/2 grow/shrink: 0/0 up/down: 169/-55)           Total: 100 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Avi Halachmi <avihpit@yahoo.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston
2023-04-13 12:56:14 +01:00
committed by Denys Vlasenko
parent 90b607d79a
commit acae889dd9
2 changed files with 40 additions and 6 deletions

View File

@@ -9732,7 +9732,7 @@ evalpipe(union node *n, int flags)
/* setinteractive needs this forward reference */
#if ENABLE_FEATURE_TAB_COMPLETION
static const char *get_builtin_name(int i) FAST_FUNC;
static const char *ash_command_name(int i) FAST_FUNC;
#endif
/*
@@ -9769,7 +9769,7 @@ setinteractive(int on)
if (!line_input_state) {
line_input_state = new_line_input_t(FOR_SHELL | WITH_PATH_LOOKUP);
# if ENABLE_FEATURE_TAB_COMPLETION
line_input_state->get_exe_name = get_builtin_name;
line_input_state->get_exe_name = ash_command_name;
# endif
# if EDITING_HAS_sh_get_var
line_input_state->sh_get_var = lookupvar;
@@ -10284,9 +10284,33 @@ find_builtin(const char *name)
#if ENABLE_FEATURE_TAB_COMPLETION
static const char * FAST_FUNC
get_builtin_name(int i)
ash_command_name(int i)
{
return /*i >= 0 &&*/ i < ARRAY_SIZE(builtintab) ? builtintab[i].name + 1 : NULL;
int n;
if (/*i >= 0 &&*/ i < ARRAY_SIZE(builtintab))
return builtintab[i].name + 1;
i -= ARRAY_SIZE(builtintab);
for (n = 0; n < CMDTABLESIZE; n++) {
struct tblentry *cmdp;
for (cmdp = cmdtable[n]; cmdp; cmdp = cmdp->next) {
if (cmdp->cmdtype == CMDFUNCTION && --i < 0)
return cmdp->cmdname;
}
}
# if ENABLE_ASH_ALIAS
for (n = 0; n < ATABSIZE; n++) {
struct alias *ap;
for (ap = atab[n]; ap; ap = ap->next) {
if (--i < 0)
return ap->name;
}
}
#endif
return NULL;
}
#endif

View File

@@ -8220,7 +8220,7 @@ static const struct built_in_command *find_builtin(const char *name)
}
#if ENABLE_HUSH_JOB && ENABLE_FEATURE_TAB_COMPLETION
static const char * FAST_FUNC get_builtin_name(int i)
static const char * FAST_FUNC hush_command_name(int i)
{
if (/*i >= 0 && */ i < ARRAY_SIZE(bltins1)) {
return bltins1[i].b_cmd;
@@ -8229,6 +8229,16 @@ static const char * FAST_FUNC get_builtin_name(int i)
if (i < ARRAY_SIZE(bltins2)) {
return bltins2[i].b_cmd;
}
# if ENABLE_HUSH_FUNCTIONS
{
struct function *funcp;
i -= ARRAY_SIZE(bltins2);
for (funcp = G.top_func; funcp; funcp = funcp->next) {
if (--i < 0)
return funcp->name;
}
}
# endif
return NULL;
}
#endif
@@ -10716,7 +10726,7 @@ int hush_main(int argc, char **argv)
# if ENABLE_FEATURE_EDITING
G.line_input_state = new_line_input_t(FOR_SHELL);
# if ENABLE_FEATURE_TAB_COMPLETION
G.line_input_state->get_exe_name = get_builtin_name;
G.line_input_state->get_exe_name = hush_command_name;
# endif
# if EDITING_HAS_sh_get_var
G.line_input_state->sh_get_var = get_local_var_value;