]> git.neil.brown.name Git - edlib.git/commitdiff
render-format: improvements for cursor positioning and movement.
authorNeilBrown <neil@brown.name>
Sat, 21 Nov 2015 04:45:02 +0000 (15:45 +1100)
committerNeilBrown <neil@brown.name>
Sat, 21 Nov 2015 04:50:22 +0000 (15:50 +1100)
Signed-off-by: NeilBrown <neil@brown.name>
doc-dir.c
render-format.c

index 221cf6d0a8f4ebf6b04c2708e45de542c5c6fe5b..99b6046cafd7da833a0a0aebcfed7e3ff0abfbfa 100644 (file)
--- a/doc-dir.c
+++ b/doc-dir.c
@@ -347,7 +347,7 @@ static char *dir_get_attr(struct doc *d, struct mark *m,
                if (strcmp(attr, "heading") == 0)
                        return "     Mtime       Owner  File Name";
                if (strcmp(attr, "line-format") == 0)
-                       return " <fg:red>%c</> %mtime:11 %owner:-8 <fg:blue>%+name</>\n";
+                       return " <fg:red>%c</> %mtime:11 %owner:-8 <fg:blue>%+name</>";
                if (strcmp(attr, "filename") == 0)
                        return dr->fname;
                return NULL;
index 23f6801098010d05ee65e25f64fe70d2be675642..5d792efd4b58c9974a79f706c9a119dd75c86e14 100644 (file)
@@ -34,7 +34,10 @@ DEF_CMD(render_line)
        int home;
        int field = 0;
 
-       ch = mark_next(d, m);
+       if (RPT_NUM(ci) < 0 &&
+           !mark_same(d, mark_of_point(*ci->pointp), m))
+               ci->numeric = NO_NUMERIC;
+       ch = doc_following(d, m);
        if (ch == WEOF) {
                ci->str = NULL;
                return 1;
@@ -44,10 +47,15 @@ DEF_CMD(render_line)
        if (!body)
                body = "%+name";
        n = body;
+       m->rpos = field - rf->home_field;
        while (*n) {
                char buf[40], *b, *val;
                int w, adjust, l;
 
+               if (RPT_NUM(ci) < 0 &&
+                   mark_of_point(*ci->pointp)->rpos == m->rpos)
+                       break;
+
                if (*n != '%' || n[1] == '%') {
                        buf_append(&ret, *n);
                        if (*n == '%')
@@ -55,10 +63,15 @@ DEF_CMD(render_line)
                        n += 1;
                        continue;
                }
+               field += 1;
+               m->rpos = field - rf->home_field;
+
+               if (ci->numeric != NO_NUMERIC && ci->numeric >= 0 &&
+                   ret.len >= ci->numeric)
+                       break;
                if (RPT_NUM(ci) < 0 &&
-                   mark_of_point(*ci->pointp)->rpos == field - rf->home_field)
+                   mark_of_point(*ci->pointp)->rpos == m->rpos)
                        break;
-               field += 1;
                n += 1;
                if (*n == '+') {
                        /* Home field */
@@ -79,7 +92,7 @@ DEF_CMD(render_line)
                        buf_append(&ret, ch);
                        continue;
                }
-               val = doc_attr(d, m, 0, buf);
+               val = doc_attr(d, m, 1, buf);
                if (!val)
                        val = "-";
                if (*n != ':') {
@@ -116,6 +129,16 @@ DEF_CMD(render_line)
        if (!*n) {
                rf->fields = field;
                rf->home_field = home;
+               m->rpos = field + 1 - rf->home_field;
+               if (RPT_NUM(ci) < 0 &&
+                   mark_of_point(*ci->pointp)->rpos == m->rpos)
+                       ;
+               else if (ci->numeric >= 0 && ci->numeric != NO_NUMERIC)
+                       ;
+               else {
+                       buf_append(&ret, '\n');
+                       mark_next(d, m);
+               }
        }
        ci->str = buf_final(&ret);
        return 1;
@@ -158,17 +181,23 @@ DEF_CMD(format_move_line)
 {
        struct point *pt = *ci->pointp;
        int rpt = RPT_NUM(ci);
+       struct rf_data *rf = ci->home->data;
 
        while (rpt > 1) {
                if (mark_next(pt->doc, ci->mark) == WEOF)
                        break;
                rpt -= 1;
        }
-       while (rpt < 0) {
+       while (rpt < -1) {
                if (mark_prev(pt->doc, ci->mark) == WEOF)
                        break;
                rpt += 1;
        }
+       if (rpt < 0)
+               ci->mark->rpos = -rf->home_field;
+       if (rpt > 0)
+               ci->mark->rpos = rf->fields + 1 - rf->home_field;
+
 
        return 1;
 }
@@ -185,7 +214,7 @@ DEF_CMD(format_move_horiz)
        if (rf->fields < 2)
                return 1;
        while (rpt > 0 && doc_following(pt->doc, ci->mark) != WEOF) {
-               if (ci->mark->rpos < rf->fields - rf->home_field)
+               if (ci->mark->rpos < rf->fields - rf->home_field + 1)
                        ci->mark->rpos += 1;
                else {
                        if (mark_next(pt->doc, ci->mark) == WEOF)
@@ -195,12 +224,12 @@ DEF_CMD(format_move_horiz)
                rpt -= 1;
        }
        while (rpt < 0) {
-               if (ci->mark->rpos > - rf->home_field)
+               if (ci->mark->rpos > -rf->home_field)
                        ci->mark->rpos -= 1;
                else {
                        if (mark_prev(pt->doc, ci->mark) == WEOF)
                                break;
-                       ci->mark->rpos = rf->fields - rf->home_field;
+                       ci->mark->rpos = rf->fields - rf->home_field + 1;
                }
                rpt += 1;
        }