tvi: ^ motion - 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 0b878c42f286e746c004dbd23127ed0fda2bf553
 (DIR) parent 03dbd564421f1a855bba75c78b67687460e3b3f6
 (HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
       Date:   Sun,  3 May 2015 18:41:24 +0430
       
       vi: ^ motion
       
       Diffstat:
         M vi.c                                |      33 +++++++++++++++++++++++++------
       
       1 file changed, 27 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/vi.c b/vi.c
       t@@ -66,7 +66,7 @@ static int vi_prefix(void)
        static int lbuf_lnnext(struct lbuf *lb, int *r, int *c, int dir)
        {
                char *ln = lbuf_get(lb, *r);
       -        int col = ren_next(ln, *c, dir);
       +        int col = ln ? ren_next(ln, *c, dir) : -1;
                if (col < 0)
                        return -1;
                *c = col;
       t@@ -113,12 +113,28 @@ static char *lbuf_chr(struct lbuf *lb, int r, int c)
                return "";
        }
        
       +static int lbuf_indents(struct lbuf *lb, int r)
       +{
       +        char *ln = lbuf_get(lb, r);
       +        int n;
       +        char **chrs;
       +        int i = 0;
       +        if (!ln)
       +                return 0;
       +        chrs = uc_chop(ln ? ln : "", &n);
       +        while (i < n && chrs[i][0] != '\n' && uc_isspace(chrs[i]))
       +                i++;
       +        free(chrs);
       +        return i;
       +}
       +
        static void lbuf_postindents(struct lbuf *lb, int *r, int *c)
        {
       -        lbuf_eol(lb, r, c, -1);
       -        while (uc_isspace(lbuf_chr(lb, *r, *c)))
       -                if (lbuf_lnnext(lb, r, c, +1))
       -                        break;
       +        char *ln = lbuf_get(lb, *r);
       +        if (ln)
       +                *c = ren_pos(ln, lbuf_indents(lb, *r));
       +        else
       +                lbuf_eol(lb, r, c, -1);
        }
        
        static void lbuf_findchar(struct lbuf *lb, int *row, int *col, char *cs, int dir, int n)
       t@@ -329,6 +345,9 @@ static int vi_motion(int *row, int *col, int pre1, int pre2)
                case '0':
                        lbuf_eol(xb, row, col, -1);
                        break;
       +        case '^':
       +                lbuf_postindents(xb, row, col);
       +                break;
                case '$':
                        lbuf_eol(xb, row, col, +1);
                        lbuf_lnnext(xb, row, col, -1);
       t@@ -402,7 +421,7 @@ static void vc_motion(int c, int pre1)
                        lbuf_eol(xb, &r1, &c1, -1);
                        lbuf_eol(xb, &r2, &c2, +1);
                } else if ((mv = vi_motion(&r2, &c2, pre1, pre2))) {
       -                if (strchr("0bBhlwW ", mv))
       +                if (strchr("^0bBhlwW ", mv))
                                closed = 0;
                } else {
                        return;
       t@@ -516,6 +535,7 @@ static void vi(void)
                                case TERMCTRL('b'):
                                        xtop = MAX(0, xtop - xrows + 1);
                                        xrow = xtop + xrows - 1;
       +                                lbuf_postindents(xb, &xrow, &xcol);
                                        redraw = 1;
                                        break;
                                case TERMCTRL('f'):
       t@@ -524,6 +544,7 @@ static void vi(void)
                                        else
                                                xtop = 0;
                                        xrow = xtop;
       +                                lbuf_postindents(xb, &xrow, &xcol);
                                        redraw = 1;
                                        break;
                                case TERMCTRL('r'):