Browse Source

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>
Ron Yorston 1 year ago
parent
commit
acae889dd9
2 changed files with 40 additions and 6 deletions
  1. 28 4
      shell/ash.c
  2. 12 2
      shell/hush.c

+ 28 - 4
shell/ash.c

@@ -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
 

+ 12 - 2
shell/hush.c

@@ -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;