summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-01-11 13:02:23 +0100
committerBram Moolenaar <Bram@vim.org>2019-01-11 13:02:23 +0100
commitcee9bc2e3dc5c16a9d2a8d0e23aa0d5fdefa3a4a (patch)
tree3459c3d301a0dfcb6669b6e5aa3b50597ccb0c0e
parent6f7e555f7440df148350468ad8bc6d559d676d7c (diff)
patch 8.1.0716: get warning message when 'completefunc' returns nothingv8.1.0716
Problem: Get warning message when 'completefunc' returns nothing. Solution: Allow for returning v:none to suppress the warning message. (Yasuhiro Matsumoto, closes #3789)
-rw-r--r--runtime/doc/insert.txt4
-rw-r--r--src/edit.c31
-rw-r--r--src/testdir/test_ins_complete.vim47
-rw-r--r--src/version.c2
4 files changed, 62 insertions, 22 deletions
diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt
index a200fc5ca8..e01eac9325 100644
--- a/runtime/doc/insert.txt
+++ b/runtime/doc/insert.txt
@@ -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.
diff --git a/src/edit.c b/src/edit.c
index bd840d1475..bd6f606bba 100644
--- 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))
+ // 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. */
diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim
index e1c733f696..6fb6e79e7d 100644
--- 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( 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
diff --git a/src/version.c b/src/version.c
index eb55daf0df..9fffc2a9fd 100644
--- 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,