tvi: ^E and ^Y 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 1211e16126a16bac24629d9810462a22a722e75c
 (DIR) parent bc9dd7dfbc434e6260ca5002cbc6501ced9adcb6
 (HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
       Date:   Tue, 12 May 2015 18:11:27 +0430
       
       vi: ^E and ^Y commands
       
       Diffstat:
         M vi.c                                |      36 ++++++++++++++++++++++++++------
       
       1 file changed, 30 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/vi.c b/vi.c
       t@@ -611,6 +611,24 @@ static void vc_join(int arg)
                sbuf_free(sb);
        }
        
       +static int vi_scrollforeward(int cnt)
       +{
       +        if (xtop >= lbuf_len(xb) - 1)
       +                return 1;
       +        xtop = MIN(lbuf_len(xb) - 1, xtop + cnt);
       +        xrow = MAX(xrow, xtop);
       +        return 0;
       +}
       +
       +static int vi_scrollbackward(int cnt)
       +{
       +        if (xtop == 0)
       +                return 1;
       +        xtop = MAX(0, xtop - cnt);
       +        xrow = MIN(xrow, xtop + xrows - 1);
       +        return 0;
       +}
       +
        static void vi(void)
        {
                int mark;
       t@@ -643,21 +661,27 @@ static void vi(void)
                                        redraw = 1;
                                        break;
                                case TERMCTRL('b'):
       -                                if (xtop == 0)
       +                                if (vi_scrollbackward((pre1 ? pre1 : 1) * (xrows - 1)))
                                                break;
       -                                xtop = MAX(0, xtop - xrows + 1);
       -                                xrow = MIN(xrow, xtop + xrows - 1);
                                        lbuf_postindents(xb, &xrow, &xcol);
                                        redraw = 1;
                                        break;
                                case TERMCTRL('f'):
       -                                if (xtop >= lbuf_len(xb) - 1)
       +                                if (vi_scrollforeward((pre1 ? pre1 : 1) * (xrows - 1)))
                                                break;
       -                                xtop = MIN(lbuf_len(xb) - 1, xtop + xrows - 1);
       -                                xrow = MAX(xrow, xtop);
                                        lbuf_postindents(xb, &xrow, &xcol);
                                        redraw = 1;
                                        break;
       +                        case TERMCTRL('e'):
       +                                if (vi_scrollforeward((pre1 ? pre1 : 1)))
       +                                        break;
       +                                redraw = 1;
       +                                break;
       +                        case TERMCTRL('y'):
       +                                if (vi_scrollbackward((pre1 ? pre1 : 1)))
       +                                        break;
       +                                redraw = 1;
       +                                break;
                                case TERMCTRL('r'):
                                        lbuf_redo(xb);
                                        redraw = 1;