]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0835: :setglobal doesn't work properly for 'ffu' and 'tsrfu' v9.1.0835
authorzeertzjq <zeertzjq@outlook.com>
Sun, 3 Nov 2024 08:23:33 +0000 (09:23 +0100)
committerChristian Brabandt <cb@256bit.org>
Sun, 3 Nov 2024 08:23:33 +0000 (09:23 +0100)
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>
src/ex_docmd.c
src/insexpand.c
src/testdir/test_findfile.vim
src/testdir/test_ins_complete.vim
src/version.c

index 380bd236fd5158aec7be61a34b0fdf44995d7e11..859dc8563ab7c701536481f40410e0261969313f 100644 (file)
@@ -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)
index c22eb6dc2f543b36501ae1f30dd0baa924e6c710..f176d75754521a7efdc407fef56acc32e19ac463 100644 (file)
@@ -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;
index 4db5850fe6c27558d31d79273d77c3f18f469f59..c974c401476cc7bfa82e3e24fa8e21cde22d57a3 100644 (file)
@@ -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
index 8b478a190eff0cb4e4c94ccf50ec2551299931df..fd4c7cded527df6e78a12bea504d483c36e3efa0 100644 (file)
@@ -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
index 743a9e017b651fe9067b35451e4b65a1cdfe4535..b39cf1e92e24f366cb38885a9eabea1a16a91e39 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    835,
 /**/
     834,
 /**/