diff options
| -rw-r--r-- | include/line/cursor.h | 8 | ||||
| -rw-r--r-- | module-test/line_test.cc | 1 | ||||
| -rw-r--r-- | src/line/cursor.cc | 41 | ||||
| -rw-r--r-- | src/line/mode.cc | 2 |
4 files changed, 37 insertions, 15 deletions
diff --git a/include/line/cursor.h b/include/line/cursor.h index 39160dc..1641a28 100644 --- a/include/line/cursor.h +++ b/include/line/cursor.h @@ -13,10 +13,14 @@ struct T_position int col; }; +// 1-based inline int cursor_row; inline int cursor_col; - inline int line_end_pos; +inline int line_begin_pos; + +// 0-based index +inline int line_buffer_index; T_position get_cursor_position(); @@ -26,5 +30,7 @@ void move_cursor(char c); void cursor_input(char c, std::string &buffer); +int get_cursor_real_pos(); + } diff --git a/module-test/line_test.cc b/module-test/line_test.cc index e2784d9..874b5cf 100644 --- a/module-test/line_test.cc +++ b/module-test/line_test.cc @@ -23,6 +23,7 @@ using namespace ov4; int main() { + print("shell $ "); enable_raw(); T_position pos = get_cursor_position(); cursor_row = pos.row; diff --git a/src/line/cursor.cc b/src/line/cursor.cc index 9ff8bbc..9630d34 100644 --- a/src/line/cursor.cc +++ b/src/line/cursor.cc @@ -40,16 +40,24 @@ T_position get_cursor_position() } pos.row = row; pos.col = col; - print("row {}, col {}\r\n", row, col); - fflush(stdout); + // print("row {}, col {}\r\n", row, col); + // fflush(stdout); return pos; } void print_override(const std::string &s) { + print("\x1b[s"); fflush(stdout); - print("\r"); - fflush(stdout); + print("\r"); fflush(stdout); + + // move to the "start" of the zone + // should skip prompt zone + print("\x1b[{}C", line_begin_pos-1); fflush(stdout); + + // erase rest of it + print("\x1b[K"); fflush(stdout); + print("{}", s); fflush(stdout); //line_end_pos = s.size()+1; @@ -71,19 +79,19 @@ void move_cursor(char c) // cursor_row++; // break; case 'C': - if (cursor_col < line_end_pos) + if (get_cursor_real_pos() < line_end_pos) { print("\x1b[C"); fflush(stdout); - cursor_col++; + line_buffer_index++; } break; case 'D': - if (cursor_col > 1) + if (get_cursor_real_pos() > line_begin_pos) { print("\x1b[D"); fflush(stdout); - cursor_col--; + line_buffer_index--; } break; default: @@ -95,18 +103,23 @@ void cursor_input(char c, std::string &buffer) { if (c != '\b') { - buffer.insert(cursor_col-1, 1, c); + buffer.insert(line_buffer_index, 1, c); print("\x1b[C"); fflush(stdout); - cursor_col++; - line_end_pos = buffer.size()+1; + line_buffer_index++; + line_end_pos = line_begin_pos + buffer.size(); return; } // BACKSPACE - buffer.erase(cursor_col-1, 1); + buffer.erase(line_buffer_index, 1); print("\x1b[D"); fflush(stdout); - cursor_col--; - line_end_pos = buffer.size()+1; + line_buffer_index--; + line_end_pos = line_begin_pos + buffer.size(); +} + +int get_cursor_real_pos() +{ + return line_begin_pos + line_buffer_index; } } diff --git a/src/line/mode.cc b/src/line/mode.cc index 2ef470d..4122411 100644 --- a/src/line/mode.cc +++ b/src/line/mode.cc @@ -68,6 +68,8 @@ void clear_below() string readline() { + T_position pos = get_cursor_position(); + line_begin_pos = pos.col; string buffer; char c; while (read(STDIN_FILENO, &c, 1) == 1) |
