This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFA: patch to 'help' completion


Yesterday I happened to notice that 'help info TAB' does not complete
on info subcommands.  This seemed like an odd oversight to me, so I
delved into it and wrote this patch.

Basically, complete_on_cmdlist only looks at the immediate subcommands
of the current command element.  In the 'help info TAB' case, this
amounts to trying to complete "info " -- which yields nothing.

Since complete_line does almost everything we want, I added an
argument to it to omit calling individual commands' completion
functions if we're completing for the help command.

Built and tested on x86 F8.  New test case included.  Ok?

Tom

ChangeLog:
2008-06-30  Tom Tromey  <tromey@redhat.com>

	* completer.c (complete_line_internal): New function, from
	complete_line.  Add 'for_help' parameter.
	(complete_line): Use it.
	(command_completer): Move later.  Rewrite.

testsuite/ChangeLog:
2008-06-30  Tom Tromey  <tromey@redhat.com>

	* gdb.base/completion.exp: Add 'help' completion test.

Index: completer.c
===================================================================
RCS file: /cvs/src/src/gdb/completer.c,v
retrieving revision 1.26
diff -u -r1.26 completer.c
--- completer.c	9 Jun 2008 19:25:14 -0000	1.26
+++ completer.c	30 Jun 2008 16:50:05 -0000
@@ -429,14 +429,6 @@
   return location_completer (p, word);
 }
 
-/* Complete on command names.  Used by "help".  */
-char **
-command_completer (char *text, char *word)
-{
-  return complete_on_cmdlist (cmdlist, text, word);
-}
-
-
 /* Here are some useful test cases for completion.  FIXME: These should
    be put in the test suite.  They should be tested with both M-? and TAB.
 
@@ -467,10 +459,16 @@
 
    LINE_BUFFER is available to be looked at; it contains the entire text
    of the line.  POINT is the offset in that line of the cursor.  You
-   should pretend that the line ends at POINT.  */
-
-char **
-complete_line (const char *text, char *line_buffer, int point)
+   should pretend that the line ends at POINT.
+   
+   FOR_HELP is true when completing a 'help' command.  In this case,
+   once sub-command completions are exhausted, we simply return NULL.
+   When FOR_HELP is false, we will call a sub-command's completion
+   function.  */
+
+static char **
+complete_line_internal (const char *text, char *line_buffer, int point,
+			int for_help)
 {
   char **list = NULL;
   char *tmp_command, *p;
@@ -583,6 +581,8 @@
 		  rl_completer_word_break_characters =
 		    gdb_completer_command_word_break_characters;
 		}
+	      else if (for_help)
+		list = NULL;
 	      else if (c->enums)
 		{
 		  list = complete_on_enum (c->enums, p, word);
@@ -650,6 +650,8 @@
 		gdb_completer_command_word_break_characters;
 	    }
 	}
+      else if (for_help)
+	list = NULL;
       else
 	{
 	  /* There is non-whitespace beyond the command.  */
@@ -695,6 +697,21 @@
   return list;
 }
 
+/* Like complete_line_internal, but always passes 0 for FOR_HELP.  */
+
+char **
+complete_line (const char *text, char *line_buffer, int point)
+{
+  return complete_line_internal (text, line_buffer, point, 0);
+}
+
+/* Complete on command names.  Used by "help".  */
+char **
+command_completer (char *text, char *word)
+{
+  return complete_line_internal (word, text, strlen (text), 1);
+}
+
 /* Generate completions one by one for the completer.  Each time we are
    called return another potential completion to the caller.
    line_completion just completes on commands or passes the buck to the
Index: testsuite/gdb.base/completion.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/completion.exp,v
retrieving revision 1.31
diff -u -r1.31 completion.exp
--- testsuite/gdb.base/completion.exp	9 Jun 2008 19:25:15 -0000	1.31
+++ testsuite/gdb.base/completion.exp	30 Jun 2008 16:50:07 -0000
@@ -364,6 +364,23 @@
         }
 
 
+send_gdb "help info wat\t"
+gdb_expect  {
+        -re "^help info watchpoints $"\
+            { send_gdb "\n"
+              gdb_expect {
+                      -re "Synonym for .*\r\n.*$gdb_prompt $"\
+                          { pass "complete help info wat" }
+                      -re ".*$gdb_prompt $" { fail "complete help info wat"}
+                      timeout   {fail "(timeout) complete help info wat"}
+                     }
+            }
+	-re "^help info wat\\\x07$" { fail "complete (2) help info wat" }
+        -re ".*$gdb_prompt $" { fail "complete (3) help info wat" }
+        timeout         { fail "(timeout) complete (3) help info wat" }
+        }
+
+
 send_gdb "p \"break1\t"
 sleep 1
 gdb_expect  {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]