From: Barrett Ruth
Date: Wed, 22 Jul 2026 18:48:47 +0000 (+0000)
Subject: patch 9.2.0834: cleared last search pattern is restored from viminfo
X-Git-Tag: v9.2.0834^0
X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fbe6397ab0c2d0beca87c5c54acf5a801956631f;p=thirdparty%2Fvim.git
patch 9.2.0834: cleared last search pattern is restored from viminfo
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
Signed-off-by: Christian Brabandt
---
diff --git a/src/testdir/test_viminfo.vim b/src/testdir/test_viminfo.vim
index de987ef278..d95250a9ea 100644
--- a/src/testdir/test_viminfo.vim
+++ b/src/testdir/test_viminfo.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index 6b32cb3094..3a7cc8698f 100644
--- a/src/version.c
+++ b/src/version.c
@@ -759,6 +759,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 834,
/**/
833,
/**/
diff --git a/src/viminfo.c b/src/viminfo.c
index 95ec55ebb3..f8292dee50 100644
--- a/src/viminfo.c
+++ b/src/viminfo.c
@@ -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);