# HG changeset patch # User Bram Moolenaar # Date 1664973004 -7200 # Node ID ea16b081493d103ed398beafe1e0f6fe1861a7df # Parent 3e426037fd19b4f4bb83f2f7173bf5de76a15515 patch 9.0.0664: bad redrawing with spell checking, using "C" and "$" in 'cpo' Commit: https://github.com/vim/vim/commit/f3ef026c9897f1d2e3fba47166a4771d507dae91 Author: Bram Moolenaar Date: Wed Oct 5 13:29:15 2022 +0100 patch 9.0.0664: bad redrawing with spell checking, using "C" and "$" in 'cpo' Problem: Bad redrawing with spell checking, using "C" and "$" in 'cpo'. Solution: Do not redraw the next line when "$" is in 'cpo'. (closes https://github.com/vim/vim/issues/11285) diff --git a/src/change.c b/src/change.c --- a/src/change.c +++ b/src/change.c @@ -713,7 +713,10 @@ changed_bytes(linenr_T lnum, colnr_T col // When text has been changed at the end of the 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) && lnum < curbuf->b_ml.ml_line_count) + // Don't do this when displaying '$' at the end of changed text. + if (spell_check_window(curwin) + && lnum < curbuf->b_ml.ml_line_count + && vim_strchr(p_cpo, CPO_DOLLAR) == NULL) redrawWinline(curwin, lnum + 1); #endif #ifdef FEAT_DIFF diff --git a/src/edit.c b/src/edit.c --- a/src/edit.c +++ b/src/edit.c @@ -1738,8 +1738,8 @@ edit_unputchar(void) } /* - * Called when p_dollar is set: display a '$' at the end of the changed text - * Only works when cursor is in the line that changes. + * Called when "$" is in 'cpoptions': display a '$' at the end of the changed + * text. Only works when cursor is in the line that changes. */ void display_dollar(colnr_T col_arg) diff --git a/src/testdir/dumps/Test_spell_compatible_1.dump b/src/testdir/dumps/Test_spell_compatible_1.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_spell_compatible_1.dump @@ -0,0 +1,8 @@ +|t+0fd7ff255|e|s|t| +0&#ffffff0|t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| >t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| +|t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t|$| @49 +@75 +|e+0fd7ff255|n|d| +0&#ffffff0@71 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|5|1| @9|A|l@1| diff --git a/src/testdir/dumps/Test_spell_compatible_2.dump b/src/testdir/dumps/Test_spell_compatible_2.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_spell_compatible_2.dump @@ -0,0 +1,8 @@ +|t+0fd7ff255|e|s|t| +0&#ffffff0|t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |x>e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| +|t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t| |t|e|s|t|$| @49 +@75 +|e+0fd7ff255|n|d| +0&#ffffff0@71 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|5|2| @9|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 @@ -956,13 +956,12 @@ func Test_spell_screendump() \ ]) set spell spelllang=en_nz END - call writefile(lines, 'XtestSpell') + call writefile(lines, 'XtestSpell', 'D') let buf = RunVimInTerminal('-S XtestSpell', {'rows': 8}) call VerifyScreenDump(buf, 'Test_spell_1', {}) " clean up call StopVimInTerminal(buf) - call delete('XtestSpell') endfunc func Test_spell_screendump_spellcap() @@ -979,7 +978,7 @@ func Test_spell_screendump_spellcap() \ ]) set spell spelllang=en END - call writefile(lines, 'XtestSpellCap') + call writefile(lines, 'XtestSpellCap', 'D') let buf = RunVimInTerminal('-S XtestSpellCap', {'rows': 8}) call VerifyScreenDump(buf, 'Test_spell_2', {}) @@ -997,7 +996,30 @@ func Test_spell_screendump_spellcap() " clean up call StopVimInTerminal(buf) - call delete('XtestSpellCap') +endfunc + +func Test_spell_compatible() + CheckScreendump + + let lines =<< trim END + call setline(1, [ + \ "test "->repeat(20), + \ "", + \ "end", + \ ]) + set spell cpo+=$ + END + call writefile(lines, 'XtestSpellComp', 'D') + let buf = RunVimInTerminal('-S XtestSpellComp', {'rows': 8}) + + call term_sendkeys(buf, "51|C") + call VerifyScreenDump(buf, 'Test_spell_compatible_1', {}) + + call term_sendkeys(buf, "x") + call VerifyScreenDump(buf, 'Test_spell_compatible_2', {}) + + " clean up + call StopVimInTerminal(buf) endfunc let g:test_data_aff1 = [ 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 */ /**/ + 664, +/**/ 663, /**/ 662,