summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-11-03 09:23:33 +0100
committerChristian Brabandt <cb@256bit.org>2024-11-03 09:23:33 +0100
commit6eda269600b5ca952f28e808c662f67e581933d7 (patch)
tree5a4ce03797b2aafa8da5eb79b9830c0916a03a61
parentca6231b8a695489664aa0ca394840f2c77040928 (diff)
patch 9.1.0835: :setglobal doesn't work properly for 'ffu' and 'tsrfu'v9.1.0835
Problem: :setglobal doesn't work properly for 'ffu' and 'tsrfu' when the local value is set (after v9.1.0831) Solution: Check os_flags instead of buffer option variable (zeertzjq). closes: #15980 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--src/ex_docmd.c11
-rw-r--r--src/insexpand.c7
-rw-r--r--src/testdir/test_findfile.vim37
-rw-r--r--src/testdir/test_ins_complete.vim41
-rw-r--r--src/version.c2
5 files changed, 90 insertions, 8 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 380bd236fd..859dc8563a 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -6934,6 +6934,9 @@ get_findfunc_callback(void)
return *curbuf->b_p_ffu != NUL ? &curbuf->b_ffu_cb : &ffu_cb;
}
+/*
+ * Call 'findfunc' to obtain a list of file names.
+ */
static list_T *
call_findfunc(char_u *pat, int cmdcomplete)
{
@@ -6944,7 +6947,6 @@ call_findfunc(char_u *pat, int cmdcomplete)
sctx_T saved_sctx = current_sctx;
sctx_T *ctx;
- // Call 'findfunc' to obtain the list of file names.
args[0].v_type = VAR_STRING;
args[0].vval.v_string = pat;
args[1].v_type = VAR_BOOL;
@@ -7076,15 +7078,16 @@ did_set_findfunc(optset_T *args UNUSED)
{
int retval;
- if (*curbuf->b_p_ffu != NUL)
- {
+ if (args->os_flags & OPT_LOCAL)
// buffer-local option set
retval = option_set_callback_func(curbuf->b_p_ffu, &curbuf->b_ffu_cb);
- }
else
{
// global option set
retval = option_set_callback_func(p_ffu, &ffu_cb);
+ // when using :set, free the local callback
+ if (!(args->os_flags & OPT_GLOBAL))
+ free_callback(&curbuf->b_ffu_cb);
}
if (retval == FAIL)
diff --git a/src/insexpand.c b/src/insexpand.c
index c22eb6dc2f..f176d75754 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -2687,16 +2687,17 @@ did_set_thesaurusfunc(optset_T *args UNUSED)
{
int retval;
- if (*curbuf->b_p_tsrfu != NUL)
- {
+ if (args->os_flags & OPT_LOCAL)
// buffer-local option set
retval = option_set_callback_func(curbuf->b_p_tsrfu,
&curbuf->b_tsrfu_cb);
- }
else
{
// global option set
retval = option_set_callback_func(p_tsrfu, &tsrfu_cb);
+ // when using :set, free the local callback
+ if (!(args->os_flags & OPT_GLOBAL))
+ free_callback(&curbuf->b_tsrfu_cb);
}
return retval == FAIL ? e_invalid_argument : NULL;
diff --git a/src/testdir/test_findfile.vim b/src/testdir/test_findfile.vim
index 4db5850fe6..c974c40147 100644
--- a/src/testdir/test_findfile.vim
+++ b/src/testdir/test_findfile.vim
@@ -359,7 +359,7 @@ func Test_findfunc()
" Error cases
- " Function that doesn't any argument
+ " Function that doesn't take any arguments
func FindFuncNoArg()
endfunc
set findfunc=FindFuncNoArg
@@ -479,6 +479,41 @@ func Test_findfunc_scriptlocal_func()
call assert_equal('abc', g:FindFuncArg)
bw!
+ new | only
+ set findfunc=
+ setlocal findfunc=NoSuchFunc
+ setglobal findfunc=s:FindFuncScript
+ call assert_equal('NoSuchFunc', &findfunc)
+ call assert_equal('NoSuchFunc', &l:findfunc)
+ call assert_equal(expand('<SID>') .. 'FindFuncScript', &g:findfunc)
+ new | only
+ call assert_equal(expand('<SID>') .. 'FindFuncScript', &findfunc)
+ call assert_equal(expand('<SID>') .. 'FindFuncScript', &g:findfunc)
+ call assert_equal('', &l:findfunc)
+ let g:FindFuncArg = ''
+ find abc
+ call assert_equal('abc', g:FindFuncArg)
+ bw!
+
+ new | only
+ set findfunc=
+ setlocal findfunc=NoSuchFunc
+ set findfunc=s:FindFuncScript
+ call assert_equal(expand('<SID>') .. 'FindFuncScript', &findfunc)
+ call assert_equal(expand('<SID>') .. 'FindFuncScript', &g:findfunc)
+ call assert_equal('', &l:findfunc)
+ let g:FindFuncArg = ''
+ find abc
+ call assert_equal('abc', g:FindFuncArg)
+ new | only
+ call assert_equal(expand('<SID>') .. 'FindFuncScript', &findfunc)
+ call assert_equal(expand('<SID>') .. 'FindFuncScript', &g:findfunc)
+ call assert_equal('', &l:findfunc)
+ let g:FindFuncArg = ''
+ find abc
+ call assert_equal('abc', g:FindFuncArg)
+ bw!
+
set findfunc=
delfunc s:FindFuncScript
endfunc
diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim
index 8b478a190e..fd4c7cded5 100644
--- a/src/testdir/test_ins_complete.vim
+++ b/src/testdir/test_ins_complete.vim
@@ -2190,6 +2190,7 @@ func Test_thesaurusfunc_callback()
call add(g:TsrFunc3Args, [a:findstart, a:base])
return a:findstart ? 0 : []
endfunc
+
set tsrfu=s:TsrFunc3
new
call setline(1, 'script1')
@@ -2205,6 +2206,46 @@ func Test_thesaurusfunc_callback()
call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
call assert_equal([[1, ''], [0, 'script2']], g:TsrFunc3Args)
bw!
+
+ new | only
+ set thesaurusfunc=
+ setlocal thesaurusfunc=NoSuchFunc
+ setglobal thesaurusfunc=s:TsrFunc3
+ call assert_equal('NoSuchFunc', &thesaurusfunc)
+ call assert_equal('NoSuchFunc', &l:thesaurusfunc)
+ call assert_equal('s:TsrFunc3', &g:thesaurusfunc)
+ new | only
+ call assert_equal('s:TsrFunc3', &thesaurusfunc)
+ call assert_equal('s:TsrFunc3', &g:thesaurusfunc)
+ call assert_equal('', &l:thesaurusfunc)
+ call setline(1, 'script1')
+ let g:TsrFunc3Args = []
+ call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
+ call assert_equal([[1, ''], [0, 'script1']], g:TsrFunc3Args)
+ bw!
+
+ new | only
+ set thesaurusfunc=
+ setlocal thesaurusfunc=NoSuchFunc
+ set thesaurusfunc=s:TsrFunc3
+ call assert_equal('s:TsrFunc3', &thesaurusfunc)
+ call assert_equal('s:TsrFunc3', &g:thesaurusfunc)
+ call assert_equal('', &l:thesaurusfunc)
+ call setline(1, 'script1')
+ let g:TsrFunc3Args = []
+ call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
+ call assert_equal([[1, ''], [0, 'script1']], g:TsrFunc3Args)
+ setlocal bufhidden=wipe
+ new | only!
+ call assert_equal('s:TsrFunc3', &thesaurusfunc)
+ call assert_equal('s:TsrFunc3', &g:thesaurusfunc)
+ call assert_equal('', &l:thesaurusfunc)
+ call setline(1, 'script1')
+ let g:TsrFunc3Args = []
+ call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
+ call assert_equal([[1, ''], [0, 'script1']], g:TsrFunc3Args)
+ bw!
+
delfunc s:TsrFunc3
" invalid return value
diff --git a/src/version.c b/src/version.c
index 743a9e017b..b39cf1e92e 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 */
/**/
+ 835,
+/**/
834,
/**/
833,