summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buffer.c23
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';