diff options
author | LemonBoy <thatlemon@gmail.com> | 2022-05-13 12:41:50 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-05-13 12:41:50 +0100 |
commit | b7a701255578b38896631ba20556b856e8888069 (patch) | |
tree | 9e141e86d3ce935dd5ef081f40639669d5d8b188 | |
parent | 7f8a3b11bfc02f24dfd877d0a81392d679008180 (diff) | |
download | vim-git-b7a701255578b38896631ba20556b856e8888069.tar.gz |
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.c | 3 | ||||
-rw-r--r-- | src/spellsuggest.c | 5 | ||||
-rw-r--r-- | src/testdir/test_textprop.vim | 45 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 55 insertions, 0 deletions
diff --git a/src/spell.c b/src/spell.c index 0c1890472..e5c2f7d1f 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 ecb54550d..4a7143881 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 fee3bdb6b..20ab85a8c 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 e63e6b139..196537359 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, |