vim-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.

ee09fcc9b6

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
Luuk van Baal 2023-05-24 20:13:11 +02:00
parent bff67c9fbe
commit ad7cded1f3
5 changed files with 37 additions and 9 deletions

View File

@ -1203,12 +1203,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool nochange,
draw_color_col = advance_color_col(VCOL_HLC, &color_cols);
}
if (wp->w_p_spell
&& !has_fold
&& !end_fill
&& *wp->w_s->b_p_spl != NUL
&& !GA_EMPTY(&wp->w_s->b_langp)
&& *(char **)(wp->w_s->b_langp.ga_data) != NULL) {
if (!has_fold && !end_fill && spell_check_window(wp)) {
// Prepare for spell checking.
has_spell = true;
extra_check = true;

View File

@ -53,6 +53,7 @@
#include "nvim/popupmenu.h"
#include "nvim/pos.h"
#include "nvim/search.h"
#include "nvim/spell.h"
#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/syntax.h"
@ -3394,6 +3395,14 @@ 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--;

View File

@ -1189,11 +1189,19 @@ bool spell_valid_case(int wordflags, int treeflags)
|| (wordflags & WF_ONECAP) != 0));
}
// Returns true if spell checking is not enabled.
/// Return true if spell checking is enabled for "wp".
bool 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.
bool no_spell_checking(win_T *wp)
{
if (!wp->w_p_spell || *wp->w_s->b_p_spl == NUL
|| GA_EMPTY(&wp->w_s->b_langp)) {
if (!wp->w_p_spell || *wp->w_s->b_p_spl == NUL || GA_EMPTY(&wp->w_s->b_langp)) {
emsg(_(e_no_spell));
return true;
}

View File

@ -103,6 +103,18 @@ describe("'spell'", function()
{0:~ }|
|
]])
-- After adding word missing Cap in next line is updated
feed('3GANot<Esc>')
screen:expect([[
This line has a {1:sepll} error. {2:and} missing caps and trailing spaces. |
{2:another} missing cap here. |
No^t |
and here. |
|
{2:and} here. |
{0:~ }|
|
]])
end)
it('extmarks, "noplainbuffer" and syntax #20385 #23398', function()

View File

@ -1014,6 +1014,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')