tex: show a message after :e, :r, :w, or failed searches - neatvi - [fork] simple vi-type editor with UTF-8 support (HTM) git clone git://src.adamsgaard.dk/neatvi (DIR) Log (DIR) Files (DIR) Refs (DIR) README --- (DIR) commit 4135d145fd1d5329c1078e7c59693ab146d0ad39 (DIR) parent ec086911d042a074ad149289f4200c3248446096 (HTM) Author: Ali Gholami Rudi <ali@rudi.ir> Date: Sat, 16 May 2015 12:42:54 +0430 ex: show a message after :e, :r, :w, or failed searches Diffstat: M ex.c | 51 +++++++++---------------------- M vi.c | 57 ++++++++++++++++++++++++++----- M vi.h | 6 ++++-- 3 files changed, 68 insertions(+), 46 deletions(-) --- (DIR) diff --git a/ex.c b/ex.c t@@ -9,41 +9,6 @@ #define EXLEN 512 -/* read an input line; ex's input function */ -static char *ex_read(char *msg) -{ - struct sbuf *sb; - char c; - if (xled) { - char *s = led_prompt(msg, ""); - if (s) - printf("\n"); - return s; - } - sb = sbuf_make(); - while ((c = getchar()) != EOF) { - if (c == '\n') - break; - sbuf_chr(sb, c); - } - if (c == EOF) { - sbuf_free(sb); - return NULL; - } - return sbuf_done(sb); -} - -/* print an output line; ex's output function */ -static void ex_show(char *msg) -{ - if (xled) { - led_print(msg, -1); - term_chr('\n'); - } else { - printf("%s", msg); - } -} - /* read ex command location */ static char *ex_loc(char *s, char *loc) { t@@ -188,6 +153,7 @@ static void ec_quit(char *ec) static void ec_edit(char *ec) { + char msg[128]; char arg[EXLEN]; int fd; ex_arg(ec, arg); t@@ -214,6 +180,9 @@ static void ec_edit(char *ec) if (fd >= 0) { lbuf_rd(xb, fd, 0); close(fd); + snprintf(msg, sizeof(msg), "\"%s\" %d lines [r]\n", + xpath, lbuf_len(xb)); + ex_show(msg); } xrow = MAX(0, MIN(xrow, lbuf_len(xb) - 1)); lbuf_undofree(xb); t@@ -222,22 +191,29 @@ static void ec_edit(char *ec) static void ec_read(char *ec) { char arg[EXLEN], loc[EXLEN]; + char msg[128]; + char *path; int fd; int beg, end; int n = lbuf_len(xb); ex_arg(ec, arg); ex_loc(ec, loc); - fd = open(arg[0] ? arg : xpath, O_RDONLY); + path = arg[0] ? arg : xpath; + fd = open(path, O_RDONLY); if (fd >= 0 && !ex_region(loc, &beg, &end)) { lbuf_rd(xb, fd, lbuf_len(xb) ? end : 0); close(fd); xrow = end + lbuf_len(xb) - n; + snprintf(msg, sizeof(msg), "\"%s\" %d lines [r]\n", + path, lbuf_len(xb) - n); + ex_show(msg); } } static void ec_write(char *ec) { char cmd[EXLEN], arg[EXLEN], loc[EXLEN]; + char msg[128]; char *path; int beg, end; int fd; t@@ -255,6 +231,9 @@ static void ec_write(char *ec) if (fd >= 0) { lbuf_wr(xb, fd, beg, end); close(fd); + snprintf(msg, sizeof(msg), "\"%s\" %d lines [w]\n", + path, end - beg); + ex_show(msg); } if (!strcmp("wq", cmd)) ec_quit("wq"); (DIR) diff --git a/vi.c b/vi.c t@@ -14,6 +14,7 @@ char xpath[PATHLEN]; /* current file */ char xpath_alt[PATHLEN]; /* alternate file */ +char xmsg[512]; /* current message */ struct lbuf *xb; /* current buffer */ int xrow, xcol, xtop; /* current row, column, and top row */ int xrow_alt; /* alternate row, column, and top row */ t@@ -29,6 +30,12 @@ static int vi_charcmd; /* the character finding command */ static int vi_arg1, vi_arg2; /* the first and second arguments */ static int vi_ybuf; /* current yank buffer */ +static void vi_drawmsg(void) +{ + led_print(xmsg, xrows); + xmsg[0] = '\0'; +} + static void vi_draw(void) { int i; t@@ -37,7 +44,7 @@ static void vi_draw(void) char *s = lbuf_get(xb, i); led_print(s ? s : "~", i - xtop); } - led_print("", xrows); + vi_drawmsg(); term_pos(xrow, led_pos(lbuf_get(xb, i), xcol)); term_commit(); } t@@ -69,6 +76,38 @@ static char *vi_prompt(char *msg) return led_prompt(msg, ""); } +char *ex_read(char *msg) +{ + struct sbuf *sb; + char c; + if (xled) { + char *s = led_prompt(msg, ""); + if (s) + term_chr('\n'); + return s; + } + sb = sbuf_make(); + while ((c = getchar()) != EOF && c != '\n') + sbuf_chr(sb, c); + if (c == EOF) { + sbuf_free(sb); + return NULL; + } + return sbuf_done(sb); +} + +void ex_show(char *msg) +{ + if (xvis) { + snprintf(xmsg, sizeof(xmsg), "%s", msg); + } else if (xled) { + led_print(msg, -1); + term_chr('\n'); + } else { + printf("%s", msg); + } +} + static int vi_yankbuf(void) { int c = vi_read(); t@@ -233,6 +272,8 @@ static int vi_search(int cmd, int cnt, int *row, int *col) *row += atoi(off); } } + if (failed) + snprintf(xmsg, sizeof(xmsg), "\"%s\" not found\n", vi_findlast); return failed; } t@@ -920,12 +961,10 @@ static int vi_scrollbackward(int cnt) return 0; } -static void vi_status(void) +static void vc_status(void) { - char stat[128]; - sprintf(stat, "[%s] %d lines, %d,%d\n", - xpath[0] ? xpath : "unnamed", lbuf_len(xb), xrow + 1, xcol + 1); - led_print(stat, xrows); + snprintf(xmsg, sizeof(xmsg), "\"%s\" line %d of %d, col %d\n", + xpath[0] ? xpath : "unnamed", xrow + 1, lbuf_len(xb), xcol + 1); } static int vc_replace(void) t@@ -1029,7 +1068,7 @@ static void vi(void) redraw = 1; break; case TK_CTL('g'): - vi_status(); + vc_status(); break; case TK_CTL('^'): ex_command("e #"); t@@ -1116,7 +1155,7 @@ static void vi(void) break; case 'D': vi_back('$'); - if (vc_motion('d')) + if (!vc_motion('d')) redraw = 1; break; case 'r': t@@ -1150,6 +1189,8 @@ static void vi(void) } if (redraw) vi_draw(); + if (xmsg[0]) + vi_drawmsg(); term_pos(xrow - xtop, led_pos(lbuf_get(xb, xrow), ren_cursor(lbuf_get(xb, xrow), xcol))); lbuf_undomark(xb); (DIR) diff --git a/vi.h b/vi.h t@@ -1,7 +1,5 @@ /* neatvi main header */ -#define PATHLEN 512 - /* helper macros */ #define LEN(a) (sizeof(a) / sizeof((a)[0])) #define MIN(a, b) ((a) < (b) ? (a) : (b)) t@@ -118,11 +116,15 @@ int led_pos(char *s, int pos); /* ex commands */ void ex(void); void ex_command(char *cmd); +char *ex_read(char *msg); +void ex_show(char *msg); /* process management */ char *cmd_pipe(char *cmd, char *s); /* global variables */ +#define PATHLEN 512 + extern int xvis; extern struct lbuf *xb; extern int xrow;