tvi: r command - 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 a64cb496ec7b0bed834969f1cf845e7d3c0b6d31 (DIR) parent 6ec7a51894148a1051971d3b7628094f70cf2c9e (HTM) Author: Ali Gholami Rudi <ali@rudi.ir> Date: Thu, 14 May 2015 18:08:38 +0430 vi: r command Diffstat: M led.c | 8 +++----- M vi.c | 49 +++++++++++++++++++++++++++---- M vi.h | 1 + 3 files changed, 48 insertions(+), 10 deletions(-) --- (DIR) diff --git a/led.c b/led.c t@@ -5,8 +5,6 @@ #include "vi.h" #include "kmap.h" -#define TK_STOP(c) ((c) < 0 || (c) == TK_ESC || (c) == TK_CTL('c')) - static char **led_kmap = kmap_def; static char *keymap(char **kmap, int c) t@@ -150,11 +148,11 @@ static char *led_line(char *pref, char *post, int *key, char ***kmap) sbuf_cut(sb, led_lastword(sbuf_buf(sb))); break; default: - if (c == '\n' || TK_STOP(c)) + if (c == '\n' || TK_INT(c)) break; sbuf_str(sb, keymap(*kmap, c)); } - if (c == '\n' || TK_STOP(c)) + if (c == '\n' || TK_INT(c)) break; } *key = c; t@@ -193,7 +191,7 @@ char *led_input(char *pref, char *post) if (key != '\n') break; } - if (TK_STOP(key)) + if (TK_INT(key)) return sbuf_done(sb); sbuf_free(sb); return NULL; (DIR) diff --git a/vi.c b/vi.c t@@ -55,7 +55,8 @@ static void vi_back(int c) static char *vi_char(void) { - return led_keymap(vi_read()); + int key = vi_read(); + return TK_INT(key) ? NULL : led_keymap(key); } static int vi_prefix(void) t@@ -796,6 +797,40 @@ static void vi_status(void) led_print(stat, xrows); } +static int vc_replace(int arg) +{ + int cnt = MAX(1, arg); + char *cs = vi_char(); + char *ln = lbuf_get(xb, xrow); + struct sbuf *sb; + char *pref, *post; + char *s; + int off, i; + if (!ln || !cs) + return 1; + off = ren_off(ln, xcol); + s = uc_chr(ln, off); + for (i = 0; s[0] != '\n' && i < cnt; i++) + s = uc_next(s); + if (i < cnt) + return 1; + pref = uc_sub(ln, 0, off); + post = uc_sub(ln, off + cnt, -1); + sb = sbuf_make(); + sbuf_str(sb, pref); + for (i = 0; i < cnt; i++) + sbuf_str(sb, cs); + sbuf_str(sb, post); + lbuf_rm(xb, xrow, xrow + 1); + lbuf_put(xb, xrow, sbuf_buf(sb)); + off += cnt - 1; + xcol = ren_pos(sbuf_buf(sb), off); + sbuf_free(sb); + free(pref); + free(post); + return 0; +} + static void vi(void) { int mark; t@@ -829,10 +864,6 @@ static void vi(void) if (c <= 0) continue; switch (c) { - case 'u': - lbuf_undo(xb); - redraw = 1; - break; case TK_CTL('b'): if (vi_scrollbackward((pre1 ? pre1 : 1) * (xrows - 1))) break; t@@ -855,6 +886,10 @@ static void vi(void) break; redraw = 1; break; + case 'u': + lbuf_undo(xb); + redraw = 1; + break; case TK_CTL('r'): lbuf_redo(xb); redraw = 1; t@@ -947,6 +982,10 @@ static void vi(void) vc_motion('d', pre1); redraw = 1; break; + case 'r': + vc_replace(pre1); + redraw = 1; + break; case 's': vi_back(' '); vc_motion('c', pre1); (DIR) diff --git a/vi.h b/vi.h t@@ -105,6 +105,7 @@ void term_record(void); void term_commit(void); #define TK_CTL(x) ((x) & 037) +#define TK_INT(c) ((c) < 0 || (c) == TK_ESC || (c) == TK_CTL('c')) #define TK_ESC (TK_CTL('[')) /* line-oriented input and output */