From 3b59be4ed8a145d3188934f1a5cd85432bd2433d Mon Sep 17 00:00:00 2001 From: Gregory Anders Date: Thu, 15 Aug 2024 22:04:22 +0200 Subject: [PATCH] patch 9.1.0677: :keepp does not retain the substitute pattern Problem: :keeppatterns does not retain the substitute pattern for a :s command Solution: preserve the last substitute pattern when used with the :keeppatterns command modifier (Gregory Anders) closes: #15497 Signed-off-by: Gregory Anders Signed-off-by: Christian Brabandt --- runtime/doc/cmdline.txt | 4 ++-- runtime/doc/version9.txt | 3 ++- src/ex_cmds.c | 5 +++-- src/testdir/test_substitute.vim | 15 ++++++++++----- src/version.c | 2 ++ 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt index 214571f289..404e54de8c 100644 --- a/runtime/doc/cmdline.txt +++ b/runtime/doc/cmdline.txt @@ -1,4 +1,4 @@ -*cmdline.txt* For Vim version 9.1. Last change: 2024 Apr 27 +*cmdline.txt* For Vim version 9.1. Last change: 2024 Aug 15 VIM REFERENCE MANUAL by Bram Moolenaar @@ -379,7 +379,7 @@ terminals) :keepp[atterns] {command} *:keepp* *:keeppatterns* Execute {command}, without adding anything to the search - history + history or modifying the last substitute pattern. ============================================================================== 2. Command-line completion *cmdline-completion* diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index 73e54a1cf3..3729590fae 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.1. Last change: 2024 Jul 30 +*version9.txt* For Vim version 9.1. Last change: 2024 Aug 15 VIM REFERENCE MANUAL by Bram Moolenaar @@ -41592,6 +41592,7 @@ Changed~ mark deprecated attributes from LSP server) |complete-items| - the regex engines match correctly case-insensitive multi-byte characters (and apply proper case folding) +- |:keeppatterns| preserves the last substitute pattern when used with |:s| *added-9.2* Added ~ diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 4793737560..05778c8fd8 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -3777,6 +3777,7 @@ ex_substitute(exarg_T *eap) int endcolumn = FALSE; // cursor in last column when done pos_T old_cursor = curwin->w_cursor; int start_nsubs; + int keeppatterns = cmdmod.cmod_flags & CMOD_KEEPPATTERNS; #ifdef FEAT_EVAL int save_ma = 0; int save_sandbox = 0; @@ -3876,7 +3877,7 @@ ex_substitute(exarg_T *eap) // out of memory return; } - else + else if (!keeppatterns) { vim_free(old_sub); old_sub = vim_strsave(sub); @@ -3940,7 +3941,7 @@ ex_substitute(exarg_T *eap) ex_may_print(eap); } - if ((cmdmod.cmod_flags & CMOD_KEEPPATTERNS) == 0) + if (!keeppatterns) save_re_pat(RE_SUBST, pat, patlen, magic_isset()); // put pattern in history add_to_history(HIST_SEARCH, pat, patlen, TRUE, NUL); diff --git a/src/testdir/test_substitute.vim b/src/testdir/test_substitute.vim index afdc104d7c..b25cd60803 100644 --- a/src/testdir/test_substitute.vim +++ b/src/testdir/test_substitute.vim @@ -806,7 +806,7 @@ func Test_replace_keeppatterns() a foobar -substitute foo asdf +substitute foo asdf foo one two . @@ -815,21 +815,26 @@ one two /^substitute s/foo/bar/ call assert_equal('foo', @/) - call assert_equal('substitute bar asdf', getline('.')) + call assert_equal('substitute bar asdf foo', getline('.')) /^substitute keeppatterns s/asdf/xyz/ call assert_equal('^substitute', @/) - call assert_equal('substitute bar xyz', getline('.')) + call assert_equal('substitute bar xyz foo', getline('.')) + + /^substitute + & + call assert_equal('^substitute', @/) + call assert_equal('substitute bar xyz bar', getline('.')) exe "normal /bar /e\" call assert_equal(15, col('.')) normal - keeppatterns /xyz call assert_equal('bar ', @/) - call assert_equal('substitute bar xyz', getline('.')) + call assert_equal('substitute bar xyz bar', getline('.')) exe "normal 0dn" - call assert_equal('xyz', getline('.')) + call assert_equal('xyz bar', getline('.')) close! endfunc diff --git a/src/version.c b/src/version.c index e4fb2caa06..78ccd20e5a 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 677, /**/ 676, /**/