patch 9.1.0677: :keepp does not retain the substitute pattern

Commit: 
https://github.com/vim/vim/commit/3b59be4ed8a145d3188934f1a5cd85432bd2433d
Author: Gregory Anders <g...@gpanders.com>
Date:   Thu Aug 15 22:04:22 2024 +0200

    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 <g...@gpanders.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt
index 214571f28..404e54de8 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 73e54a1cf..3729590fa 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 479373756..05778c8fd 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 afdc104d7..b25cd6080 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 e4fb2caa0..78ccd20e5 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,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1segsF-003oQP-KQ%40256bit.org.

Raspunde prin e-mail lui