]> granicus.if.org Git - vim/commitdiff
patch 9.0.0590: after exiting Insert mode spelling not checked in next line v9.0.0590
authorBram Moolenaar <Bram@vim.org>
Sun, 25 Sep 2022 19:58:30 +0000 (20:58 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 25 Sep 2022 19:58:30 +0000 (20:58 +0100)
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.

src/drawline.c
src/edit.c
src/proto/spell.pro
src/spell.c
src/testdir/dumps/Test_spell_3.dump [new file with mode: 0644]
src/testdir/test_spell.vim
src/version.c

index 7e18ced3caa190843ab342d5f5577d135a3f20d5..5413347b770c23baeda40a67d7e39524004e4fd6 100644 (file)
@@ -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;
index 0b7896476a6eb2383ae45fd7ffdbdb04c62e78ba..ec3e8ff6c41fa5c6660fcbd8d04f35d36530437a 100644 (file)
@@ -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;
index 4a3e85b1429fe12ab60cb55a59b8afa9fcefb23b..55c8482cd971289850d811bf1247241e701c7b4e 100644 (file)
@@ -5,6 +5,7 @@ int can_compound(slang_T *slang, char_u *word, char_u *flags);
 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);
index 08f627d0a42890023d068792d831bec2ee21ec0d..628814fe6db3c705408e005e09dad8d3c1b69425 100644 (file)
@@ -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 (file)
index 0000000..8dcd045
--- /dev/null
@@ -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+0&#5fd7ff255|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+0&#5fd7ff255|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+0&#5fd7ff255|n|d| +0&#ffffff0|h|e|r|e|.| @65
+|~+0#4040ff13&| @73
+| +0#0000000&@56|3|,|3| @10|A|l@1| 
index 3ea9afff129c14a4b5e4ce401abb22b96ef07c9d..90c6d53ced3ec65291d535a4c892160ce1a8796b 100644 (file)
@@ -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\<Esc>")
+  call VerifyScreenDump(buf, 'Test_spell_3', {})
+
   " clean up
   call StopVimInTerminal(buf)
   call delete('XtestSpellCap')
index dedb6ccb260bb96be85bf5c574f7521eb8a56615..0d7dadaf7de5035fede4c948c2ffc895fa0ddade 100644 (file)
@@ -699,6 +699,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    590,
 /**/
     589,
 /**/