tvi: ignore failed motions - 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 935b8d71369e450e05f330e50caf3594243a0439
(DIR) parent a64cb496ec7b0bed834969f1cf845e7d3c0b6d31
(HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
Date: Thu, 14 May 2015 18:17:12 +0430
vi: ignore failed motions
Diffstat:
M vi.c | 37 ++++++++++++++++++++++---------
1 file changed, 26 insertions(+), 11 deletions(-)
---
(DIR) diff --git a/vi.c b/vi.c
t@@ -128,7 +128,7 @@ 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 cmd, int n)
+static int 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;
t@@ -145,6 +145,7 @@ static void lbuf_findchar(struct lbuf *lb, int *row, int *col, char *cs, int cmd
*col = c;
if (!n && (cmd == 't' || cmd == 'T'))
lbuf_lnnext(lb, row, col, -dir);
+ return n != 0;
}
static int lbuf_search(struct lbuf *lb, char *kw, int dir, int *r, int *c, int *len)
t@@ -360,19 +361,23 @@ static int vi_motion(int *row, int *col, int pre1, int pre2)
break;
case 'f':
if ((cs = vi_char()))
- lbuf_findchar(xb, row, col, cs, mv, pre);
+ if (lbuf_findchar(xb, row, col, cs, mv, pre))
+ return -1;
break;
case 'F':
if ((cs = vi_char()))
- lbuf_findchar(xb, row, col, cs, mv, pre);
+ if (lbuf_findchar(xb, row, col, cs, mv, pre))
+ return -1;
break;
case ';':
if (vi_charlast[0])
- lbuf_findchar(xb, row, col, vi_charlast, vi_charcmd, pre);
+ if (lbuf_findchar(xb, row, col, vi_charlast, vi_charcmd, pre))
+ return -1;
break;
case ',':
if (vi_charlast[0])
- lbuf_findchar(xb, row, col, vi_charlast, vi_charcmd, -pre);
+ if (lbuf_findchar(xb, row, col, vi_charlast, vi_charcmd, -pre))
+ return -1;
break;
case 'h':
for (i = 0; i < pre; i++)
t@@ -386,11 +391,13 @@ static int vi_motion(int *row, int *col, int pre1, int pre2)
break;
case 't':
if ((cs = vi_char()))
- lbuf_findchar(xb, row, col, cs, mv, pre);
+ if (lbuf_findchar(xb, row, col, cs, mv, pre))
+ return -1;
break;
case 'T':
if ((cs = vi_char()))
- lbuf_findchar(xb, row, col, cs, mv, pre);
+ if (lbuf_findchar(xb, row, col, cs, mv, pre))
+ return -1;
break;
case 'B':
for (i = 0; i < pre; i++)
t@@ -436,16 +443,20 @@ static int vi_motion(int *row, int *col, int pre1, int pre2)
*col = pre - 1;
break;
case '/':
- vi_search(mv, pre, row, col);
+ if (vi_search(mv, pre, row, col))
+ return -1;
break;
case '?':
- vi_search(mv, pre, row, col);
+ if (vi_search(mv, pre, row, col))
+ return -1;
break;
case 'n':
- vi_search(mv, pre, row, col);
+ if (vi_search(mv, pre, row, col))
+ return -1;
break;
case 'N':
- vi_search(mv, pre, row, col);
+ if (vi_search(mv, pre, row, col))
+ return -1;
break;
case 127:
case TK_CTL('h'):
t@@ -644,6 +655,8 @@ static void vc_motion(int cmd, int pre1)
} else if (!(mv = vi_motion(&r2, &c2, pre1, pre2))) {
return;
}
+ if (mv < 0)
+ return;
if (!strchr("fFtTeE$", mv))
closed = 0;
lnmode = c2 < 0;
t@@ -849,6 +862,8 @@ static void vi(void)
if ((pre1 = vi_prefix()) < 0)
continue;
mv = vi_motion(&xrow, &xcol, pre1, 0);
+ if (mv < 0)
+ continue;
if (mv) {
if (strchr("\'GHML/?", mv))
lbuf_mark(xb, '\'', orow);