From b2de129e3f48136bd56a5f0f1d9028c2ecef0bc2 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Fri, 11 Sep 2020 19:12:42 -0400 Subject: Copy style from wrapping point This fixes a bug when wrapping on a word with style changes inside it, where the copied style would be different depending on the width of the terminal. --- buffer.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/buffer.c b/buffer.c index 91fe6b4..6a7fe6e 100644 --- a/buffer.c +++ b/buffer.c @@ -111,6 +111,7 @@ static int flow(struct Lines *hard, int cols, const struct Line *soft) { int align = 0; char *wrap = NULL; struct Style style = StyleDefault; + struct Style wrapStyle = StyleDefault; for (char *str = line->str; *str;) { size_t len = styleParse(&style, (const char **)&str); if (!len) continue; @@ -138,15 +139,26 @@ static int flow(struct Lines *hard, int cols, const struct Line *soft) { width += wcwidth(wc); } - if (tab && width < cols) align = width; - if (iswspace(wc) && !tab) wrap = str; + if (tab && width < cols) { + align = width; + } + if (iswspace(wc) && !tab) { + wrap = str; + wrapStyle = style; + } + if (wc == L'-' && width <= cols) { + wrap = &str[n]; + wrapStyle = style; + } + if (width <= cols) { - if (wc == L'-') wrap = &str[n]; str += n; continue; + } else if (!wrap) { + wrap = str; + wrapStyle = style; } - if (!wrap) wrap = str; n = mbtowc(&wc, wrap, strlen(wrap)); if (n < 0) { n = 1; @@ -165,8 +177,9 @@ static int flow(struct Lines *hard, int cols, const struct Line *soft) { struct Cat cat = { line->str, cap, 0 }; catf(&cat, "%*s%n", align, "", &width); - styleCat(&cat, style); + styleCat(&cat, wrapStyle); str = &line->str[cat.len]; + style = wrapStyle; catf(&cat, "%s", &wrap[n]); *wrap = '\0'; -- cgit 1.4.1