aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-06-06 10:32:30 +0800
committerGitHub <noreply@github.com>2023-06-06 10:32:30 +0800
commiteceb2dffce3908507092ffe425b1ceef5baeb1ab (patch)
tree66b2e0d0cb60ef26dcbb28e652781c09e3a9233a
parent43f3209b070a8515a26a37917b85d0e682d7a3c7 (diff)
downloadrneovim-eceb2dffce3908507092ffe425b1ceef5baeb1ab.tar.gz
rneovim-eceb2dffce3908507092ffe425b1ceef5baeb1ab.tar.bz2
rneovim-eceb2dffce3908507092ffe425b1ceef5baeb1ab.zip
fix(spell): splice extmarks on :spellrepall (#23929)
-rw-r--r--src/nvim/spell.c17
-rw-r--r--test/functional/lua/buffer_updates_spec.lua7
2 files changed, 16 insertions, 8 deletions
diff --git a/src/nvim/spell.c b/src/nvim/spell.c
index 778266e5ac..9ae2036ee0 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -2604,9 +2604,11 @@ void ex_spellrepall(exarg_T *eap)
emsg(_("E752: No previous spell replacement"));
return;
}
- int addlen = (int)(strlen(repl_to) - strlen(repl_from));
+ const size_t repl_from_len = strlen(repl_from);
+ const size_t repl_to_len = strlen(repl_to);
+ int addlen = (int)(repl_to_len - repl_from_len);
- size_t frompatlen = strlen(repl_from) + 7;
+ const size_t frompatlen = repl_from_len + 7;
char *frompat = xmalloc(frompatlen);
snprintf(frompat, frompatlen, "\\V\\<%s\\>", repl_from);
p_ws = false;
@@ -2623,14 +2625,15 @@ void ex_spellrepall(exarg_T *eap)
// Only replace when the right word isn't there yet. This happens
// when changing "etc" to "etc.".
char *line = get_cursor_line_ptr();
- if (addlen <= 0 || strncmp(line + curwin->w_cursor.col,
- repl_to, strlen(repl_to)) != 0) {
+ if (addlen <= 0
+ || strncmp(line + curwin->w_cursor.col, repl_to, repl_to_len) != 0) {
char *p = xmalloc(strlen(line) + (size_t)addlen + 1);
memmove(p, line, (size_t)curwin->w_cursor.col);
STRCPY(p + curwin->w_cursor.col, repl_to);
- STRCAT(p, line + curwin->w_cursor.col + strlen(repl_from));
+ STRCAT(p, line + curwin->w_cursor.col + repl_from_len);
ml_replace(curwin->w_cursor.lnum, p, false);
- changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col);
+ inserted_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col,
+ (int)repl_from_len, (int)repl_to_len);
if (curwin->w_cursor.lnum != prev_lnum) {
sub_nlines++;
@@ -2638,7 +2641,7 @@ void ex_spellrepall(exarg_T *eap)
}
sub_nsubs++;
}
- curwin->w_cursor.col += (colnr_T)strlen(repl_to);
+ curwin->w_cursor.col += (colnr_T)repl_to_len;
}
p_ws = save_ws;
diff --git a/test/functional/lua/buffer_updates_spec.lua b/test/functional/lua/buffer_updates_spec.lua
index d415b708be..c19891a794 100644
--- a/test/functional/lua/buffer_updates_spec.lua
+++ b/test/functional/lua/buffer_updates_spec.lua
@@ -1164,12 +1164,17 @@ describe('lua: nvim_buf_attach on_bytes', function()
end)
it("works with accepting spell suggestions", function()
- local check_events = setup_eventcheck(verify, {"hallo"})
+ local check_events = setup_eventcheck(verify, {"hallo world", "hallo world"})
feed("gg0z=4<cr><cr>") -- accepts 'Hello'
check_events {
{ "test1", "bytes", 1, 3, 0, 0, 0, 0, 2, 2, 0, 2, 2 };
}
+
+ command("spellrepall") -- replaces whole words
+ check_events {
+ { "test1", "bytes", 1, 4, 1, 0, 12, 0, 5, 5, 0, 5, 5 };
+ }
end)
it('works with :diffput and :diffget', function()