tvi: > and < commands - 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 4f52394ea85044002b49f0286219a30524cea4ab
(DIR) parent 09cb6ffbd817e3ad3b6755e3a59e7841ac2f009c
(HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
Date: Sat, 16 May 2015 09:25:50 +0430
vi: > and < commands
Diffstat:
M vi.c | 32 +++++++++++++++++++++++++++++--
1 file changed, 30 insertions(+), 2 deletions(-)
---
(DIR) diff --git a/vi.c b/vi.c
t@@ -717,7 +717,7 @@ static void vi_change(int r1, int c1, int r2, int c2, int lnmode, int closed)
free(post);
}
-static void vi_pipe(int r1, int c1, int r2, int c2, int lnmode, int closed)
+static void vi_pipe(int r1, int r2)
{
char *text;
char *rep;
t@@ -737,6 +737,30 @@ static void vi_pipe(int r1, int c1, int r2, int c2, int lnmode, int closed)
free(rep);
}
+static void vi_shift(int r1, int r2, int dir)
+{
+ struct sbuf *sb;
+ char *ln;
+ int i;
+ if (r2 < r1)
+ swap(&r1, &r2);
+ for (i = r1; i <= r2; i++) {
+ if (!(ln = lbuf_get(xb, i)))
+ continue;
+ sb = sbuf_make();
+ if (dir > 0)
+ sbuf_chr(sb, '\t');
+ else
+ ln = ln[0] == ' ' || ln[0] == '\t' ? ln + 1 : ln;
+ sbuf_str(sb, ln);
+ lbuf_rm(xb, i, i + 1);
+ lbuf_put(xb, i, sbuf_buf(sb));
+ sbuf_free(sb);
+ }
+ xrow = r1;
+ lbuf_postindents(xb, &xrow, &xcol);
+}
+
static int vc_motion(int cmd)
{
int r1 = xrow, r2 = xrow; /* region rows */
t@@ -769,7 +793,9 @@ static int vc_motion(int cmd)
if (cmd == 'c')
vi_change(r1, c1, r2, c2, lnmode, closed);
if (cmd == '!')
- vi_pipe(r1, c1, r2, c2, lnmode, closed);
+ vi_pipe(r1, r2);
+ if (cmd == '>' || cmd == '<')
+ vi_shift(r1, r2, cmd == '>' ? +1 : -1);
return 0;
}
t@@ -1039,6 +1065,8 @@ static void vi(void)
case 'd':
case 'y':
case '!':
+ case '>':
+ case '<':
if (!vc_motion(c))
redraw = 1;
break;