Browse Source

completion: Unfinished completion for COMMAND ptype

Serj Kalichev 1 year ago
parent
commit
9c7471ef6a
4 changed files with 29 additions and 2 deletions
  1. 5 2
      examples/simple/example.xml
  2. 2 0
      plugins/klish/plugin_init.c
  3. 1 0
      plugins/klish/private.h
  4. 21 0
      plugins/klish/ptypes.c

+ 5 - 2
examples/simple/example.xml

@@ -7,6 +7,9 @@
 <PLUGIN name="klish"/>
 
 <ENTRY name="COMMAND" purpose="ptype">
+	<ENTRY name="completion" purpose="completion">
+		<ACTION sym="completion_COMMAND"/>
+	</ENTRY>
 	<ACTION sym="COMMAND"/>
 </ENTRY>
 
@@ -14,13 +17,13 @@
 
   <ENTRY name="cmd" help="Clear settings" mode="sequence">
 	<ENTRY name="COMMAND" purpose="ptype" ref="/COMMAND"/>
-	<ACTION sym="tsym">test</ACTION>
+	<ACTION sym="print">test</ACTION>
   </ENTRY>
 
   <ENTRY name="exit" help="Exit view">
 	<ENTRY name="COMMAND" purpose="ptype" ref="/COMMAND"/>
 	<ACTION sym="nav">pop</ACTION>
-	<ACTION sym="tsym">Exiting klish session</ACTION>
+	<ACTION sym="print">Exiting klish session</ACTION>
   </ENTRY>
 
 </ENTRY>

+ 2 - 0
plugins/klish/plugin_init.c

@@ -44,6 +44,8 @@ int kplugin_klish_init(kcontext_t *context)
 	// These PTYPEs are simple and fast so set SYNC flag
 	kplugin_add_syms(plugin, ksym_new_ext("COMMAND", klish_ptype_COMMAND,
 		KSYM_USERDEFINED_PERMANENT, KSYM_SYNC));
+	kplugin_add_syms(plugin, ksym_new_ext("completion_COMMAND", klish_completion_COMMAND,
+		KSYM_USERDEFINED_PERMANENT, KSYM_SYNC));
 	kplugin_add_syms(plugin, ksym_new_ext("COMMAND_CASE", klish_ptype_COMMAND_CASE,
 		KSYM_USERDEFINED_PERMANENT, KSYM_SYNC));
 	kplugin_add_syms(plugin, ksym_new_ext("INT", klish_ptype_INT,

+ 1 - 0
plugins/klish/private.h

@@ -22,6 +22,7 @@ int klish_nav(kcontext_t *context);
 
 // PTYPEs
 int klish_ptype_COMMAND(kcontext_t *context);
+int klish_completion_COMMAND(kcontext_t *context);
 int klish_ptype_COMMAND_CASE(kcontext_t *context);
 int klish_ptype_INT(kcontext_t *context);
 int klish_ptype_UINT(kcontext_t *context);

+ 21 - 0
plugins/klish/ptypes.c

@@ -38,6 +38,27 @@ int klish_ptype_COMMAND(kcontext_t *context)
 }
 
 
+/** @brief COMPLETION: Consider ENTRY's name (or "value" field) as a command
+ */
+int klish_completion_COMMAND(kcontext_t *context)
+{
+	const kentry_t *entry = NULL;
+	const char *value = NULL;
+	const char *command_name = NULL;
+
+	entry = kcontext_candidate_entry(context);
+	value = kcontext_candidate_value(context);
+
+	command_name = kentry_value(entry);
+	if (!command_name)
+		command_name = kentry_name(entry);
+	if (!command_name)
+		return -1;
+
+	return faux_str_casecmp(value, command_name);
+}
+
+
 /** @brief PTYPE: ENTRY's name (or "value" field) as a case sensitive command
  */
 int klish_ptype_COMMAND_CASE(kcontext_t *context)