changeset 15416:5f8ddd2a7b92 v8.1.0716

patch 8.1.0716: get warning message when 'completefunc' returns nothing commit https://github.com/vim/vim/commit/cee9bc2e3dc5c16a9d2a8d0e23aa0d5fdefa3a4a Author: Bram Moolenaar <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Fri, 11 Jan 2019 13:15:06 +0100
parents ac4c62bf5b1b
children 50a5ad000845
files runtime/doc/insert.txt src/edit.c src/testdir/test_ins_complete.vim src/version.c
diffstat 4 files changed, 65 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- 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. */
--- 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 <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()
 
   set completefunc=<SID>CompleteDone_CompleteFuncDict
   execute "normal a\<C-X>\<C-U>\<C-Y>"
   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 <SID>CompleteDone_CheckCompletedItemDictNoUserData()
 
   set completefunc=<SID>CompleteDone_CompleteFuncDictNoUserData
   execute "normal a\<C-X>\<C-U>\<C-Y>"
   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 <SID>CompleteDone_CheckCompletedItemList()
 
   set completefunc=<SID>CompleteDone_CompleteFuncList
   execute "normal a\<C-X>\<C-U>\<C-Y>"
   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
--- 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,