浏览代码

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);
 	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
 	// Initialize kpargv_t
 	pargv = kpargv_new();
 	pargv = kpargv_new();
@@ -364,9 +371,6 @@ kpargv_t *ksession_parse_line(ksession_t *session, const faux_argv_t *argv,
 		// levels of path.
 		// levels of path.
 		if (kpargv_pargs_len(pargv) > 0)
 		if (kpargv_pargs_len(pargv) > 0)
 			break;
 			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)
 		if (dont_parse_upper)
 			break;
 			break;
 		level_found--;
 		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.
 // component must be parsed for completion.
 // Completion is a "back-end" operation so it doesn't need detailed error
 // Completion is a "back-end" operation so it doesn't need detailed error
 // reporting.
 // 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_t *split = NULL;
 	faux_list_node_t *iter = 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);
 		faux_argv_t *argv = (faux_argv_t *)faux_list_data(iter);
 		bool_t is_last = (iter == faux_list_tail(split));
 		bool_t is_last = (iter == faux_list_tail(split));
 		bool_t is_first = (iter == faux_list_head(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)) {
 		if (!ksession_check_line(pargv, NULL, is_first, is_piped)) {
 			kpargv_free(pargv);
 			kpargv_free(pargv);
 			pargv = NULL;
 			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_t *ksession_parse_line(ksession_t *session, const faux_argv_t *argv,
 	kpargv_purpose_e purpose, bool_t is_filter);
 	kpargv_purpose_e purpose, bool_t is_filter);
 faux_list_t *ksession_split_pipes(const char *raw_line, faux_error_t *error);
 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,
 kexec_t *ksession_parse_for_exec(ksession_t *session, const char *raw_line,
 	faux_error_t *error);
 	faux_error_t *error);
 kexec_t *ksession_parse_for_local_exec(ksession_t *session, const kentry_t *entry,
 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
 	// Parsing
-	pargv = ksession_parse_for_completion(ktpd->session, line);
+	pargv = ksession_parse_for_hint(ktpd->session, line,
+		KPURPOSE_COMPLETION);
 	faux_str_free(line);
 	faux_str_free(line);
 	if (!pargv) {
 	if (!pargv) {
 		ktp_send_error(ktpd->async, cmd, NULL);
 		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
 	// Parsing
-	pargv = ksession_parse_for_completion(ktpd->session, line);
+	pargv = ksession_parse_for_hint(ktpd->session, line, KPURPOSE_HELP);
 	faux_str_free(line);
 	faux_str_free(line);
 	if (!pargv) {
 	if (!pargv) {
 		ktp_send_error(ktpd->async, cmd, NULL);
 		ktp_send_error(ktpd->async, cmd, NULL);