]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.1.0716: get warning message when 'completefunc' returns nothing v8.1.0716
authorBram Moolenaar <Bram@vim.org>
Fri, 11 Jan 2019 12:02:23 +0000 (13:02 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 11 Jan 2019 12:02:23 +0000 (13:02 +0100)
Problem:    Get warning message when 'completefunc' returns nothing.
Solution:   Allow for returning v:none to suppress the warning message.
            (Yasuhiro Matsumoto, closes #3789)

runtime/doc/insert.txt
src/edit.c
src/testdir/test_ins_complete.vim
src/version.c

index a200fc5ca8efd54fde7326cfd2873f30025920d6..e01eac932575a39431527e97f8a717724dee709d 100644 (file)
@@ -1076,6 +1076,10 @@ that contains the List.  The Dict can have these items:
                        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.
index bd840d1475666047ba5475ac318d5562b20485f5..bd6f606bba1414e15610ce5bc79e39c38ec741d7 100644 (file)
@@ -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))
+    // Show a message about what (completion) mode we're in.
+    if (!compl_opt_suppress_empty)
     {
-       if (edit_submode_extra != NULL)
+       showmode();
+       if (!shortmess(SHM_COMPLETIONMENU))
        {
-           if (!p_smd)
-               msg_attr(edit_submode_extra,
-                       edit_submode_highl < HLF_COUNT
-                       ? HL_ATTR(edit_submode_highl) : 0);
+           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"
        }
-       else
-           msg_clr_cmdline();  /* necessary for "noshowmode" */
     }
 
     /* Show the popup menu, unless we got interrupted. */
index e1c733f696cf95eb4aaca5b8383afaad244a6d14..6fb6e79e7dd910dd79c7d449b5e4920f7215975a 100644 (file)
@@ -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( findstart, base )
         \ }
 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_CheckCompletedItemDict()
   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_CheckCompletedItemDictNoUserData()
   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_CheckCompletedItemList()
   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
index eb55daf0df162b14e66fe64ec4bf980728ee56ce..9fffc2a9fd1684e4370a90d7160357a27321f961 100644 (file)
@@ -799,6 +799,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    716,
 /**/
     715,
 /**/