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