diff options
| author | _ov4 <ov4@ov4.org> | 2026-09-22 02:34:45 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-09-22 02:34:45 +0000 |
| commit | 74e96589df2a77735410c5c03454a195d7efeecb (patch) | |
| tree | eb52d7eb08c8bbb47e28f8641e7f1c3cc21c4682 /src/line/mode.cc | |
| parent | ab02942670f37520833bc7dc8d0ff55d94eda7d7 (diff) | |
add cursor moving
Diffstat (limited to 'src/line/mode.cc')
| -rw-r--r-- | src/line/mode.cc | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/src/line/mode.cc b/src/line/mode.cc index 9eb54b1..3ddd067 100644 --- a/src/line/mode.cc +++ b/src/line/mode.cc @@ -77,24 +77,58 @@ string readline() } else if (iscntrl(c)) { - print("control: {}\r\n", static_cast<unsigned char>(c)); - fflush(stdout); + //print("control: {}\r\n", static_cast<unsigned char>(c)); + //fflush(stdout); if (c == 13) // \n { //print("line: {}\r\n", buffer); return buffer; } + + // ESC sequence + if (c == '\x1b') + { + char seq[10]; + // eat [ + if (read(STDIN_FILENO, seq + 0, 1) != 1) + continue; + + if (read(STDIN_FILENO, seq + 1, 1) != 1) + continue; + + switch (seq[1]) + { + case 'A': + print("\x1b[A"); + fflush(stdout); + cursor_row--; + break; + case 'B': + print("\x1b[B"); + fflush(stdout); + cursor_row++; + break; + case 'C': + print("\x1b[C"); + fflush(stdout); + cursor_col--; + break; + case 'D': + print("\x1b[D"); + fflush(stdout); + cursor_col++; + break; + default: + return "ERROR"; + } + } } + + // normal char else { buffer += c; print_override(buffer); - - // esc sequence - if (buffer.size() <= 2 && buffer[0] == '\x1b' && buffer[1] == '[') - { - ; - } } } return buffer; @@ -138,6 +172,7 @@ void print_override(const std::string &s) fflush(stdout); print("{}", s); fflush(stdout); + cursor_col = s.size()+1; } } |
