#include "cmdline_cirbuf.h"
#include "cmdline_rdline.h"
+#include "cmdline_parse.h"
static void rdline_puts(struct rdline *rdl, const char *buf);
static void rdline_miniprintf(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 (CIRBUF_IS_EMPTY(&rdl->right))
+ if (!force && CIRBUF_IS_EMPTY(&rdl->right))
return;
rdline_puts(rdl, vt100_clear_right);
CIRBUF_FOREACH(&rdl->right, i, tmp) {
rdl->write_char(rdl, tmp);
}
- rdline_miniprintf(rdl, vt100_multi_left,
- CIRBUF_GET_LEN(&rdl->right));
+ if (!CIRBUF_IS_EMPTY(&rdl->right))
+ rdline_miniprintf(rdl, vt100_multi_left,
+ CIRBUF_GET_LEN(&rdl->right));
}
void
CIRBUF_FOREACH(&rdl->left, i, tmp) {
rdl->write_char(rdl, tmp);
}
- display_right_buffer(rdl);
+ display_right_buffer(rdl, 1);
}
int
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:
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);
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:
return RDLINE_RES_EOF;
}
if (!cirbuf_del_head_safe(&rdl->right)) {
- display_right_buffer(rdl);
+ display_right_buffer(rdl, 1);
}
break;
rdl->write_char(rdl, rdl->kill_buf[i]);
i++;
}
- display_right_buffer(rdl);
+ display_right_buffer(rdl, 0);
break;
#endif /* !NO_RDLINE_KILL_BUF */
cirbuf_align_left(&rdl->left);
rdl->left_buf[CIRBUF_GET_LEN(&rdl->left)] = '\0';
if (rdl->complete) {
- char tmp_buf[BUFSIZ];
+ char tmp_buf[CMDLINE_MAX_TOKEN_SIZE];
int complete_state;
int ret;
unsigned int tmp_size;
rdl->write_char(rdl, tmp_buf[i]);
i++;
}
- display_right_buffer(rdl);
+ display_right_buffer(rdl, 1);
return RDLINE_RES_COMPLETE; /* ?? */
}
#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);
}
break;
case CMDLINE_KEY_DOWN_ARR:
+ case CMDLINE_KEY_CTRL_N:
if (rdl->history_cur_line - 1 < 0)
break;
return RDLINE_RES_SUCCESS;
rdl->write_char(rdl, c);
- display_right_buffer(rdl);
+ display_right_buffer(rdl, 0);
return RDLINE_RES_SUCCESS;
}