]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0834: cleared last search pattern is restored from viminfo master v9.2.0834
authorBarrett Ruth <br@barrettruth.com>
Wed, 22 Jul 2026 18:48:47 +0000 (18:48 +0000)
committerChristian Brabandt <cb@256bit.org>
Wed, 22 Jul 2026 18:50:39 +0000 (18:50 +0000)
Problem:  cleared last search pattern is restored from viminfo
Solution: Do not apply the search pattern and 'hlsearch' state read
          from viminfo while writing (Barrett Ruth).

fixes:  #20718
closes: #20720

Signed-off-by: Barrett Ruth <br@barrettruth.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/testdir/test_viminfo.vim
src/version.c
src/viminfo.c

index de987ef278d63021ebb1d50d1c4ad5e680617c21..d95250a9eaeff9cf3c3b1f4c829f7be038604e4f 100644 (file)
@@ -38,6 +38,19 @@ func Test_viminfo_read_and_write()
   call assert_equal(3, done)
 endfunc
 
+func Test_viminfo_clear_search_pattern()
+  let save = @/
+  let @/ = 'foobar'
+  defer delete('Xviminfo')
+  wviminfo Xviminfo
+  call assert_notequal(-1, match(readfile('Xviminfo'), 'foobar'))
+
+  let @/ = ''
+  wviminfo Xviminfo
+  call assert_equal(-1, match(readfile('Xviminfo'), 'foobar'))
+  call setreg('/', save)
+endfunc
+
 func Test_global_vars()
   let g:MY_GLOBAL_STRING = "Vim Editor"
   let g:MY_GLOBAL_NUM = 345
index 6b32cb30942fa16712c2676108b633dbd5e0eefa..3a7cc8698f979d65e2c6de0d84b3caf15e5d54a7 100644 (file)
@@ -759,6 +759,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    834,
 /**/
     833,
 /**/
index 95ec55ebb355251838eee2a5eb465cfbdf7528eb..f8292dee501d0808c0741cecfe333310cf240e68 100644 (file)
@@ -1476,7 +1476,7 @@ write_viminfo_sub_string(FILE *fp)
  */
 
     static int
-read_viminfo_search_pattern(vir_T *virp, int force)
+read_viminfo_search_pattern(vir_T *virp, int force, int writing)
 {
     char_u     *lp;
     int                idx = -1;
@@ -1543,16 +1543,19 @@ read_viminfo_search_pattern(vir_T *virp, int force)
                                                                        TRUE);
            if (val != NULL)
            {
-               set_last_search_pat(val, idx, magic, setlast);
-               vim_free(val);
-               spat->no_scs = no_scs;
-               spat->off.line = off_line;
-               spat->off.end = off_end;
-               spat->off.off = off;
+               if (!writing)
+               {
+                   set_last_search_pat(val, idx, magic, setlast);
+                   spat->no_scs = no_scs;
+                   spat->off.line = off_line;
+                   spat->off.end = off_end;
+                   spat->off.off = off;
 #ifdef FEAT_SEARCH_EXTRA
-               if (setlast)
-                   set_no_hlsearch(!hlsearch_on);
+                   if (setlast)
+                       set_no_hlsearch(!hlsearch_on);
 #endif
+               }
+               vim_free(val);
            }
        }
     }
@@ -2914,7 +2917,7 @@ read_viminfo_up_to_marks(
            case '/':       // Search string
            case '&':       // Substitute search string
            case '~':       // Last search string, followed by '/' or '&'
-               eof = read_viminfo_search_pattern(virp, forceit);
+               eof = read_viminfo_search_pattern(virp, forceit, writing);
                break;
            case '$':
                eof = read_viminfo_sub_string(virp, forceit);