Introduction
Introduction Statistics Contact Development Disclaimer Help
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 */
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.