summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2022-05-13 12:41:50 +0100
committerBram Moolenaar <Bram@vim.org>2022-05-13 12:41:50 +0100
commitb7a701255578b38896631ba20556b856e8888069 (patch)
tree9e141e86d3ce935dd5ef081f40639669d5d8b188
parent7f8a3b11bfc02f24dfd877d0a81392d679008180 (diff)
patch 8.2.4947: text properties not adjusted when accepting spell suggestionv8.2.4947
Problem: Text properties not adjusted when accepting spell suggestion. Solution: Adjust text properties when text changes. (closes #10414)
-rw-r--r--src/spell.c3
-rw-r--r--src/spellsuggest.c5
-rw-r--r--src/testdir/test_textprop.vim45
-rw-r--r--src/version.c2
4 files changed, 55 insertions, 0 deletions
diff --git a/src/spell.c b/src/spell.c
index 0c1890472a..e5c2f7d1f4 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -2913,6 +2913,9 @@ ex_spellrepall(exarg_T *eap UNUSED)
STRCAT(p, line + curwin->w_cursor.col + STRLEN(repl_from));
ml_replace(curwin->w_cursor.lnum, p, FALSE);
changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col);
+ if (curbuf->b_has_textprop && addlen != 0)
+ adjust_prop_columns(curwin->w_cursor.lnum,
+ curwin->w_cursor.col, addlen, APC_SUBSTITUTE);
if (curwin->w_cursor.lnum != prev_lnum)
{
diff --git a/src/spellsuggest.c b/src/spellsuggest.c
index ecb54550d6..4a71438818 100644
--- a/src/spellsuggest.c
+++ b/src/spellsuggest.c
@@ -681,6 +681,8 @@ spell_suggest(int count)
p = alloc(STRLEN(line) - stp->st_orglen + stp->st_wordlen + 1);
if (p != NULL)
{
+ int len_diff = stp->st_wordlen - stp->st_orglen;
+
c = (int)(sug.su_badptr - line);
mch_memmove(p, line, c);
STRCPY(p + c, stp->st_word);
@@ -698,6 +700,9 @@ spell_suggest(int count)
curwin->w_cursor.col = c;
changed_bytes(curwin->w_cursor.lnum, c);
+ if (curbuf->b_has_textprop && len_diff != 0)
+ adjust_prop_columns(curwin->w_cursor.lnum, c, len_diff,
+ APC_SUBSTITUTE);
}
}
else
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index fee3bdb6bb..20ab85a8cc 100644
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -1889,4 +1889,49 @@ func Test_prop_find_prev_on_same_line()
bwipe!
endfunc
+func Test_prop_spell()
+ new
+ set spell
+ call AddPropTypes()
+
+ call setline(1, ["helo world", "helo helo helo"])
+ call prop_add(1, 1, #{type: 'one', length: 4})
+ call prop_add(1, 6, #{type: 'two', length: 5})
+ call prop_add(2, 1, #{type: 'three', length: 4})
+ call prop_add(2, 6, #{type: 'three', length: 4})
+ call prop_add(2, 11, #{type: 'three', length: 4})
+
+ " The first prop over 'helo' increases its length after the word is corrected
+ " to 'Hello', the second one is shifted to the right.
+ let expected = [
+ \ {'id': 0, 'col': 1, 'type_bufnr': 0, 'end': 1, 'type': 'one',
+ \ 'length': 5, 'start': 1},
+ \ {'id': 0, 'col': 7, 'type_bufnr': 0, 'end': 1, 'type': 'two',
+ \ 'length': 5, 'start': 1}
+ \ ]
+ call feedkeys("z=1\<CR>", 'xt')
+
+ call assert_equal('Hello world', getline(1))
+ call assert_equal(expected, prop_list(1))
+
+ " Repeat the replacement done by z=
+ spellrepall
+
+ let expected = [
+ \ {'id': 0, 'col': 1, 'type_bufnr': 0, 'end': 1, 'type': 'three',
+ \ 'length': 5, 'start': 1},
+ \ {'id': 0, 'col': 7, 'type_bufnr': 0, 'end': 1, 'type': 'three',
+ \ 'length': 5, 'start': 1},
+ \ {'id': 0, 'col': 13, 'type_bufnr': 0, 'end': 1, 'type': 'three',
+ \ 'length': 5, 'start': 1}
+ \ ]
+ call assert_equal('Hello Hello Hello', getline(2))
+ call assert_equal(expected, prop_list(2))
+
+ call DeletePropTypes()
+ set spell&
+ bwipe!
+endfunc
+
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index e63e6b1394..196537359b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4947,
+/**/
4946,
/**/
4945,