diff --git a/src/nvim/change.c b/src/nvim/change.c index f4969d0ca9..ebbb0d4db6 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -43,6 +43,7 @@ #include "nvim/plines.h" #include "nvim/pos.h" #include "nvim/search.h" +#include "nvim/spell.h" #include "nvim/state.h" #include "nvim/strings.h" #include "nvim/textformat.h" @@ -393,6 +394,12 @@ void changed_bytes(linenr_T lnum, colnr_T col) { changedOneline(curbuf, lnum); changed_common(lnum, col, lnum + 1, 0); + // 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) { + redrawWinline(curwin, lnum + 1); + } // notify any channels that are watching buf_updates_send_changes(curbuf, lnum, 1, 1); diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 612a1a1bda..c0f094453d 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -3395,14 +3395,6 @@ static bool ins_esc(long *count, int cmdchar, bool nomove) 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); - } - int temp = curwin->w_cursor.col; if (disabled_redraw) { RedrawingDisabled--; diff --git a/src/nvim/undo.c b/src/nvim/undo.c index 00a3922a5b..1eb73d85d7 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -120,6 +120,7 @@ #include "nvim/path.h" #include "nvim/pos.h" #include "nvim/sha256.h" +#include "nvim/spell.h" #include "nvim/state.h" #include "nvim/strings.h" #include "nvim/types.h" @@ -2372,6 +2373,12 @@ static void u_undoredo(int undo, bool do_buf_event) } changed_lines(top + 1, 0, bot, newsize - oldsize, do_buf_event); + // When text has been changed, 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) && bot <= curbuf->b_ml.ml_line_count) { + redrawWinline(curwin, bot); + } // Set the '[ mark. if (top + 1 < curbuf->b_op_start.lnum) { diff --git a/test/functional/ui/spell_spec.lua b/test/functional/ui/spell_spec.lua index 5cfb85e431..800043b169 100644 --- a/test/functional/ui/spell_spec.lua +++ b/test/functional/ui/spell_spec.lua @@ -115,6 +115,30 @@ describe("'spell'", function() {0:~ }| | ]]) + -- Deleting a full stop removes missing Cap in next line + feed('5Gddk$x') + screen:expect([[ + This line has a {1:sepll} error. {2:and} missing caps and trailing spaces. | + {2:another} missing cap here. | + Not | + and her^e | + and here. | + {0:~ }| + {0:~ }| + | + ]]) + -- Undo also updates the next line (go to command line to remove message) + feed('u:') + screen:expect([[ + This line has a {1:sepll} error. {2:and} missing caps and trailing spaces. | + {2:another} missing cap here. | + Not | + and here^. | + {2:and} here. | + {0:~ }| + {0:~ }| + | + ]]) end) it('extmarks, "noplainbuffer" and syntax #20385 #23398', function() diff --git a/test/old/testdir/test_spell.vim b/test/old/testdir/test_spell.vim index 15c47881a9..c959e199d9 100644 --- a/test/old/testdir/test_spell.vim +++ b/test/old/testdir/test_spell.vim @@ -1018,6 +1018,14 @@ func Test_spell_screendump_spellcap() call term_sendkeys(buf, "3GANot\") call VerifyScreenDump(buf, 'Test_spell_3', {}) + " Deleting a full stop removes missing Cap in next line + call term_sendkeys(buf, "5Gddk$x") + call VerifyScreenDump(buf, 'Test_spell_4', {}) + + " Undo also updates the next line (go to command line to remove message) + call term_sendkeys(buf, "u:\") + call VerifyScreenDump(buf, 'Test_spell_5', {}) + " clean up call StopVimInTerminal(buf) call delete('XtestSpellCap')