tvi: autoindent - 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 259abea4a093f8b12def593c5851ebf7effa525f
 (DIR) parent 935b8d71369e450e05f330e50caf3594243a0439
 (HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
       Date:   Thu, 14 May 2015 18:54:03 +0430
       
       vi: autoindent
       
       Diffstat:
         M vi.c                                |      31 ++++++++++++++-----------------
       
       1 file changed, 14 insertions(+), 17 deletions(-)
       ---
 (DIR) diff --git a/vi.c b/vi.c
       t@@ -21,6 +21,7 @@ int xled = 1;                        /* use the line editor */
        int xdir = 'L';                        /* current direction context */
        int xvis;                        /* visual mode */
        int xquit;
       +int xautoindent = 1;
        static char vi_findlast[256];        /* the last searched keyword */
        static int vi_finddir;                /* the last search direction */
        static char vi_charlast[8];        /* the last character searched via f, t, F, or T */
       t@@ -103,21 +104,11 @@ static int lbuf_next(struct lbuf *lb, int *r, int *c, int dir)
                return 0;
        }
        
       -/* return a static buffer to the character at visual position c of line r */
       +/* return a pointer to the character at visual position c of line r */
        static char *lbuf_chr(struct lbuf *lb, int r, int c)
        {
       -        static char chr[8];
                char *ln = lbuf_get(lb, r);
       -        if (ln) {
       -                int off = ren_off(ln, c);
       -                char *s = uc_chr(ln, off);
       -                if (s) {
       -                        memcpy(chr, s, uc_len(s));
       -                        chr[uc_len(s)] = '\0';
       -                        return chr;
       -                }
       -        }
       -        return "";
       +        return ln ? uc_chr(ln, ren_off(ln, c)) : "";
        }
        
        static void lbuf_postindents(struct lbuf *lb, int *r, int *c)
       t@@ -615,6 +606,14 @@ static char *vi_input(char *pref, char *post, int *row, int *col)
                return sbuf_done(sb);
        }
        
       +static char *vi_indents(char *ln)
       +{
       +        struct sbuf *sb = sbuf_make();
       +        while (xautoindent && ln && (*ln == ' ' || *ln == '\t'))
       +                sbuf_chr(sb, *ln++);
       +        return sbuf_done(sb);
       +}
       +
        static void vi_change(int r1, int c1, int r2, int c2, int lnmode, int closed)
        {
                char *region;
       t@@ -626,7 +625,7 @@ static void vi_change(int r1, int c1, int r2, int c2, int lnmode, int closed)
                region = lbuf_region(xb, r1, lnmode ? 0 : l1, r2, lnmode ? -1 : l2);
                reg_put(0, region, lnmode);
                free(region);
       -        pref = lnmode ? uc_dup("") : uc_sub(lbuf_get(xb, r1), 0, l1);
       +        pref = lnmode ? vi_indents(lbuf_get(xb, r1)) : uc_sub(lbuf_get(xb, r1), 0, l1);
                post = lnmode ? uc_dup("\n") : uc_sub(lbuf_get(xb, r2), l2, -1);
                rep = vi_input(pref, post, &row, &col);
                if (rep) {
       t@@ -686,14 +685,12 @@ static void vc_insert(int cmd)
                }
                if (cmd == 'o')
                        xrow += 1;
       -        if (cmd == 'o' || cmd == 'O')
       -                ln = NULL;
                if (cmd == 'i' || cmd == 'I')
                        off = ln ? vi_insertionoffset(ln, xcol, 1) : 0;
                if (cmd == 'a' || cmd == 'A')
                        off = ln ? vi_insertionoffset(ln, xcol, 0) : 0;
       -        pref = ln ? uc_sub(ln, 0, off) : uc_dup("");
       -        post = ln ? uc_sub(ln, off, -1) : uc_dup("\n");
       +        pref = ln && cmd != 'o' && cmd != 'O' ? uc_sub(ln, 0, off) : vi_indents(ln);
       +        post = ln && cmd != 'o' && cmd != 'O' ? uc_sub(ln, off, -1) : uc_dup("\n");
                rep = vi_input(pref, post, &row, &col);
                if ((cmd == 'o' || cmd == 'O') && !lbuf_len(xb))
                        lbuf_put(xb, 0, "\n");