diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/buffer.c | 13 | ||||
| -rw-r--r-- | src/nvim/syntax.c | 14 | 
2 files changed, 18 insertions, 9 deletions
| diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 5678f518f5..d9ed9c6861 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -3361,7 +3361,6 @@ int build_stl_str_hl(    char_u      *usefmt = fmt;    const int save_must_redraw = must_redraw;    const int save_redr_type = curwin->w_redr_type; -  const int save_highlight_shcnaged = need_highlight_changed;    // When the format starts with "%!" then evaluate it as an expression and    // use the result as the actual format string. @@ -4425,12 +4424,12 @@ int build_stl_str_hl(      cur_tab_rec->def.func = NULL;    } -  // We do not want redrawing a stausline, ruler, title, etc. to trigger -  // another redraw, it may cause an endless loop.  This happens when a -  // statusline changes a highlight group. -  must_redraw = save_must_redraw; -  curwin->w_redr_type = save_redr_type; -  need_highlight_changed = save_highlight_shcnaged; +  // When inside update_screen we do not want redrawing a stausline, ruler, +  // title, etc. to trigger another redraw, it may cause an endless loop. +  if (updating_screen) { +    must_redraw = save_must_redraw; +    curwin->w_redr_type = save_redr_type; +  }    return width;  } diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index e3aa898bea..0d204b2f43 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -6467,6 +6467,7 @@ void do_highlight(const char *line, const bool forceit, const bool init)    int id;    int idx;    struct hl_group item_before; +  bool did_change = false;    bool dodefault = false;    bool doclear = false;    bool dolink = false; @@ -6839,6 +6840,7 @@ void do_highlight(const char *line, const bool forceit, const bool init)                *namep = NULL;                HL_TABLE()[idx].sg_rgb_fg = -1;              } +            did_change = true;            }          } @@ -6862,6 +6864,7 @@ void do_highlight(const char *line, const bool forceit, const bool init)                *namep = NULL;                HL_TABLE()[idx].sg_rgb_bg = -1;              } +            did_change = true;            }          } @@ -6885,6 +6888,7 @@ void do_highlight(const char *line, const bool forceit, const bool init)                *namep = NULL;                HL_TABLE()[idx].sg_rgb_sp = -1;              } +            did_change = true;            }          } @@ -6946,9 +6950,15 @@ void do_highlight(const char *line, const bool forceit, const bool init)    // Only call highlight_changed() once, after a sequence of highlight    // commands, and only if an attribute actually changed -  if (memcmp(&HL_TABLE()[idx], &item_before, sizeof(item_before)) != 0 +  if ((did_change +       || memcmp(&HL_TABLE()[idx], &item_before, sizeof(item_before)) != 0)        && !did_highlight_changed) { -    redraw_all_later(NOT_VALID); +    // Do not trigger a redraw when highlighting is changed while +    // redrawing.  This may happen when evaluating 'statusline' changes the +    // StatusLine group. +    if (!updating_screen) { +      redraw_all_later(NOT_VALID); +    }      need_highlight_changed = true;    }  } | 
