neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit ad7cded1f3f40912d962796d6965dac17ecb97f0
parent bff67c9fbe8c174dae8952a565a110930dc4fc58
Author: Luuk van Baal <luukvbaal@gmail.com>
Date:   Wed, 24 May 2023 20:13:11 +0200

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.

https://github.com/vim/vim/commit/ee09fcc9b6cf24e02899461809da9a5148208ea5

Co-authored-by: Bram Moolenaar <Bram@vim.org>

Diffstat:
Msrc/nvim/drawline.c | 7+------
Msrc/nvim/edit.c | 9+++++++++
Msrc/nvim/spell.c | 14+++++++++++---
Mtest/functional/ui/spell_spec.lua | 12++++++++++++
Mtest/old/testdir/test_spell.vim | 4++++
5 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c @@ -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; diff --git a/src/nvim/edit.c b/src/nvim/edit.c @@ -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--; diff --git a/src/nvim/spell.c b/src/nvim/spell.c @@ -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; } diff --git a/test/functional/ui/spell_spec.lua b/test/functional/ui/spell_spec.lua @@ -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() diff --git a/test/old/testdir/test_spell.vim b/test/old/testdir/test_spell.vim @@ -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')