# HG changeset patch # User Bram Moolenaar # Date 1547208906 -3600 # Node ID 5f8ddd2a7b926630b755b7171334ac4e322bf012 # Parent ac4c62bf5b1b43034eb2ff7d32a16e7c17913351 patch 8.1.0716: get warning message when 'completefunc' returns nothing commit https://github.com/vim/vim/commit/cee9bc2e3dc5c16a9d2a8d0e23aa0d5fdefa3a4a Author: Bram Moolenaar Date: Fri Jan 11 13:02:23 2019 +0100 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) diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt --- a/runtime/doc/insert.txt +++ b/runtime/doc/insert.txt @@ -1076,6 +1076,10 @@ that contains the List. The Dict can ha The only value currently recognized is "always", the effect is that the function is called whenever the 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. For acting upon end of completion, see the |CompleteDone| autocommand event. diff --git a/src/edit.c b/src/edit.c --- a/src/edit.c +++ b/src/edit.c @@ -150,6 +150,7 @@ static int compl_cont_mode = 0; static expand_T compl_xp; static int compl_opt_refresh_always = FALSE; +static int compl_opt_suppress_empty = FALSE; static void ins_ctrl_x(void); static int has_compl_option(int dict_opt); @@ -4247,8 +4248,12 @@ expand_by_function( case VAR_DICT: matchdict = rettv.vval.v_dict; break; + case VAR_SPECIAL: + if (rettv.vval.v_number == VVAL_NONE) + compl_opt_suppress_empty = TRUE; + // FALLTHROUGH default: - /* TODO: Give error message? */ + // TODO: Give error message? clear_tv(&rettv); break; } @@ -5611,6 +5616,7 @@ ins_complete(int c, int enable_pum) * completion. */ compl_opt_refresh_always = FALSE; + compl_opt_suppress_empty = FALSE; if (col < 0) col = curs_col; @@ -5860,19 +5866,22 @@ ins_complete(int c, int enable_pum) } } - /* Show a message about what (completion) mode we're in. */ - showmode(); - if (!shortmess(SHM_COMPLETIONMENU)) - { - if (edit_submode_extra != NULL) - { - if (!p_smd) - msg_attr(edit_submode_extra, - edit_submode_highl < HLF_COUNT - ? HL_ATTR(edit_submode_highl) : 0); - } - else - msg_clr_cmdline(); /* necessary for "noshowmode" */ + // Show a message about what (completion) mode we're in. + if (!compl_opt_suppress_empty) + { + showmode(); + if (!shortmess(SHM_COMPLETIONMENU)) + { + if (edit_submode_extra != NULL) + { + if (!p_smd) + msg_attr(edit_submode_extra, + edit_submode_highl < HLF_COUNT + ? HL_ATTR(edit_submode_highl) : 0); + } + else + msg_clr_cmdline(); // necessary for "noshowmode" + } } /* Show the popup menu, unless we got interrupted. */ diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -142,6 +142,14 @@ func Test_completefunc_args() delfunc CompleteFunc endfunc +func s:CompleteDone_CompleteFuncNone( findstart, base ) + if a:findstart + return 0 + endif + + return v:none +endfunc + func s:CompleteDone_CompleteFuncDict( findstart, base ) if a:findstart return 0 @@ -161,6 +169,10 @@ func s:CompleteDone_CompleteFuncDict( fi \ } endfunc +func s:CompleteDone_CheckCompletedItemNone() + let s:called_completedone = 1 +endfunc + func s:CompleteDone_CheckCompletedItemDict() call assert_equal( 'aword', v:completed_item[ 'word' ] ) call assert_equal( 'wrd', v:completed_item[ 'abbr' ] ) @@ -172,21 +184,34 @@ func s:CompleteDone_CheckCompletedItemDi let s:called_completedone = 1 endfunc -function Test_CompleteDoneDict() +func Test_CompleteDoneNone() + au CompleteDone * :call CompleteDone_CheckCompletedItemNone() + + set completefunc=CompleteDone_CompleteFuncNone + execute "normal a\\\" + set completefunc& + + call assert_true(s:called_completedone) + + let s:called_completedone = 0 + au! CompleteDone +endfunc + +func Test_CompleteDoneDict() au CompleteDone * :call CompleteDone_CheckCompletedItemDict() set completefunc=CompleteDone_CompleteFuncDict execute "normal a\\\" set completefunc& - call assert_equal( 'test', v:completed_item[ 'user_data' ] ) - call assert_true( s:called_completedone ) + call assert_equal('test', v:completed_item[ 'user_data' ]) + call assert_true(s:called_completedone) let s:called_completedone = 0 au! CompleteDone endfunc -func s:CompleteDone_CompleteFuncDictNoUserData( findstart, base ) +func s:CompleteDone_CompleteFuncDictNoUserData(findstart, base) if a:findstart return 0 endif @@ -215,21 +240,21 @@ func s:CompleteDone_CheckCompletedItemDi let s:called_completedone = 1 endfunc -function Test_CompleteDoneDictNoUserData() +func Test_CompleteDoneDictNoUserData() au CompleteDone * :call CompleteDone_CheckCompletedItemDictNoUserData() set completefunc=CompleteDone_CompleteFuncDictNoUserData execute "normal a\\\" set completefunc& - call assert_equal( '', v:completed_item[ 'user_data' ] ) - call assert_true( s:called_completedone ) + call assert_equal('', v:completed_item[ 'user_data' ]) + call assert_true(s:called_completedone) let s:called_completedone = 0 au! CompleteDone endfunc -func s:CompleteDone_CompleteFuncList( findstart, base ) +func s:CompleteDone_CompleteFuncList(findstart, base) if a:findstart return 0 endif @@ -248,15 +273,15 @@ func s:CompleteDone_CheckCompletedItemLi let s:called_completedone = 1 endfunc -function Test_CompleteDoneList() +func Test_CompleteDoneList() au CompleteDone * :call CompleteDone_CheckCompletedItemList() set completefunc=CompleteDone_CompleteFuncList execute "normal a\\\" set completefunc& - call assert_equal( '', v:completed_item[ 'user_data' ] ) - call assert_true( s:called_completedone ) + call assert_equal('', v:completed_item[ 'user_data' ]) + call assert_true(s:called_completedone) let s:called_completedone = 0 au! CompleteDone diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -800,6 +800,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 716, +/**/ 715, /**/ 714,