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 7344f210fcb3b51fa46f90f0ace3bbe126cb47b8
(DIR) parent 1211e16126a16bac24629d9810462a22a722e75c
(HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
Date: Tue, 12 May 2015 19:01:05 +0430
vi: ; and , commands
Diffstat:
M vi.c | 48 ++++++++++++++++++-------------
1 file changed, 28 insertions(+), 20 deletions(-)
---
(DIR) diff --git a/vi.c b/vi.c
t@@ -18,6 +18,8 @@ int xrow, xcol, xtop; /* current row, column, and top row */
int xled = 1; /* use the line editor */
int xdir = 'L'; /* current direction context */
int xquit;
+static char vi_charlast[8]; /* the last character searched via f, t, F, or T */
+static int vi_charcmd; /* the character finding command */
static void vi_draw(void)
{
t@@ -120,30 +122,23 @@ static void lbuf_postindents(struct lbuf *lb, int *r, int *c)
break;
}
-static void lbuf_findchar(struct lbuf *lb, int *row, int *col, char *cs, int dir, int n)
+static void lbuf_findchar(struct lbuf *lb, int *row, int *col, char *cs, int cmd, int n)
{
+ int dir = (cmd == 'f' || cmd == 't') ? +1 : -1;
int c = *col;
- if (!cs)
- return;
+ if (n < 0)
+ dir = -dir;
+ if (n < 0)
+ n = -n;
+ strcpy(vi_charlast, cs);
+ vi_charcmd = cmd;
while (n > 0 && !lbuf_lnnext(lb, row, &c, dir))
if (uc_code(lbuf_chr(lb, *row, c)) == uc_code(cs))
n--;
if (!n)
*col = c;
-}
-
-static void lbuf_tochar(struct lbuf *lb, int *row, int *col, char *cs, int dir, int n)
-{
- int c = *col;
- if (!cs)
- return;
- while (n > 0 && !lbuf_lnnext(lb, row, &c, dir))
- if (uc_code(lbuf_chr(lb, *row, c)) == uc_code(cs))
- n--;
- if (!n) {
- *col = c;
+ if (!n && (cmd == 't' || cmd == 'T'))
lbuf_lnnext(lb, row, col, -dir);
- }
}
static int vi_motionln(int *row, int cmd, int pre1, int pre2)
t@@ -261,6 +256,7 @@ static int vi_motion(int *row, int *col, int pre1, int pre2)
int pre = (pre1 ? pre1 : 1) * (pre2 ? pre2 : 1);
char *ln = lbuf_get(xb, *row);
int dir = dir_context(ln ? ln : "");
+ char *cs;
int i;
switch (c) {
case ' ':
t@@ -269,10 +265,20 @@ static int vi_motion(int *row, int *col, int pre1, int pre2)
break;
break;
case 'f':
- lbuf_findchar(xb, row, col, vi_char(), +1, pre);
+ if ((cs = vi_char()))
+ lbuf_findchar(xb, row, col, cs, c, pre);
break;
case 'F':
- lbuf_findchar(xb, row, col, vi_char(), -1, pre);
+ if ((cs = vi_char()))
+ lbuf_findchar(xb, row, col, cs, c, pre);
+ break;
+ case ';':
+ if (vi_charlast[0])
+ lbuf_findchar(xb, row, col, vi_charlast, vi_charcmd, pre);
+ break;
+ case ',':
+ if (vi_charlast[0])
+ lbuf_findchar(xb, row, col, vi_charlast, vi_charcmd, -pre);
break;
case 'h':
for (i = 0; i < pre; i++)
t@@ -285,10 +291,12 @@ static int vi_motion(int *row, int *col, int pre1, int pre2)
break;
break;
case 't':
- lbuf_tochar(xb, row, col, vi_char(), 1, pre);
+ if ((cs = vi_char()))
+ lbuf_findchar(xb, row, col, cs, c, pre);
break;
case 'T':
- lbuf_tochar(xb, row, col, vi_char(), 0, pre);
+ if ((cs = vi_char()))
+ lbuf_findchar(xb, row, col, cs, c, pre);
break;
case 'B':
for (i = 0; i < pre; i++)