# HG changeset patch # User Bram Moolenaar # Date 1664136004 -7200 # Node ID 087c42245022616c962777b43693f839ef3cc0bd # Parent fa62c3eb4305fdb7638d49933b773d3b218cb56d patch 9.0.0590: after exiting Insert mode spelling not checked in next line Commit: https://github.com/vim/vim/commit/ee09fcc9b6cf24e02899461809da9a5148208ea5 Author: Bram Moolenaar Date: Sun Sep 25 20:58:30 2022 +0100 patch 9.0.0590: after exiting Insert mode spelling not checked in next line Problem: After exiting Insert mode spelling is not checked in the next line. Solution: When spelling is enabled redraw the next line after exiting Insert mode in case the spell highlight needs updating. diff --git a/src/drawline.c b/src/drawline.c --- a/src/drawline.c +++ b/src/drawline.c @@ -1125,10 +1125,7 @@ win_line( #endif #ifdef FEAT_SPELL - if (wp->w_p_spell - && *wp->w_s->b_p_spl != NUL - && wp->w_s->b_langp.ga_len > 0 - && *(char **)(wp->w_s->b_langp.ga_data) != NULL) + if (spell_check_window(wp)) { // Prepare for spell checking. has_spell = TRUE; diff --git a/src/edit.c b/src/edit.c --- a/src/edit.c +++ b/src/edit.c @@ -3587,6 +3587,13 @@ ins_esc( #ifdef FEAT_SPELL check_spell_redraw(); + + // When text has been changed in this line, possibly the start of the next + // line may have SpellCap that should be removed or it needs to be + // displayed. Schedule the next line for redrawing just in case. + if (spell_check_window(curwin) + && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) + redrawWinline(curwin, curwin->w_cursor.lnum + 1); #endif temp = curwin->w_cursor.col; diff --git a/src/proto/spell.pro b/src/proto/spell.pro --- a/src/proto/spell.pro +++ b/src/proto/spell.pro @@ -5,6 +5,7 @@ int can_compound(slang_T *slang, char_u int match_compoundrule(slang_T *slang, char_u *compflags); int valid_word_prefix(int totprefcnt, int arridx, int flags, char_u *word, slang_T *slang, int cond_req); int spell_valid_case(int wordflags, int treeflags); +int spell_check_window(win_T *wp); int spell_move_to(win_T *wp, int dir, int allwords, int curline, hlf_T *attrp); void spell_cat_line(char_u *buf, char_u *line, int maxlen); char_u *spell_enc(void); diff --git a/src/spell.c b/src/spell.c --- a/src/spell.c +++ b/src/spell.c @@ -1238,18 +1238,27 @@ spell_valid_case( } /* - * Return TRUE if spell checking is not enabled. + * Return TRUE if spell checking is enabled for "wp". + */ + int +spell_check_window(win_T *wp) +{ + return wp->w_p_spell + && *wp->w_s->b_p_spl != NUL + && wp->w_s->b_langp.ga_len > 0 + && *(char **)(wp->w_s->b_langp.ga_data) != NULL; +} + +/* + * Return TRUE and give an error if spell checking is not enabled. */ static int no_spell_checking(win_T *wp) { - if (!wp->w_p_spell || *wp->w_s->b_p_spl == NUL - || wp->w_s->b_langp.ga_len == 0) - { - emsg(_(e_spell_checking_is_not_possible)); - return TRUE; - } - return FALSE; + if (spell_check_window(wp)) + return FALSE; + emsg(_(e_spell_checking_is_not_possible)); + return TRUE; } /* diff --git a/src/testdir/dumps/Test_spell_3.dump b/src/testdir/dumps/Test_spell_3.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_spell_3.dump @@ -0,0 +1,8 @@ +| +0&#ffffff0@2|T|h|i|s| |l|i|n|e| |h|a|s| |a| |s+0&#ffd7d7255|e|p|l@1| +0&#ffffff0|e|r@1|o|r|.| |a+0fd7ff255|n|d| +0&#ffffff0|m|i|s@1|i|n|g| |c|a|p|s| |a|n|d| |t|r|a|i|l|i|n|g| |s|p|a|c|e|s|.| @5 +|a+0fd7ff255|n|o|t|h|e|r| +0&#ffffff0|m|i|s@1|i|n|g| |c|a|p| |h|e|r|e|.| @49 +|N|o>t| @71 +|a|n|d| |h|e|r|e|.| @65 +@75 +|a+0fd7ff255|n|d| +0&#ffffff0|h|e|r|e|.| @65 +|~+0#4040ff13&| @73 +| +0#0000000&@56|3|,|3| @10|A|l@1| diff --git a/src/testdir/test_spell.vim b/src/testdir/test_spell.vim --- a/src/testdir/test_spell.vim +++ b/src/testdir/test_spell.vim @@ -983,6 +983,10 @@ func Test_spell_screendump_spellcap() let buf = RunVimInTerminal('-S XtestSpellCap', {'rows': 8}) call VerifyScreenDump(buf, 'Test_spell_2', {}) + " After adding word missing Cap in next line is updated + call term_sendkeys(buf, "3GANot\") + call VerifyScreenDump(buf, 'Test_spell_3', {}) + " clean up call StopVimInTerminal(buf) call delete('XtestSpellCap') diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -700,6 +700,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 590, +/**/ 589, /**/ 588,