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 + + * 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 * 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 #include #include - +#ifdef HAVE_LIBREADLINE +#include +#include +#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 == '#' );