feat(eval)!: input() support any type for "cancelreturn" in a dict (#19357)

This commit is contained in:
zeertzjq 2022-07-14 14:47:25 +08:00 committed by GitHub
parent 778541067a
commit b93cb481a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 19 deletions

View File

@ -350,7 +350,8 @@ Commands:
Functions: Functions:
|input()| and |inputdialog()| support for each others features (return on |input()| and |inputdialog()| support for each others features (return on
cancel and completion respectively) via dictionary argument (replaces all cancel and completion respectively) via dictionary argument (replaces all
other arguments if used). other arguments if used), and "cancelreturn" can have any type if passed in
a dictionary.
|input()| and |inputdialog()| support user-defined cmdline highlighting. |input()| and |inputdialog()| support user-defined cmdline highlighting.
Highlight groups: Highlight groups:

View File

@ -6554,7 +6554,8 @@ void get_user_input(const typval_T *const argvars, typval_T *const rettv, const
const char *prompt = ""; const char *prompt = "";
const char *defstr = ""; const char *defstr = "";
const char *cancelreturn = NULL; typval_T *cancelreturn = NULL;
typval_T cancelreturn_strarg2 = TV_INITIAL_VALUE;
const char *xp_name = NULL; const char *xp_name = NULL;
Callback input_callback = { .type = kCallbackNone }; Callback input_callback = { .type = kCallbackNone };
char prompt_buf[NUMBUFLEN]; char prompt_buf[NUMBUFLEN];
@ -6576,13 +6577,9 @@ void get_user_input(const typval_T *const argvars, typval_T *const rettv, const
if (defstr == NULL) { if (defstr == NULL) {
return; return;
} }
cancelreturn = tv_dict_get_string_buf_chk(dict, S_LEN("cancelreturn"), dictitem_T *cancelreturn_di = tv_dict_find(dict, S_LEN("cancelreturn"));
cancelreturn_buf, def); if (cancelreturn_di != NULL) {
if (cancelreturn == NULL) { // error cancelreturn = &cancelreturn_di->di_tv;
return;
}
if (*cancelreturn == NUL) {
cancelreturn = NULL;
} }
xp_name = tv_dict_get_string_buf_chk(dict, S_LEN("completion"), xp_name = tv_dict_get_string_buf_chk(dict, S_LEN("completion"),
xp_name_buf, def); xp_name_buf, def);
@ -6606,15 +6603,16 @@ void get_user_input(const typval_T *const argvars, typval_T *const rettv, const
return; return;
} }
if (argvars[2].v_type != VAR_UNKNOWN) { if (argvars[2].v_type != VAR_UNKNOWN) {
const char *const arg2 = tv_get_string_buf_chk(&argvars[2], const char *const strarg2 = tv_get_string_buf_chk(&argvars[2], cancelreturn_buf);
cancelreturn_buf); if (strarg2 == NULL) {
if (arg2 == NULL) {
return; return;
} }
if (inputdialog) { if (inputdialog) {
cancelreturn = arg2; cancelreturn_strarg2.v_type = VAR_STRING;
cancelreturn_strarg2.vval.v_string = (char *)strarg2;
cancelreturn = &cancelreturn_strarg2;
} else { } else {
xp_name = arg2; xp_name = strarg2;
} }
} }
} }
@ -6662,7 +6660,7 @@ void get_user_input(const typval_T *const argvars, typval_T *const rettv, const
callback_free(&input_callback); callback_free(&input_callback);
if (rettv->vval.v_string == NULL && cancelreturn != NULL) { if (rettv->vval.v_string == NULL && cancelreturn != NULL) {
rettv->vval.v_string = xstrdup(cancelreturn); tv_copy(cancelreturn, rettv);
} }
xfree(xp_arg); xfree(xp_arg);

View File

@ -9,6 +9,7 @@ local source = helpers.source
local command = helpers.command local command = helpers.command
local exc_exec = helpers.exc_exec local exc_exec = helpers.exc_exec
local nvim_async = helpers.nvim_async local nvim_async = helpers.nvim_async
local NIL = helpers.NIL
local screen local screen
@ -200,6 +201,15 @@ describe('input()', function()
feed(':let var = input({"cancelreturn": "BAR"})<CR>') feed(':let var = input({"cancelreturn": "BAR"})<CR>')
feed('<Esc>') feed('<Esc>')
eq('BAR', meths.get_var('var')) eq('BAR', meths.get_var('var'))
feed(':let var = input({"cancelreturn": []})<CR>')
feed('<Esc>')
eq({}, meths.get_var('var'))
feed(':let var = input({"cancelreturn": v:false})<CR>')
feed('<Esc>')
eq(false, meths.get_var('var'))
feed(':let var = input({"cancelreturn": v:null})<CR>')
feed('<Esc>')
eq(NIL, meths.get_var('var'))
end) end)
it('supports default string', function() it('supports default string', function()
feed(':let var = input("", "DEF1")<CR>') feed(':let var = input("", "DEF1")<CR>')
@ -219,8 +229,6 @@ describe('input()', function()
exc_exec('call input("", "", [])')) exc_exec('call input("", "", [])'))
eq('Vim(call):E730: using List as a String', eq('Vim(call):E730: using List as a String',
exc_exec('call input({"prompt": []})')) exc_exec('call input({"prompt": []})'))
eq('Vim(call):E730: using List as a String',
exc_exec('call input({"cancelreturn": []})'))
eq('Vim(call):E730: using List as a String', eq('Vim(call):E730: using List as a String',
exc_exec('call input({"default": []})')) exc_exec('call input({"default": []})'))
eq('Vim(call):E730: using List as a String', eq('Vim(call):E730: using List as a String',
@ -417,8 +425,6 @@ describe('inputdialog()', function()
exc_exec('call inputdialog("", "", [])')) exc_exec('call inputdialog("", "", [])'))
eq('Vim(call):E730: using List as a String', eq('Vim(call):E730: using List as a String',
exc_exec('call inputdialog({"prompt": []})')) exc_exec('call inputdialog({"prompt": []})'))
eq('Vim(call):E730: using List as a String',
exc_exec('call inputdialog({"cancelreturn": []})'))
eq('Vim(call):E730: using List as a String', eq('Vim(call):E730: using List as a String',
exc_exec('call inputdialog({"default": []})')) exc_exec('call inputdialog({"default": []})'))
eq('Vim(call):E730: using List as a String', eq('Vim(call):E730: using List as a String',