patch 9.2.1033: session: sourcing fails on lambdas
Commit:
https://github.com/vim/vim/commit/12fe50c75f3fdb3bf3c26e76906f1325a91c5d91
Author: Miguel Barro <
miguel...@live.com>
Date: Wed Sep 2 21:04:04 2026 +0000
patch 9.2.1033: session: sourcing fails on lambdas
Problem: Sourcing a session file fails when an option was set to a
lambda, since the lambda no longer exists.
Solution: Skip options set to a lambda when writing the session
(Miguel Barro).
closes: #21161
Signed-off-by: Miguel Barro <
miguel...@live.com>
Signed-off-by: Christian Brabandt <
c...@256bit.org>
diff --git a/src/option.c b/src/option.c
index 353082cda..15d1f92a5 100644
--- a/src/option.c
+++ b/src/option.c
@@ -6595,6 +6595,12 @@ makeset(FILE *fd, int opt_flags, int local_only)
int do_endif = FALSE;
bool legacy;
+ // Ignore those options associated to lambda expressions because
+ // persistence makes no sense for them.
+ if ((p->flags & P_FUNC) && *(char_u **)varp != NULL
+ && strstr(*(char **)varp, "<lambda>") != NULL)
+ continue;
+
#ifdef FEAT_EVAL
legacy = !is_option_value_vim9(p - &options[0],
round == 1 ? opt_flags | OPT_GLOBAL : OPT_LOCAL);
diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim
index 2405289b7..032157d51 100644
--- a/src/testdir/test_mksession.vim
+++ b/src/testdir/test_mksession.vim
@@ -1961,4 +1961,35 @@ func Test_mksession_winminwidth()
only
endfunc
+" Test for avoiding options relying on lambdas in the session file.
+func Test_mksession_avoid_lambda_options()
+ set sessionoptions+=options
+ set sessionoptions+=localoptions
+
+ " Set global and local options that rely on a lambda function.
+ let Lambda = {-> 'dummy function'}
+ let &opfunc = Lambda
+ let &completefunc = Lambda
+
+ mksession! Xtest_mks.out
+
+ " Test restoring session
+ const msg = 'Option relying on lambda function should not be restored'
+ try
+ set opfunc&
+ set completefunc&
+ source Xtest_mks.out
+ call assert_true(empty(&opfunc), msg)
+ call assert_true(empty(&completefunc), msg)
+ catch /^Vim\%((\S\+)\)\=:E700:/
+ call assert_report(msg)
+ endtry
+
+ " clean up
+ set opfunc&
+ set completefunc&
+ call delete('Xtest_mks.out')
+ set sessionoptions&
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index c76b56a8a..3ad277e3d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -763,6 +763,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1033,
/**/
1032,
/**/