aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shaw <[email protected]>2005-03-18 22:07:12 +0000
committerDavid Shaw <[email protected]>2005-03-18 22:07:12 +0000
commitc249809a6b0f982f7bd07a0508dee81b2924505d (patch)
tree044b3b3e5fae39cd67c7a30702f5cb539cdcb54a
parent* ttyio.c (tty_enable_completion, tty_disable_completion): Enable and (diff)
downloadgnupg-c249809a6b0f982f7bd07a0508dee81b2924505d.tar.gz
gnupg-c249809a6b0f982f7bd07a0508dee81b2924505d.zip
* keyedit.c (command_generator, keyedit_completion) [HAVE_LIBREADLINE]:
New functions to enable command completion in the --edit-key menu. (keyedit_menu): Call them here.
Diffstat (limited to '')
-rw-r--r--g10/ChangeLog7
-rw-r--r--g10/keyedit.c55
2 files changed, 59 insertions, 3 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index c8fcdc300..3e5b380ae 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,10 @@
+2005-03-18 David Shaw <[email protected]>
+
+ * keyedit.c (command_generator, keyedit_completion)
+ [HAVE_LIBREADLINE]: New functions to enable command completion in
+ the --edit-key menu.
+ (keyedit_menu): Call them here.
+
2005-03-17 David Shaw <[email protected]>
* getkey.c (get_seckey_byname2): If no explicit default key is
diff --git a/g10/keyedit.c b/g10/keyedit.c
index 8cd85d43b..5a2d54849 100644
--- a/g10/keyedit.c
+++ b/g10/keyedit.c
@@ -26,7 +26,10 @@
#include <errno.h>
#include <assert.h>
#include <ctype.h>
-
+#ifdef HAVE_LIBREADLINE
+#include <stdio.h>
+#include <readline/readline.h>
+#endif
#include "options.h"
#include "packet.h"
#include "errors.h"
@@ -1405,6 +1408,49 @@ static struct
{ NULL, cmdNONE, 0, NULL }
};
+#ifdef HAVE_LIBREADLINE
+
+/* These two functions are used by readline for command completion. */
+
+static char *command_generator(const char *text,int state)
+{
+ static int list_index,len;
+ const char *name;
+
+ /* If this is a new word to complete, initialize now. This includes
+ saving the length of TEXT for efficiency, and initializing the
+ index variable to 0. */
+ if(!state)
+ {
+ list_index=0;
+ len=strlen(text);
+ }
+
+ /* Return the next partial match */
+ while((name=cmds[list_index].name))
+ {
+ /* Only complete commands that have help text */
+ if(cmds[list_index++].desc && strncmp(name,text,len)==0)
+ return strdup(name);
+ }
+
+ return NULL;
+}
+
+static char **keyedit_completion(const char *text, int start, int end)
+{
+ /* If we are at the start of a line, we try and command-complete.
+ If not, just do nothing for now. */
+
+ if(start==0)
+ return rl_completion_matches(text,command_generator);
+
+ rl_attempted_completion_over=1;
+
+ return NULL;
+}
+#endif
+
void
keyedit_menu( const char *username, STRLIST locusr,
STRLIST commands, int quiet, int seckey_check )
@@ -1522,10 +1568,13 @@ keyedit_menu( const char *username, STRLIST locusr,
else
have_commands = 0;
}
- if( !have_commands ) {
+ if( !have_commands )
+ {
+ tty_enable_completion(keyedit_completion);
answer = cpr_get_no_help("keyedit.prompt", _("Command> "));
cpr_kill_prompt();
- }
+ tty_disable_completion();
+ }
trim_spaces(answer);
} while( *answer == '#' );