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);