client: add tab-completion with libedit/readline

This commit is contained in:
Lonnie Abelbeck 2016-12-08 07:24:14 -06:00 committed by Miroslav Lichvar
parent 9a901e1cb0
commit 3156e5a293

View file

@ -96,6 +96,10 @@ void LOG_Message(LOG_Severity severity,
/* ================================================== */
/* Read a single line of commands from standard input */
#ifdef FEAT_READLINE
static char **command_name_completion(const char *text, int start, int end);
#endif
static char *
read_line(void)
{
@ -106,6 +110,9 @@ read_line(void)
#ifdef FEAT_READLINE
char *cmd;
rl_attempted_completion_function = command_name_completion;
rl_basic_word_break_characters = "\t\n\r";
/* save line only if not empty */
cmd = readline(prompt);
if( cmd == NULL ) return( NULL );
@ -1253,6 +1260,52 @@ give_help(void)
}
}
/* ================================================== */
/* Tab-completion when editline/readline is available */
#ifdef FEAT_READLINE
static char *
command_name_generator(const char *text, int state)
{
const char *name, *names[] = {
"accheck", "activity", "add peer", "add server", "allow", "burst",
"clients", "cmdaccheck", "cmdallow", "cmddeny", "cyclelogs", "delete",
"deny", "dns", "dump", "exit", "help", "keygen", "local", "makestep",
"manual on", "manual off", "manual delete", "manual list", "manual reset",
"maxdelay", "maxdelaydevratio", "maxdelayratio", "maxpoll",
"maxupdateskew", "minpoll", "minstratum", "ntpdata", "offline", "online",
"polltarget", "quit", "refresh", "rekey", "reselect", "reselectdist",
"retries", "rtcdata", "serverstats", "settime", "smoothing", "smoothtime",
"sources", "sources -v", "sourcestats", "sourcestats -v", "timeout",
"tracking", "trimrtc", "waitsync", "writertc",
NULL
};
static int list_index, len;
if (!state) {
list_index = 0;
len = strlen(text);
}
while ((name = names[list_index++])) {
if (strncmp(name, text, len) == 0) {
return strdup(name);
}
}
return NULL;
}
/* ================================================== */
static char **
command_name_completion(const char *text, int start, int end)
{
rl_attempted_completion_over = 1;
return rl_completion_matches(text, command_name_generator);
}
#endif
/* ================================================== */
static int max_retries = 2;