diff options
Diffstat (limited to 'buffer.c')
-rw-r--r-- | buffer.c | 23 |
1 files 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'; |