diff options
author | Luuk van Baal <luukvbaal@gmail.com> | 2023-05-24 19:50:01 +0200 |
---|---|---|
committer | Luuk van Baal <luukvbaal@gmail.com> | 2023-05-25 01:13:47 +0200 |
commit | bff67c9fbe8c174dae8952a565a110930dc4fc58 (patch) | |
tree | 81fc21ff55ea16ab5ca4dbb2b7c0a1124472a2b1 | |
parent | 678548a2b44601db73cc7d049467abd2b433baae (diff) | |
download | rneovim-bff67c9fbe8c174dae8952a565a110930dc4fc58.tar.gz rneovim-bff67c9fbe8c174dae8952a565a110930dc4fc58.tar.bz2 rneovim-bff67c9fbe8c174dae8952a565a110930dc4fc58.zip |
vim-patch:9.0.0175: spell checking for capital not working with trailing space
Problem: Spell checking for capital not working with trailing space.
Solution: Do not calculate cap_col at the end of the line. (Christian
Brabandt, closes vim/vim#10870, issue vim/vim#10838)
https://github.com/vim/vim/commit/afa23d1b99692e3c726eb694933ab348b442a1e4
Co-authored-by: Christian Brabandt <cb@256bit.org>
-rw-r--r-- | src/nvim/drawline.c | 11 | ||||
-rw-r--r-- | test/functional/ui/spell_spec.lua | 83 | ||||
-rw-r--r-- | test/old/testdir/test_spell.vim | 23 |
3 files changed, 84 insertions, 33 deletions
diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c index 927b1247be..a49b2ac6d6 100644 --- a/src/nvim/drawline.c +++ b/src/nvim/drawline.c @@ -2188,12 +2188,13 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool nochange, v = (ptr - line); if (has_spell && v >= word_end && v > cur_checked_col) { spell_attr = 0; - if (c != 0 && ((!has_syntax && !no_plain_buffer) || can_spell)) { - char *prev_ptr; + char *prev_ptr = ptr - mb_l; + // do not calculate cap_col at the end of the line or when + // only white space is following + if (c != 0 && (*skipwhite(prev_ptr) != NUL) + && ((!has_syntax && !no_plain_buffer) || can_spell)) { char *p; - int len; hlf_T spell_hlf = HLF_COUNT; - prev_ptr = ptr - mb_l; v -= mb_l - 1; // Use nextline[] if possible, it has the start of the @@ -2206,7 +2207,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool nochange, cap_col -= (int)(prev_ptr - line); size_t tmplen = spell_check(wp, p, &spell_hlf, &cap_col, nochange); assert(tmplen <= INT_MAX); - len = (int)tmplen; + int len = (int)tmplen; word_end = (int)v + len; // In Insert mode only highlight a word that diff --git a/test/functional/ui/spell_spec.lua b/test/functional/ui/spell_spec.lua index 0f553d4a9b..c5c4ec3b99 100644 --- a/test/functional/ui/spell_spec.lua +++ b/test/functional/ui/spell_spec.lua @@ -3,9 +3,9 @@ local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') local clear = helpers.clear +local exec = helpers.exec local feed = helpers.feed local insert = helpers.insert -local command = helpers.command local meths = helpers.meths local curbufmeths = helpers.curbufmeths local is_os = helpers.is_os @@ -32,7 +32,7 @@ describe("'spell'", function() it('joins long lines #7937', function() if is_os('openbsd') then pending('FIXME #12104', function() end) return end - command('set spell') + exec('set spell') insert([[ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, @@ -57,31 +57,58 @@ describe("'spell'", function() -- oldtest: Test_spell_screendump() it('has correct highlight at start of line', function() - insert([[ - "This is some text without any spell errors. Everything", - "should just be black, nothing wrong here.", - "", - "This line has a sepll error. and missing caps.", - "And and this is the the duplication.", - "with missing caps here.", + exec([=[ + call setline(1, [ + \"This is some text without any spell errors. Everything", + \"should just be black, nothing wrong here.", + \"", + \"This line has a sepll error. and missing caps.", + \"And and this is the the duplication.", + \"with missing caps here.", + \]) + set spell spelllang=en_nz + ]=]) + screen:expect([[ + ^This is some text without any spell errors. Everything | + should just be black, nothing wrong here. | + | + This line has a {1:sepll} error. {2:and} missing caps. | + {1:And and} this is {1:the the} duplication. | + {2:with} missing caps here. | + {0:~ }| + | ]]) - command('set spell spelllang=en_nz') + end) + + -- oldtest: Test_spell_screendump_spellcap() + it('has correct highlight at start of line with trailing space', function() + exec([=[ + call setline(1, [ + \" This line has a sepll error. and missing caps and trailing spaces. ", + \"another missing cap here.", + \"", + \"and here.", + \" ", + \"and here." + \]) + set spell spelllang=en + ]=]) screen:expect([[ - "This is some text without any spell errors. Everything", | - "should just be black, nothing wrong here.", | - "", | - "This line has a {1:sepll} error. {2:and} missing caps.", | - "{1:And and} this is {1:the the} duplication.", | - "with missing caps here.", | - ^ | - | + ^ This line has a {1:sepll} error. {2:and} missing caps and trailing spaces. | + {2:another} missing cap here. | + | + {2:and} here. | + | + {2:and} here. | + {0:~ }| + | ]]) end) it('extmarks, "noplainbuffer" and syntax #20385 #23398', function() - command('set filetype=c') - command('syntax on') - command('set spell') + exec('set filetype=c') + exec('syntax on') + exec('set spell') insert([[ #include <stdbool.h> bool func(void); @@ -119,7 +146,7 @@ describe("'spell'", function() {0:~ }| {6:search hit BOTTOM, continuing at TOP} | ]]) - command('echo ""') + exec('echo ""') local ns = meths.create_namespace("spell") -- extmark with spell=true enables spell local id = curbufmeths.set_extmark(ns, 1, 4, { end_row = 1, end_col = 10, spell = true }) @@ -168,7 +195,7 @@ describe("'spell'", function() {0:~ }| {6:search hit TOP, continuing at BOTTOM} | ]]) - command('echo ""') + exec('echo ""') curbufmeths.del_extmark(ns, id) screen:expect([[ {3:#include }{4:<stdbool.h>} | @@ -192,7 +219,7 @@ describe("'spell'", function() | ]]) -- "noplainbuffer" shouldn't change spellchecking behavior with syntax enabled - command('set spelloptions+=noplainbuffer') + exec('set spelloptions+=noplainbuffer') screen:expect_unchanged() feed('[s') screen:expect([[ @@ -206,7 +233,7 @@ describe("'spell'", function() | ]]) -- no spellchecking with "noplainbuffer" and syntax disabled - command('syntax off') + exec('syntax off') screen:expect([[ #include <stdbool.h> | bool func(void); | @@ -228,9 +255,9 @@ describe("'spell'", function() {0:~ }| {6:search hit BOTTOM, continuing at TOP} | ]]) - command('echo ""') + exec('echo ""') -- everything is spellchecked without "noplainbuffer" with syntax disabled - command('set spelloptions&') + exec('set spelloptions&') screen:expect([[ #include <{1:stdbool}.h> | {1:bool} {1:func}(void); | @@ -256,7 +283,7 @@ describe("'spell'", function() it('and syntax does not clear extmark highlighting at the start of a word', function() screen:try_resize(43, 3) - command([[ + exec([[ set spell syntax match Constant "^.*$" call setline(1, "This is some text without any spell errors.") diff --git a/test/old/testdir/test_spell.vim b/test/old/testdir/test_spell.vim index c840e834b9..1d122d7726 100644 --- a/test/old/testdir/test_spell.vim +++ b/test/old/testdir/test_spell.vim @@ -996,6 +996,29 @@ func Test_spell_screendump() call delete('XtestSpell') endfunc +func Test_spell_screendump_spellcap() + CheckScreendump + + let lines =<< trim END + call setline(1, [ + \ " This line has a sepll error. and missing caps and trailing spaces. ", + \ "another missing cap here.", + \ "", + \ "and here.", + \ " ", + \ "and here." + \ ]) + set spell spelllang=en + END + call writefile(lines, 'XtestSpellCap') + let buf = RunVimInTerminal('-S XtestSpellCap', {'rows': 8}) + call VerifyScreenDump(buf, 'Test_spell_2', {}) + + " clean up + call StopVimInTerminal(buf) + call delete('XtestSpellCap') +endfunc + let g:test_data_aff1 = [ \"SET ISO8859-1", \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ", |