diff --git a/nnn.c b/nnn.c index b1366994..fa4c177b 100644 --- a/nnn.c +++ b/nnn.c @@ -1213,35 +1213,30 @@ xreadline(char *fname, char *prompt) if ((r = get_wch(ch)) != ERR) { if (r == OK) { - if (*ch == KEY_ENTER || *ch == '\n' || *ch == '\r') - break; - - if (*ch == '\b') { + switch (*ch) { + case KEY_ENTER: //fallthrough + case '\n': //fallthrough + case '\r': + goto END; + case '\b': /* some old curses (e.g. rhel25) still send '\b' for backspace */ if (pos > 0) { memmove(buf + pos - 1, buf + pos, (len - pos) << 2); --len, --pos; - } + } //fallthrough + case '\t': /* TAB breaks cursor position, ignore it */ continue; - } - - if (*ch == CONTROL('L')) { + case CONTROL('L'): clearprompt(); printprompt(prompt); len = pos = 0; continue; - } - - if (*ch == CONTROL('A')) { + case CONTROL('A'): pos = 0; continue; - } - - if (*ch == CONTROL('E')) { + case CONTROL('E'): pos = len; continue; - } - - if (*ch == CONTROL('U')) { + case CONTROL('U'): clearprompt(); printprompt(prompt); memmove(buf, buf + pos, (len - pos) << 2); @@ -1254,10 +1249,6 @@ xreadline(char *fname, char *prompt) if (keyname(*ch)[0] == '^') continue; - /* TAB breaks cursor position, ignore it */ - if (*ch == '\t') - continue; - if (pos < NAME_MAX - 1) { memmove(buf + pos + 1, buf + pos, (len - pos) << 2); buf[pos] = *ch; @@ -1293,6 +1284,7 @@ xreadline(char *fname, char *prompt) } } +END: buf[len] = '\0'; if (old_curs != ERR) curs_set(old_curs);