diff options
author | Luuk van Baal <luukvbaal@gmail.com> | 2023-05-25 17:14:42 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-05-25 17:14:42 +0100 |
commit | 2ac6497f0ef186f0e3ba67d7f0a485bfb612bb08 (patch) | |
tree | 21d6369bb4620188ed97befa8e6afa952edbd92b /src/spell.c | |
parent | 1271572a35ae215fa023d97db9896c5745591024 (diff) |
patch 9.0.1578: SpellCap highlight not always updated when neededv9.0.1578
Problem: SpellCap highlight not always updated when needed.
Solution: Handle updating line below closed fold and other situations where
only part of the window is redrawn. (Luuk van Baal, closes #12428,
closes #12420)
Diffstat (limited to 'src/spell.c')
-rw-r--r-- | src/spell.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/src/spell.c b/src/spell.c index 071ac9c95b..db70fcf48a 100644 --- a/src/spell.c +++ b/src/spell.c @@ -1342,7 +1342,7 @@ spell_move_to( { // For spellbadword(): check if first word needs a capital. col = getwhitecols(line); - if (check_need_cap(lnum, col)) + if (check_need_cap(curwin, lnum, col)) capcol = col; // Need to get the line again, may have looked at the previous @@ -2815,24 +2815,20 @@ spell_casefold( /* * Check if the word at line "lnum" column "col" is required to start with a - * capital. This uses 'spellcapcheck' of the current buffer. + * capital. This uses 'spellcapcheck' of the buffer in window "wp". */ int -check_need_cap(linenr_T lnum, colnr_T col) +check_need_cap(win_T *wp, linenr_T lnum, colnr_T col) { + if (wp->w_s->b_cap_prog == NULL) + return FALSE; + int need_cap = FALSE; - char_u *line; + char_u *line = col ? ml_get_buf(wp->w_buffer, lnum, FALSE) : NULL; char_u *line_copy = NULL; - char_u *p; - colnr_T endcol; - regmatch_T regmatch; + colnr_T endcol = 0; - if (curwin->w_s->b_cap_prog == NULL) - return FALSE; - - line = ml_get_curline(); - endcol = 0; - if (getwhitecols(line) >= (int)col) + if (col == 0 || getwhitecols(line) >= col) { // At start of line, check if previous line is empty or sentence // ends there. @@ -2840,13 +2836,16 @@ check_need_cap(linenr_T lnum, colnr_T col) need_cap = TRUE; else { - line = ml_get(lnum - 1); + line = ml_get_buf(wp->w_buffer, lnum - 1, FALSE); if (*skipwhite(line) == NUL) need_cap = TRUE; else { // Append a space in place of the line break. line_copy = concat_str(line, (char_u *)" "); + if (line_copy == NULL) + return FALSE; + line = line_copy; endcol = (colnr_T)STRLEN(line); } @@ -2858,13 +2857,14 @@ check_need_cap(linenr_T lnum, colnr_T col) if (endcol > 0) { // Check if sentence ends before the bad word. - regmatch.regprog = curwin->w_s->b_cap_prog; + regmatch_T regmatch; + regmatch.regprog = wp->w_s->b_cap_prog; regmatch.rm_ic = FALSE; - p = line + endcol; + char_u *p = line + endcol; for (;;) { MB_PTR_BACK(line, p); - if (p == line || spell_iswordp_nmw(p, curwin)) + if (p == line || spell_iswordp_nmw(p, wp)) break; if (vim_regexec(®match, p, 0) && regmatch.endp[0] == line + endcol) @@ -2873,7 +2873,7 @@ check_need_cap(linenr_T lnum, colnr_T col) break; } } - curwin->w_s->b_cap_prog = regmatch.regprog; + wp->w_s->b_cap_prog = regmatch.regprog; } vim_free(line_copy); @@ -4340,7 +4340,7 @@ static int spell_expand_need_cap; void spell_expand_check_cap(colnr_T col) { - spell_expand_need_cap = check_need_cap(curwin->w_cursor.lnum, col); + spell_expand_need_cap = check_need_cap(curwin, curwin->w_cursor.lnum, col); } /* |