mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.1.0716: get warning message when 'completefunc' returns nothing
Problem: Get warning message when 'completefunc' returns nothing. Solution: Allow for returning v:none to suppress the warning message. (Yasuhiro Matsumoto, closes #3789)
This commit is contained in:
@@ -1076,6 +1076,10 @@ that contains the List. The Dict can have these items:
|
|||||||
The only value currently recognized is "always", the
|
The only value currently recognized is "always", the
|
||||||
effect is that the function is called whenever the
|
effect is that the function is called whenever the
|
||||||
leading text is changed.
|
leading text is changed.
|
||||||
|
|
||||||
|
If you want to suppress the warning message for an empty result, return
|
||||||
|
v:none. This is useful to implement asynchronous completion with complete().
|
||||||
|
|
||||||
Other items are ignored.
|
Other items are ignored.
|
||||||
|
|
||||||
For acting upon end of completion, see the |CompleteDone| autocommand event.
|
For acting upon end of completion, see the |CompleteDone| autocommand event.
|
||||||
|
31
src/edit.c
31
src/edit.c
@@ -150,6 +150,7 @@ static int compl_cont_mode = 0;
|
|||||||
static expand_T compl_xp;
|
static expand_T compl_xp;
|
||||||
|
|
||||||
static int compl_opt_refresh_always = FALSE;
|
static int compl_opt_refresh_always = FALSE;
|
||||||
|
static int compl_opt_suppress_empty = FALSE;
|
||||||
|
|
||||||
static void ins_ctrl_x(void);
|
static void ins_ctrl_x(void);
|
||||||
static int has_compl_option(int dict_opt);
|
static int has_compl_option(int dict_opt);
|
||||||
@@ -4247,8 +4248,12 @@ expand_by_function(
|
|||||||
case VAR_DICT:
|
case VAR_DICT:
|
||||||
matchdict = rettv.vval.v_dict;
|
matchdict = rettv.vval.v_dict;
|
||||||
break;
|
break;
|
||||||
|
case VAR_SPECIAL:
|
||||||
|
if (rettv.vval.v_number == VVAL_NONE)
|
||||||
|
compl_opt_suppress_empty = TRUE;
|
||||||
|
// FALLTHROUGH
|
||||||
default:
|
default:
|
||||||
/* TODO: Give error message? */
|
// TODO: Give error message?
|
||||||
clear_tv(&rettv);
|
clear_tv(&rettv);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -5611,6 +5616,7 @@ ins_complete(int c, int enable_pum)
|
|||||||
* completion.
|
* completion.
|
||||||
*/
|
*/
|
||||||
compl_opt_refresh_always = FALSE;
|
compl_opt_refresh_always = FALSE;
|
||||||
|
compl_opt_suppress_empty = FALSE;
|
||||||
|
|
||||||
if (col < 0)
|
if (col < 0)
|
||||||
col = curs_col;
|
col = curs_col;
|
||||||
@@ -5860,19 +5866,22 @@ ins_complete(int c, int enable_pum)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Show a message about what (completion) mode we're in. */
|
// Show a message about what (completion) mode we're in.
|
||||||
showmode();
|
if (!compl_opt_suppress_empty)
|
||||||
if (!shortmess(SHM_COMPLETIONMENU))
|
|
||||||
{
|
{
|
||||||
if (edit_submode_extra != NULL)
|
showmode();
|
||||||
|
if (!shortmess(SHM_COMPLETIONMENU))
|
||||||
{
|
{
|
||||||
if (!p_smd)
|
if (edit_submode_extra != NULL)
|
||||||
msg_attr(edit_submode_extra,
|
{
|
||||||
edit_submode_highl < HLF_COUNT
|
if (!p_smd)
|
||||||
? HL_ATTR(edit_submode_highl) : 0);
|
msg_attr(edit_submode_extra,
|
||||||
|
edit_submode_highl < HLF_COUNT
|
||||||
|
? HL_ATTR(edit_submode_highl) : 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
msg_clr_cmdline(); // necessary for "noshowmode"
|
||||||
}
|
}
|
||||||
else
|
|
||||||
msg_clr_cmdline(); /* necessary for "noshowmode" */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Show the popup menu, unless we got interrupted. */
|
/* Show the popup menu, unless we got interrupted. */
|
||||||
|
@@ -142,6 +142,14 @@ func Test_completefunc_args()
|
|||||||
delfunc CompleteFunc
|
delfunc CompleteFunc
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func s:CompleteDone_CompleteFuncNone( findstart, base )
|
||||||
|
if a:findstart
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
return v:none
|
||||||
|
endfunc
|
||||||
|
|
||||||
func s:CompleteDone_CompleteFuncDict( findstart, base )
|
func s:CompleteDone_CompleteFuncDict( findstart, base )
|
||||||
if a:findstart
|
if a:findstart
|
||||||
return 0
|
return 0
|
||||||
@@ -161,6 +169,10 @@ func s:CompleteDone_CompleteFuncDict( findstart, base )
|
|||||||
\ }
|
\ }
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func s:CompleteDone_CheckCompletedItemNone()
|
||||||
|
let s:called_completedone = 1
|
||||||
|
endfunc
|
||||||
|
|
||||||
func s:CompleteDone_CheckCompletedItemDict()
|
func s:CompleteDone_CheckCompletedItemDict()
|
||||||
call assert_equal( 'aword', v:completed_item[ 'word' ] )
|
call assert_equal( 'aword', v:completed_item[ 'word' ] )
|
||||||
call assert_equal( 'wrd', v:completed_item[ 'abbr' ] )
|
call assert_equal( 'wrd', v:completed_item[ 'abbr' ] )
|
||||||
@@ -172,21 +184,34 @@ func s:CompleteDone_CheckCompletedItemDict()
|
|||||||
let s:called_completedone = 1
|
let s:called_completedone = 1
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function Test_CompleteDoneDict()
|
func Test_CompleteDoneNone()
|
||||||
|
au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemNone()
|
||||||
|
|
||||||
|
set completefunc=<SID>CompleteDone_CompleteFuncNone
|
||||||
|
execute "normal a\<C-X>\<C-U>\<C-Y>"
|
||||||
|
set completefunc&
|
||||||
|
|
||||||
|
call assert_true(s:called_completedone)
|
||||||
|
|
||||||
|
let s:called_completedone = 0
|
||||||
|
au! CompleteDone
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_CompleteDoneDict()
|
||||||
au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemDict()
|
au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemDict()
|
||||||
|
|
||||||
set completefunc=<SID>CompleteDone_CompleteFuncDict
|
set completefunc=<SID>CompleteDone_CompleteFuncDict
|
||||||
execute "normal a\<C-X>\<C-U>\<C-Y>"
|
execute "normal a\<C-X>\<C-U>\<C-Y>"
|
||||||
set completefunc&
|
set completefunc&
|
||||||
|
|
||||||
call assert_equal( 'test', v:completed_item[ 'user_data' ] )
|
call assert_equal('test', v:completed_item[ 'user_data' ])
|
||||||
call assert_true( s:called_completedone )
|
call assert_true(s:called_completedone)
|
||||||
|
|
||||||
let s:called_completedone = 0
|
let s:called_completedone = 0
|
||||||
au! CompleteDone
|
au! CompleteDone
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func s:CompleteDone_CompleteFuncDictNoUserData( findstart, base )
|
func s:CompleteDone_CompleteFuncDictNoUserData(findstart, base)
|
||||||
if a:findstart
|
if a:findstart
|
||||||
return 0
|
return 0
|
||||||
endif
|
endif
|
||||||
@@ -215,21 +240,21 @@ func s:CompleteDone_CheckCompletedItemDictNoUserData()
|
|||||||
let s:called_completedone = 1
|
let s:called_completedone = 1
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function Test_CompleteDoneDictNoUserData()
|
func Test_CompleteDoneDictNoUserData()
|
||||||
au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemDictNoUserData()
|
au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemDictNoUserData()
|
||||||
|
|
||||||
set completefunc=<SID>CompleteDone_CompleteFuncDictNoUserData
|
set completefunc=<SID>CompleteDone_CompleteFuncDictNoUserData
|
||||||
execute "normal a\<C-X>\<C-U>\<C-Y>"
|
execute "normal a\<C-X>\<C-U>\<C-Y>"
|
||||||
set completefunc&
|
set completefunc&
|
||||||
|
|
||||||
call assert_equal( '', v:completed_item[ 'user_data' ] )
|
call assert_equal('', v:completed_item[ 'user_data' ])
|
||||||
call assert_true( s:called_completedone )
|
call assert_true(s:called_completedone)
|
||||||
|
|
||||||
let s:called_completedone = 0
|
let s:called_completedone = 0
|
||||||
au! CompleteDone
|
au! CompleteDone
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func s:CompleteDone_CompleteFuncList( findstart, base )
|
func s:CompleteDone_CompleteFuncList(findstart, base)
|
||||||
if a:findstart
|
if a:findstart
|
||||||
return 0
|
return 0
|
||||||
endif
|
endif
|
||||||
@@ -248,15 +273,15 @@ func s:CompleteDone_CheckCompletedItemList()
|
|||||||
let s:called_completedone = 1
|
let s:called_completedone = 1
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function Test_CompleteDoneList()
|
func Test_CompleteDoneList()
|
||||||
au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemList()
|
au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemList()
|
||||||
|
|
||||||
set completefunc=<SID>CompleteDone_CompleteFuncList
|
set completefunc=<SID>CompleteDone_CompleteFuncList
|
||||||
execute "normal a\<C-X>\<C-U>\<C-Y>"
|
execute "normal a\<C-X>\<C-U>\<C-Y>"
|
||||||
set completefunc&
|
set completefunc&
|
||||||
|
|
||||||
call assert_equal( '', v:completed_item[ 'user_data' ] )
|
call assert_equal('', v:completed_item[ 'user_data' ])
|
||||||
call assert_true( s:called_completedone )
|
call assert_true(s:called_completedone)
|
||||||
|
|
||||||
let s:called_completedone = 0
|
let s:called_completedone = 0
|
||||||
au! CompleteDone
|
au! CompleteDone
|
||||||
|
@@ -799,6 +799,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
716,
|
||||||
/**/
|
/**/
|
||||||
715,
|
715,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user