edit: Fix history prev/next selection
Commit 19ec1f262e
tried to fix some
cases for history prev selection, but it broke others. Fix this
properly by using a separate entry for the current edit line that
is not yet in history buffer.
This commit is contained in:
parent
44dc872ee5
commit
1e1a0a4dc9
1 changed files with 23 additions and 6 deletions
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Command line editing and history
|
||||
* Copyright (c) 2010, Jouni Malinen <j@w1.fi>
|
||||
* Copyright (c) 2010-2011, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
|
@ -24,6 +24,8 @@
|
|||
static char cmdbuf[CMD_BUF_LEN];
|
||||
static int cmdbuf_pos = 0;
|
||||
static int cmdbuf_len = 0;
|
||||
static char currbuf[CMD_BUF_LEN];
|
||||
static int currbuf_valid = 0;
|
||||
|
||||
#define HISTORY_MAX 100
|
||||
|
||||
|
@ -231,18 +233,22 @@ static void history_prev(void)
|
|||
|
||||
if (history_curr ==
|
||||
dl_list_first(&history_list, struct edit_history, list)) {
|
||||
cmdbuf[cmdbuf_len] = '\0';
|
||||
history_add(cmdbuf);
|
||||
if (!currbuf_valid) {
|
||||
cmdbuf[cmdbuf_len] = '\0';
|
||||
os_memcpy(currbuf, cmdbuf, cmdbuf_len + 1);
|
||||
currbuf_valid = 1;
|
||||
history_use();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
history_use();
|
||||
|
||||
if (history_curr ==
|
||||
dl_list_last(&history_list, struct edit_history, list))
|
||||
return;
|
||||
|
||||
history_curr = dl_list_entry(history_curr->list.next,
|
||||
struct edit_history, list);
|
||||
history_use();
|
||||
}
|
||||
|
||||
|
||||
|
@ -250,8 +256,16 @@ static void history_next(void)
|
|||
{
|
||||
if (history_curr == NULL ||
|
||||
history_curr ==
|
||||
dl_list_first(&history_list, struct edit_history, list))
|
||||
dl_list_first(&history_list, struct edit_history, list)) {
|
||||
if (currbuf_valid) {
|
||||
currbuf_valid = 0;
|
||||
edit_clear_line();
|
||||
cmdbuf_len = cmdbuf_pos = os_strlen(currbuf);
|
||||
os_memcpy(cmdbuf, currbuf, cmdbuf_len);
|
||||
edit_redraw();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
history_curr = dl_list_entry(history_curr->list.prev,
|
||||
struct edit_history, list);
|
||||
|
@ -309,6 +323,8 @@ static void history_debug_dump(void)
|
|||
printf("\r");
|
||||
dl_list_for_each_reverse(h, &history_list, struct edit_history, list)
|
||||
printf("%s%s\n", h == history_curr ? "[C]" : "", h->str);
|
||||
if (currbuf_valid)
|
||||
printf("{%s}\n", currbuf);
|
||||
edit_redraw();
|
||||
}
|
||||
|
||||
|
@ -1104,6 +1120,7 @@ int edit_init(void (*cmd_cb)(void *ctx, char *cmd),
|
|||
char ** (*completion_cb)(void *ctx, const char *cmd, int pos),
|
||||
void *ctx, const char *history_file)
|
||||
{
|
||||
currbuf[0] = '\0';
|
||||
dl_list_init(&history_list);
|
||||
history_curr = NULL;
|
||||
if (history_file)
|
||||
|
|
Loading…
Reference in a new issue