tvi: r command - neatvi - [fork] simple vi-type editor with UTF-8 support | |
git clone git://src.adamsgaard.dk/neatvi | |
Log | |
Files | |
Refs | |
README | |
--- | |
commit a64cb496ec7b0bed834969f1cf845e7d3c0b6d31 | |
parent 6ec7a51894148a1051971d3b7628094f70cf2c9e | |
Author: Ali Gholami Rudi <[email protected]> | |
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(-) | |
--- | |
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('… | |
- | |
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, … | |
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; | |
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) * (xro… | |
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); | |
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 */ |