tvi: join command - 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 1dc67eff887a162e76d774b367ab3648e5876e17
 (DIR) parent e73bb547ae0e1e53e3841978ea84b3f855d3c805
 (HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
       Date:   Thu,  7 May 2015 17:43:29 +0430
       
       vi: join command
       
       Diffstat:
         M vi.c                                |      45 +++++++++++++++++++++++++++++++
       
       1 file changed, 45 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/vi.c b/vi.c
       t@@ -515,6 +515,47 @@ static void vc_put(int cmd, int cnt)
        
        }
        
       +static int join_spaces(char *prev, char *next)
       +{
       +        int prevlen = strlen(prev);
       +        if (!prev[0])
       +                return 0;
       +        if (prev[prevlen - 1] == ' ' || next[0] == ')')
       +                return 0;
       +        return prev[prevlen - 1] == '.' ? 2 : 1;
       +}
       +
       +static void vc_join(int arg)
       +{
       +        struct sbuf *sb;
       +        int cnt = arg <= 1 ? 2 : arg;
       +        int beg = xrow;
       +        int end = xrow + cnt;
       +        int off = 0;
       +        int i;
       +        if (!lbuf_get(xb, beg) || !lbuf_get(xb, end - 1))
       +                return;
       +        sb = sbuf_make();
       +        for (i = beg; i < end; i++) {
       +                char *ln = lbuf_get(xb, i);
       +                char *lnend = strchr(ln, '\n');
       +                int spaces;
       +                if (i > beg)
       +                        while (ln[0] == ' ' || ln[0] == '\t')
       +                                ln++;
       +                spaces = i > beg ? join_spaces(sbuf_buf(sb), ln) : 0;
       +                off = uc_slen(sbuf_buf(sb));
       +                while (spaces--)
       +                        sbuf_chr(sb, ' ');
       +                sbuf_mem(sb, ln, lnend - ln);
       +        }
       +        sbuf_chr(sb, '\n');
       +        lbuf_rm(xb, beg, end);
       +        lbuf_put(xb, beg, sbuf_buf(sb));
       +        xcol = ren_pos(sbuf_buf(sb), off);
       +        sbuf_free(sb);
       +}
       +
        static void vi(void)
        {
                int mark;
       t@@ -587,6 +628,10 @@ static void vi(void)
                                        vc_insert(c);
                                        redraw = 1;
                                        break;
       +                        case 'J':
       +                                vc_join(pre1);
       +                                redraw = 1;
       +                                break;
                                case 'm':
                                        if ((mark = vi_read()) > 0 && isalpha(mark))
                                                lbuf_mark(xb, mark, xrow);