diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2021-02-04 11:20:54 +0100 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2021-02-04 14:33:37 +0100 |
commit | aa50369897084762e7c060262a3e315892ea1a9e (patch) | |
tree | 267d4d5b214aca89b67dafecdb336fd6a132ad4c | |
parent | 94cf7bba008ff0c36828565a408b7ef79203e069 (diff) | |
download | rneovim-aa50369897084762e7c060262a3e315892ea1a9e.tar.gz rneovim-aa50369897084762e7c060262a3e315892ea1a9e.tar.bz2 rneovim-aa50369897084762e7c060262a3e315892ea1a9e.zip |
inccommand: preserve extmarks when undoing preview substitution
-rw-r--r-- | src/nvim/ex_cmds.c | 11 | ||||
-rw-r--r-- | test/functional/lua/buffer_updates_spec.lua | 2 |
2 files changed, 8 insertions, 5 deletions
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 9239eb5ca6..6d26c5f69c 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -3316,11 +3316,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, int save_b_changed = curbuf->b_changed; bool preview = (State & CMDPREVIEW); - // inccommand tests fail without this check - if (!preview) { - // Required for Undo to work for extmarks. - u_save_cursor(); - } + bool did_save = false; if (!global_busy) { sub_nsubs = 0; @@ -3997,6 +3993,11 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, int matchcols = end.col - ((end.lnum == start.lnum) ? start.col : 0); int subcols = new_endcol - ((lnum == lnum_start) ? start_col : 0); + if (!did_save) { + // Required for Undo to work for extmarks. + u_save_cursor(); + did_save = true; + } extmark_splice(curbuf, lnum_start-1, start_col, end.lnum-start.lnum, matchcols, replaced_bytes, lnum-lnum_start, subcols, sublen-1, kExtmarkUndo); diff --git a/test/functional/lua/buffer_updates_spec.lua b/test/functional/lua/buffer_updates_spec.lua index 67dc5f5a16..80781bed79 100644 --- a/test/functional/lua/buffer_updates_spec.lua +++ b/test/functional/lua/buffer_updates_spec.lua @@ -504,11 +504,13 @@ describe('lua: nvim_buf_attach on_bytes', function() feed ':%s/bcd/' check_events { { "test1", "bytes", 1, 3, 0, 1, 1, 0, 3, 3, 0, 0, 0 }; + { "test1", "bytes", 1, 5, 0, 1, 1, 0, 0, 0, 0, 3, 3 }; } feed 'a' check_events { { "test1", "bytes", 1, 3, 0, 1, 1, 0, 3, 3, 0, 1, 1 }; + { "test1", "bytes", 1, 5, 0, 1, 1, 0, 1, 1, 0, 3, 3 }; } end) |