aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-09-23 11:57:31 +0000
committer_ov4 <ov4@ov4.org>2026-09-23 11:57:31 +0000
commit75270bdeaa993c3088667d5b3604fe9259bccadc (patch)
tree9bf74ba622fac472cdfea128e90e175cc23a20fc
parent4c585130e84869acaa2812a3546468af26773674 (diff)
add append input for non-empty line
-rw-r--r--include/line/cursor.h8
-rw-r--r--module-test/line_test.cc1
-rw-r--r--src/line/cursor.cc41
-rw-r--r--src/line/mode.cc2
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)