Преглед на файлове

Don't show help for upper levels when single word is unfinished.

When user enters only single unfinished word then don't show help
for the upper kpath levels.
Serj Kalichev преди 6 месеца
родител
ревизия
9cbcef81ee
променени са 3 файла, в които са добавени 18 реда и са изтрити 13 реда
  1. 13 9
      klish/ksession/ksession_parse.c
  2. 2 2
      klish/ksession_parse.h
  3. 3 2
      klish/ktp/ktpd_session.c

+ 13 - 9
klish/ksession/ksession_parse.c

@@ -333,8 +333,15 @@ kpargv_t *ksession_parse_line(ksession_t *session, const faux_argv_t *argv,
 
 	argv_iter = faux_argv_iter(argv);
 
-	dont_parse_upper = faux_argv_len(argv) == 0 &&
-		(purpose == KPURPOSE_COMPLETION || purpose == KPURPOSE_HELP);
+	// When the purpose is completion or help and user didn't type
+	// any text yet then don't show completion/help for the upper
+	// kpath levels but only for the current one.
+	// When user enters only single unfinished word then don't show help
+	// for the upper kpath levels too.
+	dont_parse_upper = (faux_argv_len(argv) == 0 &&
+		(purpose == KPURPOSE_COMPLETION || purpose == KPURPOSE_HELP)) ||
+		(faux_argv_len(argv) == 1 && faux_argv_is_continuable(argv) &&
+		purpose == KPURPOSE_HELP);
 
 	// Initialize kpargv_t
 	pargv = kpargv_new();
@@ -364,9 +371,6 @@ kpargv_t *ksession_parse_line(ksession_t *session, const faux_argv_t *argv,
 		// levels of path.
 		if (kpargv_pargs_len(pargv) > 0)
 			break;
-		// When the purpose is completion or help and user didn't type
-		// any text yet then don't show completion/help for the upper
-		// kpath levels but only for the current one.
 		if (dont_parse_upper)
 			break;
 		level_found--;
@@ -538,8 +542,8 @@ static bool_t ksession_check_line(const kpargv_t *pargv, faux_error_t *error,
 // component must be parsed for completion.
 // Completion is a "back-end" operation so it doesn't need detailed error
 // reporting.
-kpargv_t *ksession_parse_for_completion(ksession_t *session,
-	const char *raw_line)
+kpargv_t *ksession_parse_for_hint(ksession_t *session,
+	const char *raw_line, kpargv_purpose_e purpose)
 {
 	faux_list_t *split = NULL;
 	faux_list_node_t *iter = NULL;
@@ -566,9 +570,9 @@ kpargv_t *ksession_parse_for_completion(ksession_t *session,
 		faux_argv_t *argv = (faux_argv_t *)faux_list_data(iter);
 		bool_t is_last = (iter == faux_list_tail(split));
 		bool_t is_first = (iter == faux_list_head(split));
-		kpargv_purpose_e purpose = is_last ? KPURPOSE_COMPLETION : KPURPOSE_EXEC;
+		kpargv_purpose_e purp = is_last ? purpose : KPURPOSE_EXEC;
 
-		pargv = ksession_parse_line(session, argv, purpose, !is_first);
+		pargv = ksession_parse_line(session, argv, purp, !is_first);
 		if (!ksession_check_line(pargv, NULL, is_first, is_piped)) {
 			kpargv_free(pargv);
 			pargv = NULL;

+ 2 - 2
klish/ksession_parse.h

@@ -16,8 +16,8 @@ C_DECL_BEGIN
 kpargv_t *ksession_parse_line(ksession_t *session, const faux_argv_t *argv,
 	kpargv_purpose_e purpose, bool_t is_filter);
 faux_list_t *ksession_split_pipes(const char *raw_line, faux_error_t *error);
-kpargv_t *ksession_parse_for_completion(ksession_t *session,
-	const char *raw_line);
+kpargv_t *ksession_parse_for_hint(ksession_t *session,
+	const char *raw_line, kpargv_purpose_e purpose);
 kexec_t *ksession_parse_for_exec(ksession_t *session, const char *raw_line,
 	faux_error_t *error);
 kexec_t *ksession_parse_for_local_exec(ksession_t *session, const kentry_t *entry,

+ 3 - 2
klish/ktp/ktpd_session.c

@@ -646,7 +646,8 @@ static bool_t ktpd_session_process_completion(ktpd_session_t *ktpd, faux_msg_t *
 	}
 
 	// Parsing
-	pargv = ksession_parse_for_completion(ktpd->session, line);
+	pargv = ksession_parse_for_hint(ktpd->session, line,
+		KPURPOSE_COMPLETION);
 	faux_str_free(line);
 	if (!pargv) {
 		ktp_send_error(ktpd->async, cmd, NULL);
@@ -794,7 +795,7 @@ static bool_t ktpd_session_process_help(ktpd_session_t *ktpd, faux_msg_t *msg)
 	}
 
 	// Parsing
-	pargv = ksession_parse_for_completion(ktpd->session, line);
+	pargv = ksession_parse_for_hint(ktpd->session, line, KPURPOSE_HELP);
 	faux_str_free(line);
 	if (!pargv) {
 		ktp_send_error(ktpd->async, cmd, NULL);