tPlace cursor in active prompt - ve - a minimal text editor (work in progress) | |
git clone git://src.adamsgaard.dk/ve | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 6ee81f6740a010441cd11c915f941081c80cc9a3 | |
parent e19cbd3366fe14e6475845d5a686d2c938cf3b6b | |
Author: Anders Damsgaard <[email protected]> | |
Date: Tue, 6 Aug 2019 21:37:59 +0200 | |
Place cursor in active prompt | |
Diffstat: | |
M input.c | 5 ++++- | |
M output.c | 13 +++++++++++-- | |
M output.h | 1 + | |
3 files changed, 16 insertions(+), 3 deletions(-) | |
--- | |
diff --git a/input.c b/input.c | |
t@@ -1,6 +1,7 @@ | |
#include <unistd.h> | |
#include <stdlib.h> | |
#include <ctype.h> | |
+#include <string.h> | |
#include "te.h" | |
#include "terminal.h" | |
#include "edit.h" | |
t@@ -26,6 +27,8 @@ editor_prompt(char *prompt) | |
while (1) { | |
editor_set_status_message(prompt, buf); | |
editor_refresh_screen(); | |
+ editor_place_cursor(strlen(prompt) - 1 + strlen(buf), | |
+ E.screen_rows + 2); | |
c = editor_read_key(); | |
if (c == CTRL_KEY('h') || c == 127) { /* detect backspace */ | |
t@@ -41,7 +44,7 @@ editor_prompt(char *prompt) | |
return buf; | |
} | |
} else if (!iscntrl(c) && c < 128) { | |
- if (buflen == bufsize - 1) { | |
+ if (buflen >= bufsize - 1) { | |
bufsize *= 2; | |
buf = realloc(buf, bufsize); | |
} | |
diff --git a/output.c b/output.c | |
t@@ -166,10 +166,12 @@ editor_draw_rows(struct abuf *ab) | |
void | |
editor_refresh_screen() | |
{ | |
+ char buf[32]; | |
+ struct abuf ab = ABUF_INIT; | |
+ | |
show_status_message(); | |
editor_scroll(); | |
- struct abuf ab = ABUF_INIT; | |
ab_append(&ab, "\x1b[?25l", 6); /* hide cursor */ | |
ab_append(&ab, "\x1b[H", 3); /* cursor to home */ | |
t@@ -177,7 +179,6 @@ editor_refresh_screen() | |
editor_draw_status(&ab); | |
editor_draw_status_message(&ab); | |
- char buf[32]; | |
snprintf(buf, sizeof(buf), "\x1b[%d;%dH", | |
(E.cursor_y - E.row_offset)+1, | |
(E.cursor_rx - E.column_offset)+1); | |
t@@ -189,6 +190,14 @@ editor_refresh_screen() | |
ab_free(&ab); | |
} | |
+void | |
+editor_place_cursor(int cx, int cy) | |
+{ | |
+ char buf[128]; | |
+ snprintf(buf, sizeof(buf), "\x1b[%d;%dH", cy, cx); | |
+ write(STDOUT_FILENO, buf, strlen(buf)); | |
+} | |
+ | |
/* set status message text, uses same format as printf */ | |
void | |
editor_set_status_message(const char *fmt, ...) | |
diff --git a/output.h b/output.h | |
t@@ -9,5 +9,6 @@ struct abuf { | |
void editor_refresh_screen(); | |
void editor_set_status_message(const char *fmt, ...); | |
+void editor_place_cursor(int cx, int cy); | |
#endif |