mirror of
https://github.com/vim/vim.git
synced 2026-05-28 00:21:37 +02:00
patch 9.1.1991: :setlocal changes effective global 'omnifunc'
Problem: :setlocal changes effective global 'omnifunc' (Maxim Kim) Solution: Don't change global callback when using :setlocal (zeertzjq). fixes: #18948 closes: #18951 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
bbbc23ac2f
commit
3e82b0ebfe
+25
-10
@@ -3319,14 +3319,21 @@ copy_global_to_buflocal_cb(callback_T *globcb, callback_T *bufcb)
|
||||
* lambda expression.
|
||||
*/
|
||||
char *
|
||||
did_set_completefunc(optset_T *args UNUSED)
|
||||
did_set_completefunc(optset_T *args)
|
||||
{
|
||||
if (option_set_callback_func(curbuf->b_p_cfu, &cfu_cb) == FAIL)
|
||||
return e_invalid_argument;
|
||||
int retval;
|
||||
|
||||
set_buflocal_cfu_callback(curbuf);
|
||||
if (args->os_flags & OPT_LOCAL)
|
||||
retval = option_set_callback_func(args->os_newval.string,
|
||||
&curbuf->b_cfu_cb);
|
||||
else
|
||||
{
|
||||
retval = option_set_callback_func(args->os_newval.string, &cfu_cb);
|
||||
if (retval == OK && !(args->os_flags & OPT_GLOBAL))
|
||||
set_buflocal_cfu_callback(curbuf);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return retval == FAIL ? e_invalid_argument : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3348,13 +3355,21 @@ set_buflocal_cfu_callback(buf_T *buf UNUSED)
|
||||
* lambda expression.
|
||||
*/
|
||||
char *
|
||||
did_set_omnifunc(optset_T *args UNUSED)
|
||||
did_set_omnifunc(optset_T *args)
|
||||
{
|
||||
if (option_set_callback_func(curbuf->b_p_ofu, &ofu_cb) == FAIL)
|
||||
return e_invalid_argument;
|
||||
int retval;
|
||||
|
||||
set_buflocal_ofu_callback(curbuf);
|
||||
return NULL;
|
||||
if (args->os_flags & OPT_LOCAL)
|
||||
retval = option_set_callback_func(args->os_newval.string,
|
||||
&curbuf->b_ofu_cb);
|
||||
else
|
||||
{
|
||||
retval = option_set_callback_func(args->os_newval.string, &ofu_cb);
|
||||
if (retval == OK && !(args->os_flags & OPT_GLOBAL))
|
||||
set_buflocal_ofu_callback(curbuf);
|
||||
}
|
||||
|
||||
return retval == FAIL ? e_invalid_argument : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -170,22 +170,21 @@ static callback_T tfu_cb; // 'tagfunc' callback function
|
||||
* a function (string), or function(<name>) or funcref(<name>) or a lambda.
|
||||
*/
|
||||
char *
|
||||
did_set_tagfunc(optset_T *args UNUSED)
|
||||
did_set_tagfunc(optset_T *args)
|
||||
{
|
||||
#ifdef FEAT_EVAL
|
||||
free_callback(&tfu_cb);
|
||||
free_callback(&curbuf->b_tfu_cb);
|
||||
int retval;
|
||||
|
||||
if (*curbuf->b_p_tfu == NUL)
|
||||
return NULL;
|
||||
if (args->os_flags & OPT_LOCAL)
|
||||
retval = option_set_callback_func(args->os_newval.string,
|
||||
&curbuf->b_tfu_cb);
|
||||
else
|
||||
{
|
||||
retval = option_set_callback_func(args->os_newval.string, &tfu_cb);
|
||||
if (retval == OK && !(args->os_flags & OPT_GLOBAL))
|
||||
set_buflocal_tfu_callback(curbuf);
|
||||
}
|
||||
|
||||
if (option_set_callback_func(curbuf->b_p_tfu, &tfu_cb) == FAIL)
|
||||
return e_invalid_argument;
|
||||
|
||||
copy_callback(&curbuf->b_tfu_cb, &tfu_cb);
|
||||
#endif
|
||||
|
||||
return NULL;
|
||||
return retval == FAIL ? e_invalid_argument : NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -2426,6 +2426,35 @@ func Test_completefunc_callback()
|
||||
call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
|
||||
call assert_equal([[1, ''], [0, 'five']], g:CompleteFunc2Args)
|
||||
bw!
|
||||
|
||||
#" :setlocal and :setglobal
|
||||
set completefunc&
|
||||
setlocal completefunc=function('g:CompleteFunc1',\ [22])
|
||||
call setline(1, 'sun')
|
||||
LET g:CompleteFunc1Args = []
|
||||
call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
|
||||
call assert_equal([[22, 1, ''], [22, 0, 'sun']], g:CompleteFunc1Args)
|
||||
new
|
||||
call setline(1, 'sun')
|
||||
LET g:CompleteFunc1Args = []
|
||||
call assert_fails('call feedkeys("A\<C-X>\<C-U>\<Esc>", "x")', 'E764:')
|
||||
call assert_equal([], g:CompleteFunc1Args)
|
||||
bw!
|
||||
setglobal completefunc=function('g:CompleteFunc1',\ [23])
|
||||
call setline(1, 'sun')
|
||||
call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
|
||||
call assert_equal([[22, 1, ''], [22, 0, 'sun']], g:CompleteFunc1Args)
|
||||
new
|
||||
call setline(1, 'sun')
|
||||
LET g:CompleteFunc1Args = []
|
||||
call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
|
||||
call assert_equal([[23, 1, ''], [23, 0, 'sun']], g:CompleteFunc1Args)
|
||||
setlocal completefunc&
|
||||
call setline(1, 'sun')
|
||||
LET g:CompleteFunc1Args = []
|
||||
call assert_fails('call feedkeys("A\<C-X>\<C-U>\<Esc>", "x")', 'E764:')
|
||||
call assert_equal([], g:CompleteFunc1Args)
|
||||
:%bw!
|
||||
END
|
||||
call v9.CheckLegacyAndVim9Success(lines)
|
||||
|
||||
@@ -2700,6 +2729,35 @@ func Test_omnifunc_callback()
|
||||
call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
|
||||
call assert_equal([[1, ''], [0, 'nine']], g:OmniFunc2Args)
|
||||
bw!
|
||||
|
||||
#" :setlocal and :setglobal
|
||||
set omnifunc&
|
||||
setlocal omnifunc=function('g:OmniFunc1',\ [22])
|
||||
call setline(1, 'sun')
|
||||
LET g:OmniFunc1Args = []
|
||||
call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
|
||||
call assert_equal([[22, 1, ''], [22, 0, 'sun']], g:OmniFunc1Args)
|
||||
new
|
||||
call setline(1, 'sun')
|
||||
LET g:OmniFunc1Args = []
|
||||
call assert_fails('call feedkeys("A\<C-X>\<C-O>\<Esc>", "x")', 'E764:')
|
||||
call assert_equal([], g:OmniFunc1Args)
|
||||
bw!
|
||||
setglobal omnifunc=function('g:OmniFunc1',\ [23])
|
||||
call setline(1, 'sun')
|
||||
call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
|
||||
call assert_equal([[22, 1, ''], [22, 0, 'sun']], g:OmniFunc1Args)
|
||||
new
|
||||
call setline(1, 'sun')
|
||||
LET g:OmniFunc1Args = []
|
||||
call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
|
||||
call assert_equal([[23, 1, ''], [23, 0, 'sun']], g:OmniFunc1Args)
|
||||
setlocal omnifunc&
|
||||
call setline(1, 'sun')
|
||||
LET g:OmniFunc1Args = []
|
||||
call assert_fails('call feedkeys("A\<C-X>\<C-O>\<Esc>", "x")', 'E764:')
|
||||
call assert_equal([], g:OmniFunc1Args)
|
||||
:%bw!
|
||||
END
|
||||
call v9.CheckLegacyAndVim9Success(lines)
|
||||
|
||||
|
||||
@@ -255,13 +255,37 @@ func Test_tagfunc_callback()
|
||||
call assert_fails("set tagfunc=funcref('abc')", "E700:")
|
||||
|
||||
#" set 'tagfunc' to a non-existing function
|
||||
LET &tagfunc = function('g:TagFunc2', [21])
|
||||
LET &tagfunc = function('g:TagFunc2')
|
||||
LET g:TagFunc2Args = []
|
||||
call assert_fails("set tagfunc=function('NonExistingFunc')", 'E700:')
|
||||
call assert_fails("LET &tagfunc = function('NonExistingFunc')", 'E700:')
|
||||
call assert_fails("tag axb123", 'E426:')
|
||||
call assert_equal([], g:TagFunc2Args)
|
||||
call assert_fails("tag axb123", 'E433:')
|
||||
call assert_equal(['axb123', '', {}], g:TagFunc2Args)
|
||||
bw!
|
||||
|
||||
#" :setlocal and :setglobal
|
||||
set tagfunc&
|
||||
setlocal tagfunc=function('g:TagFunc1',\ [22])
|
||||
LET g:TagFunc1Args = []
|
||||
call assert_fails("tag a22", 'E433:')
|
||||
call assert_equal([22, 'a22', '', {}], g:TagFunc1Args)
|
||||
new
|
||||
LET g:TagFunc1Args = []
|
||||
call assert_fails("tag a22", 'E433:')
|
||||
call assert_equal([], g:TagFunc1Args)
|
||||
bw!
|
||||
setglobal tagfunc=function('g:TagFunc1',\ [23])
|
||||
call assert_fails("tag a22", 'E433:')
|
||||
call assert_equal([22, 'a22', '', {}], g:TagFunc1Args)
|
||||
new
|
||||
LET g:TagFunc1Args = []
|
||||
call assert_fails("tag a23", 'E433:')
|
||||
call assert_equal([23, 'a23', '', {}], g:TagFunc1Args)
|
||||
setlocal tagfunc&
|
||||
LET g:TagFunc1Args = []
|
||||
call assert_fails("tag a23", 'E433:')
|
||||
call assert_equal([], g:TagFunc1Args)
|
||||
:%bw!
|
||||
END
|
||||
call v9.CheckLegacyAndVim9Success(lines)
|
||||
|
||||
|
||||
@@ -734,6 +734,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1991,
|
||||
/**/
|
||||
1990,
|
||||
/**/
|
||||
|
||||
Reference in New Issue
Block a user