summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGregory Anders <greg@gpanders.com>2024-08-15 22:04:22 +0200
committerChristian Brabandt <cb@256bit.org>2024-08-15 22:09:28 +0200
commit3b59be4ed8a145d3188934f1a5cd85432bd2433d (patch)
treebda28c1a26321ab648b4273abf0d89c4b490d102
parent12cb1d1326c785c0f44303d113f27edcd473cb33 (diff)
patch 9.1.0677: :keepp does not retain the substitute patternv9.1.0677
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 <greg@gpanders.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--runtime/doc/cmdline.txt4
-rw-r--r--runtime/doc/version9.txt3
-rw-r--r--src/ex_cmds.c5
-rw-r--r--src/testdir/test_substitute.vim15
-rw-r--r--src/version.c2
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\<CR>"
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
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 677,
+/**/
676,
/**/
675,