Mercurial > vim
changeset 30509:087c42245022 v9.0.0590
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 <Bram@vim.org>
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.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 25 Sep 2022 22:00:04 +0200 |
parents | fa62c3eb4305 |
children | f044b2827fb8 |
files | src/drawline.c src/edit.c src/proto/spell.pro src/spell.c src/testdir/dumps/Test_spell_3.dump src/testdir/test_spell.vim src/version.c |
diffstat | 7 files changed, 40 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- 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;
--- 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;
--- 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);
--- 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; } /*
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|
--- 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\<Esc>") + call VerifyScreenDump(buf, 'Test_spell_3', {}) + " clean up call StopVimInTerminal(buf) call delete('XtestSpellCap')