X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Flib%2Fcmdline_rdline.c;h=5783d6598064b0740601a797c35e10ab24d4fcdc;hb=504b523d94543a7bb7301a3b1bfe929aabf7fb36;hp=d5eac3b42fda46f130e2e9d71473f87ed6b5b915;hpb=c39d452741fe5b6c771bb655fa0c827a064f4460;p=libcmdline.git diff --git a/src/lib/cmdline_rdline.c b/src/lib/cmdline_rdline.c index d5eac3b..5783d65 100644 --- a/src/lib/cmdline_rdline.c +++ b/src/lib/cmdline_rdline.c @@ -164,19 +164,21 @@ rdline_get_buffer(struct rdline *rdl) } static void -display_right_buffer(struct rdline *rdl) +display_right_buffer(struct rdline *rdl, int force) { unsigned int i; char tmp; + if (!force && CIRBUF_IS_EMPTY(&rdl->right)) + return; + rdline_puts(rdl, vt100_clear_right); - if (!CIRBUF_IS_EMPTY(&rdl->right)) { - CIRBUF_FOREACH(&rdl->right, i, tmp) { - rdl->write_char(rdl, tmp); - } + CIRBUF_FOREACH(&rdl->right, i, tmp) { + rdl->write_char(rdl, tmp); + } + if (!CIRBUF_IS_EMPTY(&rdl->right)) rdline_miniprintf(rdl, vt100_multi_left, CIRBUF_GET_LEN(&rdl->right)); - } } void @@ -191,7 +193,7 @@ rdline_redisplay(struct rdline *rdl) CIRBUF_FOREACH(&rdl->left, i, tmp) { rdl->write_char(rdl, tmp); } - display_right_buffer(rdl); + display_right_buffer(rdl, 1); } int @@ -210,10 +212,10 @@ rdline_char_in(struct rdline *rdl, char c) return RDLINE_RES_NOT_RUNNING; cmd = vt100_parser(&rdl->vt100, c); - if (cmd == -2) + if (cmd == VT100_NOT_COMPLETE) return RDLINE_RES_SUCCESS; - if (cmd >= 0) { + if (cmd != VT100_STD_CHAR) { switch (cmd) { case CMDLINE_KEY_CTRL_B: case CMDLINE_KEY_LEFT_ARR: @@ -272,11 +274,12 @@ rdline_char_in(struct rdline *rdl, char c) case CMDLINE_KEY_BKSPACE: if(!cirbuf_del_tail_safe(&rdl->left)) { rdline_puts(rdl, vt100_bs); - display_right_buffer(rdl); + display_right_buffer(rdl, 1); } break; case CMDLINE_KEY_META_BKSPACE: + case CMDLINE_KEY_CTRL_W: while (! CIRBUF_IS_EMPTY(&rdl->left) && isblank2(cirbuf_get_tail(&rdl->left))) { rdline_puts(rdl, vt100_bs); cirbuf_del_tail(&rdl->left); @@ -285,7 +288,15 @@ rdline_char_in(struct rdline *rdl, char c) rdline_puts(rdl, vt100_bs); cirbuf_del_tail(&rdl->left); } - display_right_buffer(rdl); + display_right_buffer(rdl, 1); + break; + + case CMDLINE_KEY_META_D: + while (! CIRBUF_IS_EMPTY(&rdl->right) && isblank2(cirbuf_get_head(&rdl->right))) + cirbuf_del_head(&rdl->right); + while (! CIRBUF_IS_EMPTY(&rdl->right) && !isblank2(cirbuf_get_head(&rdl->right))) + cirbuf_del_head(&rdl->right); + display_right_buffer(rdl, 1); break; case CMDLINE_KEY_SUPPR: @@ -296,7 +307,7 @@ rdline_char_in(struct rdline *rdl, char c) return RDLINE_RES_EOF; } if (!cirbuf_del_head_safe(&rdl->right)) { - display_right_buffer(rdl); + display_right_buffer(rdl, 1); } break; @@ -341,7 +352,7 @@ rdline_char_in(struct rdline *rdl, char c) rdl->write_char(rdl, rdl->kill_buf[i]); i++; } - display_right_buffer(rdl); + display_right_buffer(rdl, 0); break; #endif /* !NO_RDLINE_KILL_BUF */ @@ -389,7 +400,7 @@ rdline_char_in(struct rdline *rdl, char c) rdl->write_char(rdl, tmp_buf[i]); i++; } - display_right_buffer(rdl); + display_right_buffer(rdl, 1); return RDLINE_RES_COMPLETE; /* ?? */ } @@ -428,6 +439,7 @@ rdline_char_in(struct rdline *rdl, char c) #ifndef NO_RDLINE_HISTORY case CMDLINE_KEY_UP_ARR: + case CMDLINE_KEY_CTRL_P: if (rdl->history_cur_line == 0) { rdline_remove_first_history_item(rdl); } @@ -449,6 +461,7 @@ rdline_char_in(struct rdline *rdl, char c) break; case CMDLINE_KEY_DOWN_ARR: + case CMDLINE_KEY_CTRL_N: if (rdl->history_cur_line - 1 < 0) break; @@ -484,7 +497,7 @@ rdline_char_in(struct rdline *rdl, char c) return RDLINE_RES_SUCCESS; rdl->write_char(rdl, c); - display_right_buffer(rdl); + display_right_buffer(rdl, 0); return RDLINE_RES_SUCCESS; }