tvi: do not overwrite lines in input mode - neatvi - [fork] simple vi-type edit… | |
git clone git://src.adamsgaard.dk/neatvi | |
Log | |
Files | |
Refs | |
README | |
--- | |
commit 2b735a5576c57027328c3b46e8dadc626423b10e | |
parent 4f07e5004a8b33bdafd6dd436612ba97ff016df6 | |
Author: Ali Gholami Rudi <[email protected]> | |
Date: Tue, 9 Jun 2015 09:15:11 +0430 | |
vi: do not overwrite lines in input mode | |
Diffstat: | |
M led.c | 4 +++- | |
M term.c | 11 +++++++++++ | |
M vi.c | 12 ++++++++++++ | |
M vi.h | 1 + | |
4 files changed, 27 insertions(+), 1 deletion(-) | |
--- | |
diff --git a/led.c b/led.c | |
t@@ -169,11 +169,13 @@ static void led_printparts(char *ai, char *pref, char *m… | |
ren_pos(sbuf_buf(ln), off - 1) < 0 ? -1 : +1; | |
sbuf_cut(ln, len); | |
} | |
+ term_record(); | |
sbuf_str(ln, post); | |
led_print(sbuf_buf(ln), -1); | |
pos = ren_cursor(sbuf_buf(ln), ren_pos(sbuf_buf(ln), MAX(0, off - 1))); | |
term_pos(-1, led_pos(sbuf_buf(ln), pos + idir)); | |
sbuf_free(ln); | |
+ term_commit(); | |
} | |
char *led_read(char **kmap) | |
t@@ -299,10 +301,10 @@ char *led_input(char *pref, char *post, char *ai, int ai… | |
ai[ai_len] = '\0'; | |
} | |
pref = NULL; | |
- term_kill(); | |
free(ln); | |
if (key != '\n') | |
break; | |
+ term_room(1); | |
while (ai_max && post[0] && (post[0] == ' ' || post[0] == '\t'… | |
post++; | |
} | |
diff --git a/term.c b/term.c | |
t@@ -85,6 +85,17 @@ void term_kill(void) | |
term_out("\33[K"); | |
} | |
+void term_room(int n) | |
+{ | |
+ char cmd[16]; | |
+ if (n < 0) | |
+ sprintf(cmd, "\33[%dM", -n); | |
+ if (n > 0) | |
+ sprintf(cmd, "\33[%dL", n); | |
+ if (n) | |
+ term_out(cmd); | |
+} | |
+ | |
void term_pos(int r, int c) | |
{ | |
char buf[32] = "\r"; | |
diff --git a/vi.c b/vi.c | |
t@@ -28,6 +28,7 @@ static void vi_drawmsg(void) | |
vi_msg[0] = '\0'; | |
} | |
+/* redraw the screen */ | |
static void vi_draw(int xcol) | |
{ | |
int i; | |
t@@ -41,6 +42,15 @@ static void vi_draw(int xcol) | |
term_commit(); | |
} | |
+/* update the screen by removing lines r1 to r2 before an input command */ | |
+static void vi_drawrm(int r1, int r2, int newln) | |
+{ | |
+ r1 = MIN(MAX(r1, xtop), xtop + xrows); | |
+ r2 = MIN(MAX(r2, xtop), xtop + xrows); | |
+ term_pos(r1 - xtop, 0); | |
+ term_room(r1 - r2 + newln); | |
+} | |
+ | |
static int vi_buf[128]; | |
static int vi_buflen; | |
t@@ -600,6 +610,7 @@ static void vi_change(int r1, int o1, int r2, int o2, int … | |
free(region); | |
pref = lnmode ? vi_indents(lbuf_get(xb, r1)) : uc_sub(lbuf_get(xb, r1)… | |
post = lnmode ? uc_dup("\n") : uc_sub(lbuf_get(xb, r2), o2, -1); | |
+ vi_drawrm(r1, r2, 0); | |
rep = vi_input(pref, post, &row, &off); | |
if (rep) { | |
lbuf_rm(xb, r1, r2 + 1); | |
t@@ -759,6 +770,7 @@ static int vc_insert(int cmd) | |
off = xoff + 1; | |
pref = ln && cmd != 'o' && cmd != 'O' ? uc_sub(ln, 0, off) : vi_indent… | |
post = ln && cmd != 'o' && cmd != 'O' ? uc_sub(ln, off, -1) : uc_dup("… | |
+ vi_drawrm(xrow, xrow, cmd == 'o' || cmd == 'O'); | |
rep = vi_input(pref, post, &row, &off); | |
if ((cmd == 'o' || cmd == 'O') && !lbuf_len(xb)) | |
lbuf_put(xb, 0, "\n"); | |
diff --git a/vi.h b/vi.h | |
t@@ -110,6 +110,7 @@ void term_chr(int ch); | |
void term_pos(int r, int c); | |
void term_clear(void); | |
void term_kill(void); | |
+void term_room(int n); | |
int term_rows(void); | |
int term_cols(void); | |
int term_read(int timeout); |