tex: nested global 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 5ccea0f63de06e4c0da7daa1c29f85e27207b8a5
 (DIR) parent a17ced97054879718d841206a24ede5e1c7497c1
 (HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
       Date:   Tue, 27 Jun 2017 21:11:05 +0430
       
       ex: nested global commands
       
       Suggested and tested by Leah Neukirchen <leah@vuxu.org>.
       
       Diffstat:
         M ex.c                                |      11 +++++++----
         M lbuf.c                              |      15 +++++++++++----
         M vi.h                                |       3 ++-
       
       3 files changed, 20 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/ex.c b/ex.c
       t@@ -24,6 +24,7 @@ int xkmap_alt = 1;                /* the alternate keymap */
        static char xkwd[EXLEN];        /* the last searched keyword */
        static char xrep[EXLEN];        /* the last replacement */
        static int xkwddir;                /* the last search direction */
       +static int xgdep;                /* global command recursion depth */
        
        static struct buf {
                char ft[32];
       t@@ -795,7 +796,7 @@ static int ec_glob(char *ec)
                int i;
                ex_cmd(ec, cmd);
                ex_loc(ec, loc);
       -        if (!loc[0])
       +        if (!loc[0] && !xgdep)
                        strcpy(loc, "%");
                if (ex_region(loc, &beg, &end))
                        return 1;
       t@@ -809,8 +810,9 @@ static int ec_glob(char *ec)
                        return 1;
                if (!(re = rset_make(1, pats, xic ? RE_ICASE : 0)))
                        return 1;
       +        xgdep++;
                for (i = beg + 1; i < end; i++)
       -                lbuf_glob(xb, i, 1);
       +                lbuf_globset(xb, i, xgdep);
                i = beg;
                while (i < lbuf_len(xb)) {
                        char *ln = lbuf_get(xb, i);
       t@@ -820,11 +822,12 @@ static int ec_glob(char *ec)
                                        break;
                                i = MIN(i, xrow);
                        }
       -                while (i < lbuf_len(xb) && !lbuf_glob(xb, i, 0))
       +                while (i < lbuf_len(xb) && !lbuf_globget(xb, i, xgdep))
                                i++;
                }
                for (i = 0; i < lbuf_len(xb); i++)
       -                lbuf_glob(xb, i, 0);
       +                lbuf_globget(xb, i, xgdep);
       +        xgdep--;
                rset_free(re);
                return 0;
        }
 (DIR) diff --git a/lbuf.c b/lbuf.c
       t@@ -351,9 +351,16 @@ int lbuf_modified(struct lbuf *lb)
                return lbuf_seq(lb) != lb->useq_zero;
        }
        
       -int lbuf_glob(struct lbuf *lb, int pos, int v)
       +/* mark the line for ex global command */
       +void lbuf_globset(struct lbuf *lb, int pos, int dep)
        {
       -        int o = lb->ln_glob[pos];
       -        lb->ln_glob[pos] = v;
       -        return o;
       +        lb->ln_glob[pos] |= 1 << dep;
       +}
       +
       +/* return and clear ex global command mark */
       +int lbuf_globget(struct lbuf *lb, int pos, int dep)
       +{
       +        int o = lb->ln_glob[pos] & (1 << dep);
       +        lb->ln_glob[pos] &= ~(1 << dep);
       +        return o > 0;
        }
 (DIR) diff --git a/vi.h b/vi.h
       t@@ -22,7 +22,8 @@ int lbuf_modified(struct lbuf *lb);
        void lbuf_saved(struct lbuf *lb, int clear);
        int lbuf_indents(struct lbuf *lb, int r);
        int lbuf_eol(struct lbuf *lb, int r);
       -int lbuf_glob(struct lbuf *lb, int pos, int v);
       +void lbuf_globset(struct lbuf *lb, int pos, int dep);
       +int lbuf_globget(struct lbuf *lb, int pos, int dep);
        /* motions */
        int lbuf_findchar(struct lbuf *lb, char *cs, int cmd, int n, int *r, int *o);
        int lbuf_search(struct lbuf *lb, char *kw, int dir, int *r, int *o, int *len);