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)

afa23d1b99

Co-authored-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Luuk van Baal 2023-05-24 19:50:01 +02:00
parent 678548a2b4
commit bff67c9fbe
3 changed files with 85 additions and 34 deletions

View File

@ -2188,12 +2188,13 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool nochange,
v = (ptr - line); v = (ptr - line);
if (has_spell && v >= word_end && v > cur_checked_col) { if (has_spell && v >= word_end && v > cur_checked_col) {
spell_attr = 0; spell_attr = 0;
if (c != 0 && ((!has_syntax && !no_plain_buffer) || can_spell)) { char *prev_ptr = ptr - mb_l;
char *prev_ptr; // 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; char *p;
int len;
hlf_T spell_hlf = HLF_COUNT; hlf_T spell_hlf = HLF_COUNT;
prev_ptr = ptr - mb_l;
v -= mb_l - 1; v -= mb_l - 1;
// Use nextline[] if possible, it has the start of the // 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); cap_col -= (int)(prev_ptr - line);
size_t tmplen = spell_check(wp, p, &spell_hlf, &cap_col, nochange); size_t tmplen = spell_check(wp, p, &spell_hlf, &cap_col, nochange);
assert(tmplen <= INT_MAX); assert(tmplen <= INT_MAX);
len = (int)tmplen; int len = (int)tmplen;
word_end = (int)v + len; word_end = (int)v + len;
// In Insert mode only highlight a word that // In Insert mode only highlight a word that

View File

@ -3,9 +3,9 @@
local helpers = require('test.functional.helpers')(after_each) local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen') local Screen = require('test.functional.ui.screen')
local clear = helpers.clear local clear = helpers.clear
local exec = helpers.exec
local feed = helpers.feed local feed = helpers.feed
local insert = helpers.insert local insert = helpers.insert
local command = helpers.command
local meths = helpers.meths local meths = helpers.meths
local curbufmeths = helpers.curbufmeths local curbufmeths = helpers.curbufmeths
local is_os = helpers.is_os local is_os = helpers.is_os
@ -32,7 +32,7 @@ describe("'spell'", function()
it('joins long lines #7937', function() it('joins long lines #7937', function()
if is_os('openbsd') then pending('FIXME #12104', function() end) return end if is_os('openbsd') then pending('FIXME #12104', function() end) return end
command('set spell') exec('set spell')
insert([[ insert([[
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
@ -57,31 +57,58 @@ describe("'spell'", function()
-- oldtest: Test_spell_screendump() -- oldtest: Test_spell_screendump()
it('has correct highlight at start of line', function() it('has correct highlight at start of line', function()
insert([[ exec([=[
"This is some text without any spell errors. Everything", call setline(1, [
"should just be black, nothing wrong here.", \"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.", \"This line has a sepll error. and missing caps.",
"with missing caps here.", \"And and this is the the duplication.",
]]) \"with missing caps here.",
command('set spell spelllang=en_nz') \])
set spell spelllang=en_nz
]=])
screen:expect([[ screen:expect([[
"This is some text without any spell errors. Everything", | ^This is some text without any spell errors. Everything |
"should just be black, nothing wrong here.", | should just be black, nothing wrong here. |
"", | |
"This line has a {1:sepll} error. {2:and} missing caps.", | This line has a {1:sepll} error. {2:and} missing caps. |
"{1:And and} this is {1:the the} duplication.", | {1:And and} this is {1:the the} duplication. |
"with missing caps here.", | {2:with} missing caps here. |
^ | {0:~ }|
| |
]])
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 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) end)
it('extmarks, "noplainbuffer" and syntax #20385 #23398', function() it('extmarks, "noplainbuffer" and syntax #20385 #23398', function()
command('set filetype=c') exec('set filetype=c')
command('syntax on') exec('syntax on')
command('set spell') exec('set spell')
insert([[ insert([[
#include <stdbool.h> #include <stdbool.h>
bool func(void); bool func(void);
@ -119,7 +146,7 @@ describe("'spell'", function()
{0:~ }| {0:~ }|
{6:search hit BOTTOM, continuing at TOP} | {6:search hit BOTTOM, continuing at TOP} |
]]) ]])
command('echo ""') exec('echo ""')
local ns = meths.create_namespace("spell") local ns = meths.create_namespace("spell")
-- extmark with spell=true enables spell -- extmark with spell=true enables spell
local id = curbufmeths.set_extmark(ns, 1, 4, { end_row = 1, end_col = 10, spell = true }) local id = curbufmeths.set_extmark(ns, 1, 4, { end_row = 1, end_col = 10, spell = true })
@ -168,7 +195,7 @@ describe("'spell'", function()
{0:~ }| {0:~ }|
{6:search hit TOP, continuing at BOTTOM} | {6:search hit TOP, continuing at BOTTOM} |
]]) ]])
command('echo ""') exec('echo ""')
curbufmeths.del_extmark(ns, id) curbufmeths.del_extmark(ns, id)
screen:expect([[ screen:expect([[
{3:#include }{4:<stdbool.h>} | {3:#include }{4:<stdbool.h>} |
@ -192,7 +219,7 @@ describe("'spell'", function()
| |
]]) ]])
-- "noplainbuffer" shouldn't change spellchecking behavior with syntax enabled -- "noplainbuffer" shouldn't change spellchecking behavior with syntax enabled
command('set spelloptions+=noplainbuffer') exec('set spelloptions+=noplainbuffer')
screen:expect_unchanged() screen:expect_unchanged()
feed('[s') feed('[s')
screen:expect([[ screen:expect([[
@ -206,7 +233,7 @@ describe("'spell'", function()
| |
]]) ]])
-- no spellchecking with "noplainbuffer" and syntax disabled -- no spellchecking with "noplainbuffer" and syntax disabled
command('syntax off') exec('syntax off')
screen:expect([[ screen:expect([[
#include <stdbool.h> | #include <stdbool.h> |
bool func(void); | bool func(void); |
@ -228,9 +255,9 @@ describe("'spell'", function()
{0:~ }| {0:~ }|
{6:search hit BOTTOM, continuing at TOP} | {6:search hit BOTTOM, continuing at TOP} |
]]) ]])
command('echo ""') exec('echo ""')
-- everything is spellchecked without "noplainbuffer" with syntax disabled -- everything is spellchecked without "noplainbuffer" with syntax disabled
command('set spelloptions&') exec('set spelloptions&')
screen:expect([[ screen:expect([[
#include <{1:stdbool}.h> | #include <{1:stdbool}.h> |
{1:bool} {1:func}(void); | {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() it('and syntax does not clear extmark highlighting at the start of a word', function()
screen:try_resize(43, 3) screen:try_resize(43, 3)
command([[ exec([[
set spell set spell
syntax match Constant "^.*$" syntax match Constant "^.*$"
call setline(1, "This is some text without any spell errors.") call setline(1, "This is some text without any spell errors.")

View File

@ -996,6 +996,29 @@ func Test_spell_screendump()
call delete('XtestSpell') call delete('XtestSpell')
endfunc 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 = [ let g:test_data_aff1 = [
\"SET ISO8859-1", \"SET ISO8859-1",
\"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ", \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ",