0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.0459: cannot check if a function name is correct

Problem:    Cannot check if a function name is correct.
Solution:   Add "?funcname" to exists().
This commit is contained in:
Bram Moolenaar 2020-03-26 22:16:48 +01:00
parent bea9023d42
commit 15c476023f
5 changed files with 307 additions and 213 deletions

View File

@ -4102,8 +4102,12 @@ exists({expr}) The result is a Number, which is |TRUE| if {expr} is defined,
string) string)
*funcname built-in function (see |functions|) *funcname built-in function (see |functions|)
or user defined function (see or user defined function (see
|user-functions|). Also works for a |user-functions|) that is implemented.
variable that is a Funcref. Also works for a variable that is a
Funcref.
?funcname built-in function that could be
implemented; to be used to check if
"funcname" is valid
varname internal variable (see varname internal variable (see
|internal-variables|). Also works |internal-variables|). Also works
for |curly-braces-names|, |Dictionary| for |curly-braces-names|, |Dictionary|

View File

@ -374,12 +374,51 @@ typedef struct
#define FEARG_4 4 // base is the fourth argument #define FEARG_4 4 // base is the fourth argument
#define FEARG_LAST 9 // base is the last argument #define FEARG_LAST 9 // base is the last argument
#ifdef FEAT_FLOAT
# define FLOAT_FUNC(name) name
#else
# define FLOAT_FUNC(name) NULL
#endif
#if defined(FEAT_FLOAT) && defined(HAVE_MATH_H)
# define MATH_FUNC(name) name
#else
# define MATH_FUNC(name) NULL
#endif
#ifdef FEAT_TIMERS
# define TIMER_FUNC(name) name
#else
# define TIMER_FUNC(name) NULL
#endif
#ifdef FEAT_JOB_CHANNEL
# define JOB_FUNC(name) name
#else
# define JOB_FUNC(name) NULL
#endif
#ifdef FEAT_PROP_POPUP
# define PROP_FUNC(name) name
#else
# define PROP_FUNC(name) NULL
#endif
#ifdef FEAT_SIGNS
# define SIGN_FUNC(name) name
#else
# define SIGN_FUNC(name) NULL
#endif
#ifdef FEAT_SOUND
# define SOUND_FUNC(name) name
#else
# define SOUND_FUNC(name) NULL
#endif
#ifdef FEAT_TERMINAL
# define TERM_FUNC(name) name
#else
# define TERM_FUNC(name) NULL
#endif
static funcentry_T global_functions[] = static funcentry_T global_functions[] =
{ {
#ifdef FEAT_FLOAT {"abs", 1, 1, FEARG_1, ret_any, FLOAT_FUNC(f_abs)},
{"abs", 1, 1, FEARG_1, ret_any, f_abs}, {"acos", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_acos)},
{"acos", 1, 1, FEARG_1, ret_float, f_acos}, // WJMc
#endif
{"add", 2, 2, FEARG_1, ret_any, f_add}, {"add", 2, 2, FEARG_1, ret_any, f_add},
{"and", 2, 2, FEARG_1, ret_number, f_and}, {"and", 2, 2, FEARG_1, ret_number, f_and},
{"append", 2, 2, FEARG_LAST, ret_number, f_append}, {"append", 2, 2, FEARG_LAST, ret_number, f_append},
@ -388,9 +427,7 @@ static funcentry_T global_functions[] =
{"argidx", 0, 0, 0, ret_number, f_argidx}, {"argidx", 0, 0, 0, ret_number, f_argidx},
{"arglistid", 0, 2, 0, ret_number, f_arglistid}, {"arglistid", 0, 2, 0, ret_number, f_arglistid},
{"argv", 0, 2, 0, ret_any, f_argv}, {"argv", 0, 2, 0, ret_any, f_argv},
#ifdef FEAT_FLOAT {"asin", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_asin)},
{"asin", 1, 1, FEARG_1, ret_float, f_asin}, // WJMc
#endif
{"assert_beeps", 1, 2, FEARG_1, ret_number, f_assert_beeps}, {"assert_beeps", 1, 2, FEARG_1, ret_number, f_assert_beeps},
{"assert_equal", 2, 3, FEARG_2, ret_number, f_assert_equal}, {"assert_equal", 2, 3, FEARG_2, ret_number, f_assert_equal},
{"assert_equalfile", 2, 2, FEARG_1, ret_number, f_assert_equalfile}, {"assert_equalfile", 2, 2, FEARG_1, ret_number, f_assert_equalfile},
@ -403,17 +440,29 @@ static funcentry_T global_functions[] =
{"assert_notmatch", 2, 3, FEARG_2, ret_number, f_assert_notmatch}, {"assert_notmatch", 2, 3, FEARG_2, ret_number, f_assert_notmatch},
{"assert_report", 1, 1, FEARG_1, ret_number, f_assert_report}, {"assert_report", 1, 1, FEARG_1, ret_number, f_assert_report},
{"assert_true", 1, 2, FEARG_1, ret_number, f_assert_true}, {"assert_true", 1, 2, FEARG_1, ret_number, f_assert_true},
#ifdef FEAT_FLOAT {"atan", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_atan)},
{"atan", 1, 1, FEARG_1, ret_float, f_atan}, {"atan2", 2, 2, FEARG_1, ret_float, FLOAT_FUNC(f_atan2)},
{"atan2", 2, 2, FEARG_1, ret_float, f_atan2}, {"balloon_gettext", 0, 0, 0, ret_string,
#endif
#ifdef FEAT_BEVAL #ifdef FEAT_BEVAL
{"balloon_gettext", 0, 0, 0, ret_string, f_balloon_gettext}, f_balloon_gettext
{"balloon_show", 1, 1, FEARG_1, ret_void, f_balloon_show}, #else
# if defined(FEAT_BEVAL_TERM) NULL
{"balloon_split", 1, 1, FEARG_1, ret_list_string, f_balloon_split},
# endif
#endif #endif
},
{"balloon_show", 1, 1, FEARG_1, ret_void,
#ifdef FEAT_BEVAL
f_balloon_show
#else
NULL
#endif
},
{"balloon_split", 1, 1, FEARG_1, ret_list_string,
#if defined(FEAT_BEVAL_TERM)
f_balloon_split
#else
NULL
#endif
},
{"browse", 4, 4, 0, ret_string, f_browse}, {"browse", 4, 4, 0, ret_string, f_browse},
{"browsedir", 2, 2, 0, ret_string, f_browsedir}, {"browsedir", 2, 2, 0, ret_string, f_browsedir},
{"bufadd", 1, 1, FEARG_1, ret_number, f_bufadd}, {"bufadd", 1, 1, FEARG_1, ret_number, f_bufadd},
@ -432,29 +481,25 @@ static funcentry_T global_functions[] =
{"byteidx", 2, 2, FEARG_1, ret_number, f_byteidx}, {"byteidx", 2, 2, FEARG_1, ret_number, f_byteidx},
{"byteidxcomp", 2, 2, FEARG_1, ret_number, f_byteidxcomp}, {"byteidxcomp", 2, 2, FEARG_1, ret_number, f_byteidxcomp},
{"call", 2, 3, FEARG_1, ret_any, f_call}, {"call", 2, 3, FEARG_1, ret_any, f_call},
#ifdef FEAT_FLOAT {"ceil", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_ceil)},
{"ceil", 1, 1, FEARG_1, ret_float, f_ceil}, {"ch_canread", 1, 1, FEARG_1, ret_number, JOB_FUNC(f_ch_canread)},
#endif {"ch_close", 1, 1, FEARG_1, ret_void, JOB_FUNC(f_ch_close)},
#ifdef FEAT_JOB_CHANNEL {"ch_close_in", 1, 1, FEARG_1, ret_void, JOB_FUNC(f_ch_close_in)},
{"ch_canread", 1, 1, FEARG_1, ret_number, f_ch_canread}, {"ch_evalexpr", 2, 3, FEARG_1, ret_any, JOB_FUNC(f_ch_evalexpr)},
{"ch_close", 1, 1, FEARG_1, ret_void, f_ch_close}, {"ch_evalraw", 2, 3, FEARG_1, ret_any, JOB_FUNC(f_ch_evalraw)},
{"ch_close_in", 1, 1, FEARG_1, ret_void, f_ch_close_in}, {"ch_getbufnr", 2, 2, FEARG_1, ret_number, JOB_FUNC(f_ch_getbufnr)},
{"ch_evalexpr", 2, 3, FEARG_1, ret_any, f_ch_evalexpr}, {"ch_getjob", 1, 1, FEARG_1, ret_job, JOB_FUNC(f_ch_getjob)},
{"ch_evalraw", 2, 3, FEARG_1, ret_any, f_ch_evalraw}, {"ch_info", 1, 1, FEARG_1, ret_dict_any, JOB_FUNC(f_ch_info)},
{"ch_getbufnr", 2, 2, FEARG_1, ret_number, f_ch_getbufnr}, {"ch_log", 1, 2, FEARG_1, ret_void, JOB_FUNC(f_ch_log)},
{"ch_getjob", 1, 1, FEARG_1, ret_job, f_ch_getjob}, {"ch_logfile", 1, 2, FEARG_1, ret_void, JOB_FUNC(f_ch_logfile)},
{"ch_info", 1, 1, FEARG_1, ret_dict_any, f_ch_info}, {"ch_open", 1, 2, FEARG_1, ret_channel, JOB_FUNC(f_ch_open)},
{"ch_log", 1, 2, FEARG_1, ret_void, f_ch_log}, {"ch_read", 1, 2, FEARG_1, ret_string, JOB_FUNC(f_ch_read)},
{"ch_logfile", 1, 2, FEARG_1, ret_void, f_ch_logfile}, {"ch_readblob", 1, 2, FEARG_1, ret_blob, JOB_FUNC(f_ch_readblob)},
{"ch_open", 1, 2, FEARG_1, ret_channel, f_ch_open}, {"ch_readraw", 1, 2, FEARG_1, ret_string, JOB_FUNC(f_ch_readraw)},
{"ch_read", 1, 2, FEARG_1, ret_string, f_ch_read}, {"ch_sendexpr", 2, 3, FEARG_1, ret_void, JOB_FUNC(f_ch_sendexpr)},
{"ch_readblob", 1, 2, FEARG_1, ret_blob, f_ch_readblob}, {"ch_sendraw", 2, 3, FEARG_1, ret_void, JOB_FUNC(f_ch_sendraw)},
{"ch_readraw", 1, 2, FEARG_1, ret_string, f_ch_readraw}, {"ch_setoptions", 2, 2, FEARG_1, ret_void, JOB_FUNC(f_ch_setoptions)},
{"ch_sendexpr", 2, 3, FEARG_1, ret_void, f_ch_sendexpr}, {"ch_status", 1, 2, FEARG_1, ret_string, JOB_FUNC(f_ch_status)},
{"ch_sendraw", 2, 3, FEARG_1, ret_void, f_ch_sendraw},
{"ch_setoptions", 2, 2, FEARG_1, ret_void, f_ch_setoptions},
{"ch_status", 1, 2, FEARG_1, ret_string, f_ch_status},
#endif
{"changenr", 0, 0, 0, ret_number, f_changenr}, {"changenr", 0, 0, 0, ret_number, f_changenr},
{"char2nr", 1, 2, FEARG_1, ret_number, f_char2nr}, {"char2nr", 1, 2, FEARG_1, ret_number, f_char2nr},
{"chdir", 1, 1, FEARG_1, ret_string, f_chdir}, {"chdir", 1, 1, FEARG_1, ret_string, f_chdir},
@ -467,16 +512,18 @@ static funcentry_T global_functions[] =
{"complete_info", 0, 1, FEARG_1, ret_dict_any, f_complete_info}, {"complete_info", 0, 1, FEARG_1, ret_dict_any, f_complete_info},
{"confirm", 1, 4, FEARG_1, ret_number, f_confirm}, {"confirm", 1, 4, FEARG_1, ret_number, f_confirm},
{"copy", 1, 1, FEARG_1, ret_any, f_copy}, {"copy", 1, 1, FEARG_1, ret_any, f_copy},
#ifdef FEAT_FLOAT {"cos", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_cos)},
{"cos", 1, 1, FEARG_1, ret_float, f_cos}, {"cosh", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_cosh)},
{"cosh", 1, 1, FEARG_1, ret_float, f_cosh},
#endif
{"count", 2, 4, FEARG_1, ret_number, f_count}, {"count", 2, 4, FEARG_1, ret_number, f_count},
{"cscope_connection",0,3, 0, ret_number, f_cscope_connection}, {"cscope_connection",0,3, 0, ret_number, f_cscope_connection},
{"cursor", 1, 3, FEARG_1, ret_number, f_cursor}, {"cursor", 1, 3, FEARG_1, ret_number, f_cursor},
{"debugbreak", 1, 1, FEARG_1, ret_number,
#ifdef MSWIN #ifdef MSWIN
{"debugbreak", 1, 1, FEARG_1, ret_number, f_debugbreak}, f_debugbreak
#else
NULL
#endif #endif
},
{"deepcopy", 1, 2, FEARG_1, ret_any, f_deepcopy}, {"deepcopy", 1, 2, FEARG_1, ret_any, f_deepcopy},
{"delete", 1, 2, FEARG_1, ret_number, f_delete}, {"delete", 1, 2, FEARG_1, ret_number, f_delete},
{"deletebufline", 2, 3, FEARG_1, ret_number, f_deletebufline}, {"deletebufline", 2, 3, FEARG_1, ret_number, f_deletebufline},
@ -493,9 +540,7 @@ static funcentry_T global_functions[] =
{"execute", 1, 2, FEARG_1, ret_string, f_execute}, {"execute", 1, 2, FEARG_1, ret_string, f_execute},
{"exepath", 1, 1, FEARG_1, ret_string, f_exepath}, {"exepath", 1, 1, FEARG_1, ret_string, f_exepath},
{"exists", 1, 1, FEARG_1, ret_number, f_exists}, {"exists", 1, 1, FEARG_1, ret_number, f_exists},
#ifdef FEAT_FLOAT {"exp", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_exp)},
{"exp", 1, 1, FEARG_1, ret_float, f_exp},
#endif
{"expand", 1, 3, FEARG_1, ret_any, f_expand}, {"expand", 1, 3, FEARG_1, ret_any, f_expand},
{"expandcmd", 1, 1, FEARG_1, ret_string, f_expandcmd}, {"expandcmd", 1, 1, FEARG_1, ret_string, f_expandcmd},
{"extend", 2, 3, FEARG_1, ret_any, f_extend}, {"extend", 2, 3, FEARG_1, ret_any, f_extend},
@ -506,11 +551,9 @@ static funcentry_T global_functions[] =
{"filter", 2, 2, FEARG_1, ret_any, f_filter}, {"filter", 2, 2, FEARG_1, ret_any, f_filter},
{"finddir", 1, 3, FEARG_1, ret_string, f_finddir}, {"finddir", 1, 3, FEARG_1, ret_string, f_finddir},
{"findfile", 1, 3, FEARG_1, ret_string, f_findfile}, {"findfile", 1, 3, FEARG_1, ret_string, f_findfile},
#ifdef FEAT_FLOAT {"float2nr", 1, 1, FEARG_1, ret_number, FLOAT_FUNC(f_float2nr)},
{"float2nr", 1, 1, FEARG_1, ret_number, f_float2nr}, {"floor", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_floor)},
{"floor", 1, 1, FEARG_1, ret_float, f_floor}, {"fmod", 2, 2, FEARG_1, ret_float, FLOAT_FUNC(f_fmod)},
{"fmod", 2, 2, FEARG_1, ret_float, f_fmod},
#endif
{"fnameescape", 1, 1, FEARG_1, ret_string, f_fnameescape}, {"fnameescape", 1, 1, FEARG_1, ret_string, f_fnameescape},
{"fnamemodify", 2, 2, FEARG_1, ret_string, f_fnamemodify}, {"fnamemodify", 2, 2, FEARG_1, ret_string, f_fnamemodify},
{"foldclosed", 1, 1, FEARG_1, ret_number, f_foldclosed}, {"foldclosed", 1, 1, FEARG_1, ret_number, f_foldclosed},
@ -592,22 +635,16 @@ static funcentry_T global_functions[] =
{"interrupt", 0, 0, 0, ret_void, f_interrupt}, {"interrupt", 0, 0, 0, ret_void, f_interrupt},
{"invert", 1, 1, FEARG_1, ret_number, f_invert}, {"invert", 1, 1, FEARG_1, ret_number, f_invert},
{"isdirectory", 1, 1, FEARG_1, ret_number, f_isdirectory}, {"isdirectory", 1, 1, FEARG_1, ret_number, f_isdirectory},
#if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) {"isinf", 1, 1, FEARG_1, ret_number, MATH_FUNC(f_isinf)},
{"isinf", 1, 1, FEARG_1, ret_number, f_isinf},
#endif
{"islocked", 1, 1, FEARG_1, ret_number, f_islocked}, {"islocked", 1, 1, FEARG_1, ret_number, f_islocked},
#if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) {"isnan", 1, 1, FEARG_1, ret_number, MATH_FUNC(f_isnan)},
{"isnan", 1, 1, FEARG_1, ret_number, f_isnan},
#endif
{"items", 1, 1, FEARG_1, ret_list_any, f_items}, {"items", 1, 1, FEARG_1, ret_list_any, f_items},
#ifdef FEAT_JOB_CHANNEL {"job_getchannel", 1, 1, FEARG_1, ret_channel, JOB_FUNC(f_job_getchannel)},
{"job_getchannel", 1, 1, FEARG_1, ret_channel, f_job_getchannel}, {"job_info", 0, 1, FEARG_1, ret_dict_any, JOB_FUNC(f_job_info)},
{"job_info", 0, 1, FEARG_1, ret_dict_any, f_job_info}, {"job_setoptions", 2, 2, FEARG_1, ret_void, JOB_FUNC(f_job_setoptions)},
{"job_setoptions", 2, 2, FEARG_1, ret_void, f_job_setoptions}, {"job_start", 1, 2, FEARG_1, ret_job, JOB_FUNC(f_job_start)},
{"job_start", 1, 2, FEARG_1, ret_job, f_job_start}, {"job_status", 1, 1, FEARG_1, ret_string, JOB_FUNC(f_job_status)},
{"job_status", 1, 1, FEARG_1, ret_string, f_job_status}, {"job_stop", 1, 2, FEARG_1, ret_number, JOB_FUNC(f_job_stop)},
{"job_stop", 1, 2, FEARG_1, ret_number, f_job_stop},
#endif
{"join", 1, 2, FEARG_1, ret_string, f_join}, {"join", 1, 2, FEARG_1, ret_string, f_join},
{"js_decode", 1, 1, FEARG_1, ret_any, f_js_decode}, {"js_decode", 1, 1, FEARG_1, ret_any, f_js_decode},
{"js_encode", 1, 1, FEARG_1, ret_string, f_js_encode}, {"js_encode", 1, 1, FEARG_1, ret_string, f_js_encode},
@ -626,13 +663,15 @@ static funcentry_T global_functions[] =
{"listener_flush", 0, 1, FEARG_1, ret_void, f_listener_flush}, {"listener_flush", 0, 1, FEARG_1, ret_void, f_listener_flush},
{"listener_remove", 1, 1, FEARG_1, ret_number, f_listener_remove}, {"listener_remove", 1, 1, FEARG_1, ret_number, f_listener_remove},
{"localtime", 0, 0, 0, ret_number, f_localtime}, {"localtime", 0, 0, 0, ret_number, f_localtime},
#ifdef FEAT_FLOAT {"log", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_log)},
{"log", 1, 1, FEARG_1, ret_float, f_log}, {"log10", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_log10)},
{"log10", 1, 1, FEARG_1, ret_float, f_log10}, {"luaeval", 1, 2, FEARG_1, ret_any,
#endif
#ifdef FEAT_LUA #ifdef FEAT_LUA
{"luaeval", 1, 2, FEARG_1, ret_any, f_luaeval}, f_luaeval
#else
NULL
#endif #endif
},
{"map", 2, 2, FEARG_1, ret_any, f_map}, {"map", 2, 2, FEARG_1, ret_any, f_map},
{"maparg", 1, 4, FEARG_1, ret_string, f_maparg}, {"maparg", 1, 4, FEARG_1, ret_string, f_maparg},
{"mapcheck", 1, 3, FEARG_1, ret_string, f_mapcheck}, {"mapcheck", 1, 3, FEARG_1, ret_string, f_mapcheck},
@ -646,77 +685,93 @@ static funcentry_T global_functions[] =
{"matchstr", 2, 4, FEARG_1, ret_string, f_matchstr}, {"matchstr", 2, 4, FEARG_1, ret_string, f_matchstr},
{"matchstrpos", 2, 4, FEARG_1, ret_list_any, f_matchstrpos}, {"matchstrpos", 2, 4, FEARG_1, ret_list_any, f_matchstrpos},
{"max", 1, 1, FEARG_1, ret_any, f_max}, {"max", 1, 1, FEARG_1, ret_any, f_max},
{"menu_info", 1, 2, FEARG_1, ret_dict_any,
#ifdef FEAT_MENU #ifdef FEAT_MENU
{"menu_info", 1, 2, FEARG_1, ret_dict_any, f_menu_info}, f_menu_info
#else
NULL
#endif #endif
},
{"min", 1, 1, FEARG_1, ret_any, f_min}, {"min", 1, 1, FEARG_1, ret_any, f_min},
{"mkdir", 1, 3, FEARG_1, ret_number, f_mkdir}, {"mkdir", 1, 3, FEARG_1, ret_number, f_mkdir},
{"mode", 0, 1, FEARG_1, ret_string, f_mode}, {"mode", 0, 1, FEARG_1, ret_string, f_mode},
{"mzeval", 1, 1, FEARG_1, ret_any,
#ifdef FEAT_MZSCHEME #ifdef FEAT_MZSCHEME
{"mzeval", 1, 1, FEARG_1, ret_any, f_mzeval}, f_mzeval
#else
NULL
#endif #endif
},
{"nextnonblank", 1, 1, FEARG_1, ret_number, f_nextnonblank}, {"nextnonblank", 1, 1, FEARG_1, ret_number, f_nextnonblank},
{"nr2char", 1, 2, FEARG_1, ret_string, f_nr2char}, {"nr2char", 1, 2, FEARG_1, ret_string, f_nr2char},
{"or", 2, 2, FEARG_1, ret_number, f_or}, {"or", 2, 2, FEARG_1, ret_number, f_or},
{"pathshorten", 1, 1, FEARG_1, ret_string, f_pathshorten}, {"pathshorten", 1, 1, FEARG_1, ret_string, f_pathshorten},
{"perleval", 1, 1, FEARG_1, ret_any,
#ifdef FEAT_PERL #ifdef FEAT_PERL
{"perleval", 1, 1, FEARG_1, ret_any, f_perleval}, f_perleval
#endif #else
#ifdef FEAT_PROP_POPUP NULL
{"popup_atcursor", 2, 2, FEARG_1, ret_number, f_popup_atcursor},
{"popup_beval", 2, 2, FEARG_1, ret_number, f_popup_beval},
{"popup_clear", 0, 0, 0, ret_void, f_popup_clear},
{"popup_close", 1, 2, FEARG_1, ret_void, f_popup_close},
{"popup_create", 2, 2, FEARG_1, ret_number, f_popup_create},
{"popup_dialog", 2, 2, FEARG_1, ret_number, f_popup_dialog},
{"popup_filter_menu", 2, 2, 0, ret_number, f_popup_filter_menu},
{"popup_filter_yesno", 2, 2, 0, ret_number, f_popup_filter_yesno},
{"popup_findinfo", 0, 0, 0, ret_number, f_popup_findinfo},
{"popup_findpreview", 0, 0, 0, ret_number, f_popup_findpreview},
{"popup_getoptions", 1, 1, FEARG_1, ret_dict_any, f_popup_getoptions},
{"popup_getpos", 1, 1, FEARG_1, ret_dict_any, f_popup_getpos},
{"popup_hide", 1, 1, FEARG_1, ret_void, f_popup_hide},
{"popup_locate", 2, 2, 0, ret_number, f_popup_locate},
{"popup_menu", 2, 2, FEARG_1, ret_number, f_popup_menu},
{"popup_move", 2, 2, FEARG_1, ret_void, f_popup_move},
{"popup_notification", 2, 2, FEARG_1, ret_number, f_popup_notification},
{"popup_setoptions", 2, 2, FEARG_1, ret_void, f_popup_setoptions},
{"popup_settext", 2, 2, FEARG_1, ret_void, f_popup_settext},
{"popup_show", 1, 1, FEARG_1, ret_void, f_popup_show},
#endif
#ifdef FEAT_FLOAT
{"pow", 2, 2, FEARG_1, ret_float, f_pow},
#endif #endif
},
{"popup_atcursor", 2, 2, FEARG_1, ret_number, PROP_FUNC(f_popup_atcursor)},
{"popup_beval", 2, 2, FEARG_1, ret_number, PROP_FUNC(f_popup_beval)},
{"popup_clear", 0, 0, 0, ret_void, PROP_FUNC(f_popup_clear)},
{"popup_close", 1, 2, FEARG_1, ret_void, PROP_FUNC(f_popup_close)},
{"popup_create", 2, 2, FEARG_1, ret_number, PROP_FUNC(f_popup_create)},
{"popup_dialog", 2, 2, FEARG_1, ret_number, PROP_FUNC(f_popup_dialog)},
{"popup_filter_menu", 2, 2, 0, ret_number, PROP_FUNC(f_popup_filter_menu)},
{"popup_filter_yesno", 2, 2, 0, ret_number, PROP_FUNC(f_popup_filter_yesno)},
{"popup_findinfo", 0, 0, 0, ret_number, PROP_FUNC(f_popup_findinfo)},
{"popup_findpreview", 0, 0, 0, ret_number, PROP_FUNC(f_popup_findpreview)},
{"popup_getoptions", 1, 1, FEARG_1, ret_dict_any, PROP_FUNC(f_popup_getoptions)},
{"popup_getpos", 1, 1, FEARG_1, ret_dict_any, PROP_FUNC(f_popup_getpos)},
{"popup_hide", 1, 1, FEARG_1, ret_void, PROP_FUNC(f_popup_hide)},
{"popup_locate", 2, 2, 0, ret_number, PROP_FUNC(f_popup_locate)},
{"popup_menu", 2, 2, FEARG_1, ret_number, PROP_FUNC(f_popup_menu)},
{"popup_move", 2, 2, FEARG_1, ret_void, PROP_FUNC(f_popup_move)},
{"popup_notification", 2, 2, FEARG_1, ret_number, PROP_FUNC(f_popup_notification)},
{"popup_setoptions", 2, 2, FEARG_1, ret_void, PROP_FUNC(f_popup_setoptions)},
{"popup_settext", 2, 2, FEARG_1, ret_void, PROP_FUNC(f_popup_settext)},
{"popup_show", 1, 1, FEARG_1, ret_void, PROP_FUNC(f_popup_show)},
{"pow", 2, 2, FEARG_1, ret_float, FLOAT_FUNC(f_pow)},
{"prevnonblank", 1, 1, FEARG_1, ret_number, f_prevnonblank}, {"prevnonblank", 1, 1, FEARG_1, ret_number, f_prevnonblank},
{"printf", 1, 19, FEARG_2, ret_string, f_printf}, {"printf", 1, 19, FEARG_2, ret_string, f_printf},
#ifdef FEAT_JOB_CHANNEL {"prompt_setcallback", 2, 2, FEARG_1, ret_void, JOB_FUNC(f_prompt_setcallback)},
{"prompt_setcallback", 2, 2, FEARG_1, ret_void, f_prompt_setcallback}, {"prompt_setinterrupt", 2, 2, FEARG_1,ret_void, JOB_FUNC(f_prompt_setinterrupt)},
{"prompt_setinterrupt", 2, 2, FEARG_1,ret_void, f_prompt_setinterrupt}, {"prompt_setprompt", 2, 2, FEARG_1, ret_void, JOB_FUNC(f_prompt_setprompt)},
{"prompt_setprompt", 2, 2, FEARG_1, ret_void, f_prompt_setprompt}, {"prop_add", 3, 3, FEARG_1, ret_void, PROP_FUNC(f_prop_add)},
#endif {"prop_clear", 1, 3, FEARG_1, ret_void, PROP_FUNC(f_prop_clear)},
#ifdef FEAT_PROP_POPUP {"prop_find", 1, 2, FEARG_1, ret_dict_any, PROP_FUNC(f_prop_find)},
{"prop_add", 3, 3, FEARG_1, ret_void, f_prop_add}, {"prop_list", 1, 2, FEARG_1, ret_list_dict_any, PROP_FUNC(f_prop_list)},
{"prop_clear", 1, 3, FEARG_1, ret_void, f_prop_clear}, {"prop_remove", 1, 3, FEARG_1, ret_number, PROP_FUNC(f_prop_remove)},
{"prop_find", 1, 2, FEARG_1, ret_dict_any, f_prop_find}, {"prop_type_add", 2, 2, FEARG_1, ret_void, PROP_FUNC(f_prop_type_add)},
{"prop_list", 1, 2, FEARG_1, ret_list_dict_any, f_prop_list}, {"prop_type_change", 2, 2, FEARG_1, ret_void, PROP_FUNC(f_prop_type_change)},
{"prop_remove", 1, 3, FEARG_1, ret_number, f_prop_remove}, {"prop_type_delete", 1, 2, FEARG_1, ret_void, PROP_FUNC(f_prop_type_delete)},
{"prop_type_add", 2, 2, FEARG_1, ret_void, f_prop_type_add}, {"prop_type_get", 1, 2, FEARG_1, ret_dict_any, PROP_FUNC(f_prop_type_get)},
{"prop_type_change", 2, 2, FEARG_1, ret_void, f_prop_type_change}, {"prop_type_list", 0, 1, FEARG_1, ret_list_string, PROP_FUNC(f_prop_type_list)},
{"prop_type_delete", 1, 2, FEARG_1, ret_void, f_prop_type_delete},
{"prop_type_get", 1, 2, FEARG_1, ret_dict_any, f_prop_type_get},
{"prop_type_list", 0, 1, FEARG_1, ret_list_string, f_prop_type_list},
#endif
{"pum_getpos", 0, 0, 0, ret_dict_number, f_pum_getpos}, {"pum_getpos", 0, 0, 0, ret_dict_number, f_pum_getpos},
{"pumvisible", 0, 0, 0, ret_number, f_pumvisible}, {"pumvisible", 0, 0, 0, ret_number, f_pumvisible},
{"py3eval", 1, 1, FEARG_1, ret_any,
#ifdef FEAT_PYTHON3 #ifdef FEAT_PYTHON3
{"py3eval", 1, 1, FEARG_1, ret_any, f_py3eval}, f_py3eval
#else
NULL
#endif #endif
},
{"pyeval", 1, 1, FEARG_1, ret_any,
#ifdef FEAT_PYTHON #ifdef FEAT_PYTHON
{"pyeval", 1, 1, FEARG_1, ret_any, f_pyeval}, f_pyeval
#else
NULL
#endif #endif
},
{"pyxeval", 1, 1, FEARG_1, ret_any,
#if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
{"pyxeval", 1, 1, FEARG_1, ret_any, f_pyxeval}, f_pyxeval
#else
NULL
#endif #endif
},
{"rand", 0, 1, FEARG_1, ret_number, f_rand}, {"rand", 0, 1, FEARG_1, ret_number, f_rand},
{"range", 1, 3, FEARG_1, ret_list_number, f_range}, {"range", 1, 3, FEARG_1, ret_list_number, f_range},
{"readdir", 1, 2, FEARG_1, ret_list_string, f_readdir}, {"readdir", 1, 2, FEARG_1, ret_list_string, f_readdir},
@ -724,9 +779,7 @@ static funcentry_T global_functions[] =
{"reg_executing", 0, 0, 0, ret_string, f_reg_executing}, {"reg_executing", 0, 0, 0, ret_string, f_reg_executing},
{"reg_recording", 0, 0, 0, ret_string, f_reg_recording}, {"reg_recording", 0, 0, 0, ret_string, f_reg_recording},
{"reltime", 0, 2, FEARG_1, ret_list_any, f_reltime}, {"reltime", 0, 2, FEARG_1, ret_list_any, f_reltime},
#ifdef FEAT_FLOAT {"reltimefloat", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_reltimefloat)},
{"reltimefloat", 1, 1, FEARG_1, ret_float, f_reltimefloat},
#endif
{"reltimestr", 1, 1, FEARG_1, ret_string, f_reltimestr}, {"reltimestr", 1, 1, FEARG_1, ret_string, f_reltimestr},
{"remote_expr", 2, 4, FEARG_1, ret_string, f_remote_expr}, {"remote_expr", 2, 4, FEARG_1, ret_string, f_remote_expr},
{"remote_foreground", 1, 1, FEARG_1, ret_string, f_remote_foreground}, {"remote_foreground", 1, 1, FEARG_1, ret_string, f_remote_foreground},
@ -739,12 +792,14 @@ static funcentry_T global_functions[] =
{"repeat", 2, 2, FEARG_1, ret_any, f_repeat}, {"repeat", 2, 2, FEARG_1, ret_any, f_repeat},
{"resolve", 1, 1, FEARG_1, ret_string, f_resolve}, {"resolve", 1, 1, FEARG_1, ret_string, f_resolve},
{"reverse", 1, 1, FEARG_1, ret_any, f_reverse}, {"reverse", 1, 1, FEARG_1, ret_any, f_reverse},
#ifdef FEAT_FLOAT {"round", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_round)},
{"round", 1, 1, FEARG_1, ret_float, f_round}, {"rubyeval", 1, 1, FEARG_1, ret_any,
#endif
#ifdef FEAT_RUBY #ifdef FEAT_RUBY
{"rubyeval", 1, 1, FEARG_1, ret_any, f_rubyeval}, f_rubyeval
#else
NULL
#endif #endif
},
{"screenattr", 2, 2, FEARG_1, ret_number, f_screenattr}, {"screenattr", 2, 2, FEARG_1, ret_number, f_screenattr},
{"screenchar", 2, 2, FEARG_1, ret_number, f_screenchar}, {"screenchar", 2, 2, FEARG_1, ret_number, f_screenchar},
{"screenchars", 2, 2, FEARG_1, ret_list_number, f_screenchars}, {"screenchars", 2, 2, FEARG_1, ret_list_number, f_screenchars},
@ -775,62 +830,64 @@ static funcentry_T global_functions[] =
{"settabwinvar", 4, 4, FEARG_4, ret_void, f_settabwinvar}, {"settabwinvar", 4, 4, FEARG_4, ret_void, f_settabwinvar},
{"settagstack", 2, 3, FEARG_2, ret_number, f_settagstack}, {"settagstack", 2, 3, FEARG_2, ret_number, f_settagstack},
{"setwinvar", 3, 3, FEARG_3, ret_void, f_setwinvar}, {"setwinvar", 3, 3, FEARG_3, ret_void, f_setwinvar},
{"sha256", 1, 1, FEARG_1, ret_string,
#ifdef FEAT_CRYPT #ifdef FEAT_CRYPT
{"sha256", 1, 1, FEARG_1, ret_string, f_sha256}, f_sha256
#else
NULL
#endif #endif
},
{"shellescape", 1, 2, FEARG_1, ret_string, f_shellescape}, {"shellescape", 1, 2, FEARG_1, ret_string, f_shellescape},
{"shiftwidth", 0, 1, FEARG_1, ret_number, f_shiftwidth}, {"shiftwidth", 0, 1, FEARG_1, ret_number, f_shiftwidth},
#ifdef FEAT_SIGNS {"sign_define", 1, 2, FEARG_1, ret_any, SIGN_FUNC(f_sign_define)},
{"sign_define", 1, 2, FEARG_1, ret_any, f_sign_define}, {"sign_getdefined", 0, 1, FEARG_1, ret_list_dict_any, SIGN_FUNC(f_sign_getdefined)},
{"sign_getdefined", 0, 1, FEARG_1, ret_list_dict_any, f_sign_getdefined}, {"sign_getplaced", 0, 2, FEARG_1, ret_list_dict_any, SIGN_FUNC(f_sign_getplaced)},
{"sign_getplaced", 0, 2, FEARG_1, ret_list_dict_any, f_sign_getplaced}, {"sign_jump", 3, 3, FEARG_1, ret_number, SIGN_FUNC(f_sign_jump)},
{"sign_jump", 3, 3, FEARG_1, ret_number, f_sign_jump}, {"sign_place", 4, 5, FEARG_1, ret_number, SIGN_FUNC(f_sign_place)},
{"sign_place", 4, 5, FEARG_1, ret_number, f_sign_place}, {"sign_placelist", 1, 1, FEARG_1, ret_list_number, SIGN_FUNC(f_sign_placelist)},
{"sign_placelist", 1, 1, FEARG_1, ret_list_number, f_sign_placelist}, {"sign_undefine", 0, 1, FEARG_1, ret_number, SIGN_FUNC(f_sign_undefine)},
{"sign_undefine", 0, 1, FEARG_1, ret_number, f_sign_undefine}, {"sign_unplace", 1, 2, FEARG_1, ret_number, SIGN_FUNC(f_sign_unplace)},
{"sign_unplace", 1, 2, FEARG_1, ret_number, f_sign_unplace}, {"sign_unplacelist", 1, 2, FEARG_1, ret_list_number, SIGN_FUNC(f_sign_unplacelist)},
{"sign_unplacelist", 1, 2, FEARG_1, ret_list_number, f_sign_unplacelist},
#endif
{"simplify", 1, 1, 0, ret_string, f_simplify}, {"simplify", 1, 1, 0, ret_string, f_simplify},
#ifdef FEAT_FLOAT {"sin", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_sin)},
{"sin", 1, 1, FEARG_1, ret_float, f_sin}, {"sinh", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_sinh)},
{"sinh", 1, 1, FEARG_1, ret_float, f_sinh},
#endif
{"sort", 1, 3, FEARG_1, ret_list_any, f_sort}, {"sort", 1, 3, FEARG_1, ret_list_any, f_sort},
#ifdef FEAT_SOUND {"sound_clear", 0, 0, 0, ret_void, SOUND_FUNC(f_sound_clear)},
{"sound_clear", 0, 0, 0, ret_void, f_sound_clear}, {"sound_playevent", 1, 2, FEARG_1, ret_number, SOUND_FUNC(f_sound_playevent)},
{"sound_playevent", 1, 2, FEARG_1, ret_number, f_sound_playevent}, {"sound_playfile", 1, 2, FEARG_1, ret_number, SOUND_FUNC(f_sound_playfile)},
{"sound_playfile", 1, 2, FEARG_1, ret_number, f_sound_playfile}, {"sound_stop", 1, 1, FEARG_1, ret_void, SOUND_FUNC(f_sound_stop)},
{"sound_stop", 1, 1, FEARG_1, ret_void, f_sound_stop},
#endif
{"soundfold", 1, 1, FEARG_1, ret_string, f_soundfold}, {"soundfold", 1, 1, FEARG_1, ret_string, f_soundfold},
{"spellbadword", 0, 1, FEARG_1, ret_list_string, f_spellbadword}, {"spellbadword", 0, 1, FEARG_1, ret_list_string, f_spellbadword},
{"spellsuggest", 1, 3, FEARG_1, ret_list_string, f_spellsuggest}, {"spellsuggest", 1, 3, FEARG_1, ret_list_string, f_spellsuggest},
{"split", 1, 3, FEARG_1, ret_list_string, f_split}, {"split", 1, 3, FEARG_1, ret_list_string, f_split},
#ifdef FEAT_FLOAT {"sqrt", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_sqrt)},
{"sqrt", 1, 1, FEARG_1, ret_float, f_sqrt},
#endif
{"srand", 0, 1, FEARG_1, ret_list_number, f_srand}, {"srand", 0, 1, FEARG_1, ret_list_number, f_srand},
{"state", 0, 1, FEARG_1, ret_string, f_state}, {"state", 0, 1, FEARG_1, ret_string, f_state},
#ifdef FEAT_FLOAT {"str2float", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_str2float)},
{"str2float", 1, 1, FEARG_1, ret_float, f_str2float},
#endif
{"str2list", 1, 2, FEARG_1, ret_list_number, f_str2list}, {"str2list", 1, 2, FEARG_1, ret_list_number, f_str2list},
{"str2nr", 1, 3, FEARG_1, ret_number, f_str2nr}, {"str2nr", 1, 3, FEARG_1, ret_number, f_str2nr},
{"strcharpart", 2, 3, FEARG_1, ret_string, f_strcharpart}, {"strcharpart", 2, 3, FEARG_1, ret_string, f_strcharpart},
{"strchars", 1, 2, FEARG_1, ret_number, f_strchars}, {"strchars", 1, 2, FEARG_1, ret_number, f_strchars},
{"strdisplaywidth", 1, 2, FEARG_1, ret_number, f_strdisplaywidth}, {"strdisplaywidth", 1, 2, FEARG_1, ret_number, f_strdisplaywidth},
{"strftime", 1, 2, FEARG_1, ret_string,
#ifdef HAVE_STRFTIME #ifdef HAVE_STRFTIME
{"strftime", 1, 2, FEARG_1, ret_string, f_strftime}, f_strftime
#else
NULL
#endif #endif
},
{"strgetchar", 2, 2, FEARG_1, ret_number, f_strgetchar}, {"strgetchar", 2, 2, FEARG_1, ret_number, f_strgetchar},
{"stridx", 2, 3, FEARG_1, ret_number, f_stridx}, {"stridx", 2, 3, FEARG_1, ret_number, f_stridx},
{"string", 1, 1, FEARG_1, ret_string, f_string}, {"string", 1, 1, FEARG_1, ret_string, f_string},
{"strlen", 1, 1, FEARG_1, ret_number, f_strlen}, {"strlen", 1, 1, FEARG_1, ret_number, f_strlen},
{"strpart", 2, 3, FEARG_1, ret_string, f_strpart}, {"strpart", 2, 3, FEARG_1, ret_string, f_strpart},
{"strptime", 2, 2, FEARG_1, ret_number,
#ifdef HAVE_STRPTIME #ifdef HAVE_STRPTIME
{"strptime", 2, 2, FEARG_1, ret_number, f_strptime}, f_strptime
#else
NULL
#endif #endif
},
{"strridx", 2, 3, FEARG_1, ret_number, f_strridx}, {"strridx", 2, 3, FEARG_1, ret_number, f_strridx},
{"strtrans", 1, 1, FEARG_1, ret_string, f_strtrans}, {"strtrans", 1, 1, FEARG_1, ret_string, f_strtrans},
{"strwidth", 1, 1, FEARG_1, ret_number, f_strwidth}, {"strwidth", 1, 1, FEARG_1, ret_number, f_strwidth},
@ -850,41 +907,45 @@ static funcentry_T global_functions[] =
{"tabpagewinnr", 1, 2, FEARG_1, ret_number, f_tabpagewinnr}, {"tabpagewinnr", 1, 2, FEARG_1, ret_number, f_tabpagewinnr},
{"tagfiles", 0, 0, 0, ret_list_string, f_tagfiles}, {"tagfiles", 0, 0, 0, ret_list_string, f_tagfiles},
{"taglist", 1, 2, FEARG_1, ret_list_dict_any, f_taglist}, {"taglist", 1, 2, FEARG_1, ret_list_dict_any, f_taglist},
#ifdef FEAT_FLOAT {"tan", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_tan)},
{"tan", 1, 1, FEARG_1, ret_float, f_tan}, {"tanh", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_tanh)},
{"tanh", 1, 1, FEARG_1, ret_float, f_tanh},
#endif
{"tempname", 0, 0, 0, ret_string, f_tempname}, {"tempname", 0, 0, 0, ret_string, f_tempname},
#ifdef FEAT_TERMINAL {"term_dumpdiff", 2, 3, FEARG_1, ret_number, TERM_FUNC(f_term_dumpdiff)},
{"term_dumpdiff", 2, 3, FEARG_1, ret_number, f_term_dumpdiff}, {"term_dumpload", 1, 2, FEARG_1, ret_number, TERM_FUNC(f_term_dumpload)},
{"term_dumpload", 1, 2, FEARG_1, ret_number, f_term_dumpload}, {"term_dumpwrite", 2, 3, FEARG_2, ret_void, TERM_FUNC(f_term_dumpwrite)},
{"term_dumpwrite", 2, 3, FEARG_2, ret_void, f_term_dumpwrite}, {"term_getaltscreen", 1, 1, FEARG_1, ret_number, TERM_FUNC(f_term_getaltscreen)},
{"term_getaltscreen", 1, 1, FEARG_1, ret_number, f_term_getaltscreen}, {"term_getansicolors", 1, 1, FEARG_1, ret_list_string,
# if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) #if defined(TERMINAL) && (defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS))
{"term_getansicolors", 1, 1, FEARG_1, ret_list_string, f_term_getansicolors}, f_term_getansicolors
# endif #else
{"term_getattr", 2, 2, FEARG_1, ret_number, f_term_getattr}, NULL
{"term_getcursor", 1, 1, FEARG_1, ret_list_any, f_term_getcursor},
{"term_getjob", 1, 1, FEARG_1, ret_job, f_term_getjob},
{"term_getline", 2, 2, FEARG_1, ret_string, f_term_getline},
{"term_getscrolled", 1, 1, FEARG_1, ret_number, f_term_getscrolled},
{"term_getsize", 1, 1, FEARG_1, ret_list_number, f_term_getsize},
{"term_getstatus", 1, 1, FEARG_1, ret_string, f_term_getstatus},
{"term_gettitle", 1, 1, FEARG_1, ret_string, f_term_gettitle},
{"term_gettty", 1, 2, FEARG_1, ret_string, f_term_gettty},
{"term_list", 0, 0, 0, ret_list_number, f_term_list},
{"term_scrape", 2, 2, FEARG_1, ret_list_dict_any, f_term_scrape},
{"term_sendkeys", 2, 2, FEARG_1, ret_void, f_term_sendkeys},
# if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
{"term_setansicolors", 2, 2, FEARG_1, ret_void, f_term_setansicolors},
# endif
{"term_setapi", 2, 2, FEARG_1, ret_void, f_term_setapi},
{"term_setkill", 2, 2, FEARG_1, ret_void, f_term_setkill},
{"term_setrestore", 2, 2, FEARG_1, ret_void, f_term_setrestore},
{"term_setsize", 3, 3, FEARG_1, ret_void, f_term_setsize},
{"term_start", 1, 2, FEARG_1, ret_number, f_term_start},
{"term_wait", 1, 2, FEARG_1, ret_void, f_term_wait},
#endif #endif
},
{"term_getattr", 2, 2, FEARG_1, ret_number, TERM_FUNC(f_term_getattr)},
{"term_getcursor", 1, 1, FEARG_1, ret_list_any, TERM_FUNC(f_term_getcursor)},
{"term_getjob", 1, 1, FEARG_1, ret_job, TERM_FUNC(f_term_getjob)},
{"term_getline", 2, 2, FEARG_1, ret_string, TERM_FUNC(f_term_getline)},
{"term_getscrolled", 1, 1, FEARG_1, ret_number, TERM_FUNC(f_term_getscrolled)},
{"term_getsize", 1, 1, FEARG_1, ret_list_number, TERM_FUNC(f_term_getsize)},
{"term_getstatus", 1, 1, FEARG_1, ret_string, TERM_FUNC(f_term_getstatus)},
{"term_gettitle", 1, 1, FEARG_1, ret_string, TERM_FUNC(f_term_gettitle)},
{"term_gettty", 1, 2, FEARG_1, ret_string, TERM_FUNC(f_term_gettty)},
{"term_list", 0, 0, 0, ret_list_number, TERM_FUNC(f_term_list)},
{"term_scrape", 2, 2, FEARG_1, ret_list_dict_any, TERM_FUNC(f_term_scrape)},
{"term_sendkeys", 2, 2, FEARG_1, ret_void, TERM_FUNC(f_term_sendkeys)},
{"term_setansicolors", 2, 2, FEARG_1, ret_void,
#if defined(TERMINAL) && (defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS))
f_term_setansicolors
#else
NULL
#endif
},
{"term_setapi", 2, 2, FEARG_1, ret_void, TERM_FUNC(f_term_setapi)},
{"term_setkill", 2, 2, FEARG_1, ret_void, TERM_FUNC(f_term_setkill)},
{"term_setrestore", 2, 2, FEARG_1, ret_void, TERM_FUNC(f_term_setrestore)},
{"term_setsize", 3, 3, FEARG_1, ret_void, TERM_FUNC(f_term_setsize)},
{"term_start", 1, 2, FEARG_1, ret_number, TERM_FUNC(f_term_start)},
{"term_wait", 1, 2, FEARG_1, ret_void, TERM_FUNC(f_term_wait)},
{"test_alloc_fail", 3, 3, FEARG_1, ret_void, f_test_alloc_fail}, {"test_alloc_fail", 3, 3, FEARG_1, ret_void, f_test_alloc_fail},
{"test_autochdir", 0, 0, 0, ret_void, f_test_autochdir}, {"test_autochdir", 0, 0, 0, ret_void, f_test_autochdir},
{"test_feedinput", 1, 1, FEARG_1, ret_void, f_test_feedinput}, {"test_feedinput", 1, 1, FEARG_1, ret_void, f_test_feedinput},
@ -893,41 +954,37 @@ static funcentry_T global_functions[] =
{"test_getvalue", 1, 1, FEARG_1, ret_number, f_test_getvalue}, {"test_getvalue", 1, 1, FEARG_1, ret_number, f_test_getvalue},
{"test_ignore_error", 1, 1, FEARG_1, ret_void, f_test_ignore_error}, {"test_ignore_error", 1, 1, FEARG_1, ret_void, f_test_ignore_error},
{"test_null_blob", 0, 0, 0, ret_blob, f_test_null_blob}, {"test_null_blob", 0, 0, 0, ret_blob, f_test_null_blob},
#ifdef FEAT_JOB_CHANNEL {"test_null_channel", 0, 0, 0, ret_channel, JOB_FUNC(f_test_null_channel)},
{"test_null_channel", 0, 0, 0, ret_channel, f_test_null_channel},
#endif
{"test_null_dict", 0, 0, 0, ret_dict_any, f_test_null_dict}, {"test_null_dict", 0, 0, 0, ret_dict_any, f_test_null_dict},
#ifdef FEAT_JOB_CHANNEL {"test_null_job", 0, 0, 0, ret_job, JOB_FUNC(f_test_null_job)},
{"test_null_job", 0, 0, 0, ret_job, f_test_null_job},
#endif
{"test_null_list", 0, 0, 0, ret_list_any, f_test_null_list}, {"test_null_list", 0, 0, 0, ret_list_any, f_test_null_list},
{"test_null_partial", 0, 0, 0, ret_partial_void, f_test_null_partial}, {"test_null_partial", 0, 0, 0, ret_partial_void, f_test_null_partial},
{"test_null_string", 0, 0, 0, ret_string, f_test_null_string}, {"test_null_string", 0, 0, 0, ret_string, f_test_null_string},
{"test_option_not_set", 1, 1, FEARG_1,ret_void, f_test_option_not_set}, {"test_option_not_set", 1, 1, FEARG_1,ret_void, f_test_option_not_set},
{"test_override", 2, 2, FEARG_2, ret_void, f_test_override}, {"test_override", 2, 2, FEARG_2, ret_void, f_test_override},
{"test_refcount", 1, 1, FEARG_1, ret_number, f_test_refcount}, {"test_refcount", 1, 1, FEARG_1, ret_number, f_test_refcount},
{"test_scrollbar", 3, 3, FEARG_2, ret_void,
#ifdef FEAT_GUI #ifdef FEAT_GUI
{"test_scrollbar", 3, 3, FEARG_2, ret_void, f_test_scrollbar}, f_test_scrollbar
#else
NULL
#endif #endif
},
{"test_setmouse", 2, 2, 0, ret_void, f_test_setmouse}, {"test_setmouse", 2, 2, 0, ret_void, f_test_setmouse},
{"test_settime", 1, 1, FEARG_1, ret_void, f_test_settime}, {"test_settime", 1, 1, FEARG_1, ret_void, f_test_settime},
{"test_srand_seed", 0, 1, FEARG_1, ret_void, f_test_srand_seed}, {"test_srand_seed", 0, 1, FEARG_1, ret_void, f_test_srand_seed},
{"test_unknown", 0, 0, 0, ret_any, f_test_unknown}, {"test_unknown", 0, 0, 0, ret_any, f_test_unknown},
{"test_void", 0, 0, 0, ret_any, f_test_void}, {"test_void", 0, 0, 0, ret_any, f_test_void},
#ifdef FEAT_TIMERS {"timer_info", 0, 1, FEARG_1, ret_list_dict_any, TIMER_FUNC(f_timer_info)},
{"timer_info", 0, 1, FEARG_1, ret_list_dict_any, f_timer_info}, {"timer_pause", 2, 2, FEARG_1, ret_void, TIMER_FUNC(f_timer_pause)},
{"timer_pause", 2, 2, FEARG_1, ret_void, f_timer_pause}, {"timer_start", 2, 3, FEARG_1, ret_number, TIMER_FUNC(f_timer_start)},
{"timer_start", 2, 3, FEARG_1, ret_number, f_timer_start}, {"timer_stop", 1, 1, FEARG_1, ret_void, TIMER_FUNC(f_timer_stop)},
{"timer_stop", 1, 1, FEARG_1, ret_void, f_timer_stop}, {"timer_stopall", 0, 0, 0, ret_void, TIMER_FUNC(f_timer_stopall)},
{"timer_stopall", 0, 0, 0, ret_void, f_timer_stopall},
#endif
{"tolower", 1, 1, FEARG_1, ret_string, f_tolower}, {"tolower", 1, 1, FEARG_1, ret_string, f_tolower},
{"toupper", 1, 1, FEARG_1, ret_string, f_toupper}, {"toupper", 1, 1, FEARG_1, ret_string, f_toupper},
{"tr", 3, 3, FEARG_1, ret_string, f_tr}, {"tr", 3, 3, FEARG_1, ret_string, f_tr},
{"trim", 1, 2, FEARG_1, ret_string, f_trim}, {"trim", 1, 2, FEARG_1, ret_string, f_trim},
#ifdef FEAT_FLOAT {"trunc", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_trunc)},
{"trunc", 1, 1, FEARG_1, ret_float, f_trunc},
#endif
{"type", 1, 1, FEARG_1, ret_number, f_type}, {"type", 1, 1, FEARG_1, ret_number, f_type},
{"undofile", 1, 1, FEARG_1, ret_string, f_undofile}, {"undofile", 1, 1, FEARG_1, ret_string, f_undofile},
{"undotree", 0, 0, 0, ret_dict_any, f_undotree}, {"undotree", 0, 0, 0, ret_dict_any, f_undotree},
@ -1014,10 +1071,11 @@ get_expr_name(expand_T *xp, int idx)
/* /*
* Find internal function "name" in table "global_functions". * Find internal function "name" in table "global_functions".
* Return index, or -1 if not found * Return index, or -1 if not found or "implemented" is TRUE and the function
* is not implemented.
*/ */
int static int
find_internal_func(char_u *name) find_internal_func_opt(char_u *name, int implemented)
{ {
int first = 0; int first = 0;
int last; int last;
@ -1035,16 +1093,34 @@ find_internal_func(char_u *name)
last = x - 1; last = x - 1;
else if (cmp > 0) else if (cmp > 0)
first = x + 1; first = x + 1;
else if (implemented && global_functions[x].f_func == NULL)
break;
else else
return x; return x;
} }
return -1; return -1;
} }
/*
* Find internal function "name" in table "global_functions".
* Return index, or -1 if not found or the function is not implemented.
*/
int
find_internal_func(char_u *name)
{
return find_internal_func_opt(name, TRUE);
}
int int
has_internal_func(char_u *name) has_internal_func(char_u *name)
{ {
return find_internal_func(name) >= 0; return find_internal_func_opt(name, TRUE) >= 0;
}
static int
has_internal_func_name(char_u *name)
{
return find_internal_func_opt(name, FALSE) >= 0;
} }
char * char *
@ -2288,6 +2364,10 @@ f_exists(typval_T *argvars, typval_T *rettv)
{ {
n = function_exists(p + 1, FALSE); n = function_exists(p + 1, FALSE);
} }
else if (*p == '?') // internal function only
{
n = has_internal_func_name(p + 1);
}
else if (*p == ':') else if (*p == ':')
{ {
n = cmd_exists(p + 1); n = cmd_exists(p + 1);

View File

@ -25,9 +25,12 @@ func CheckOption(name)
endif endif
endfunc endfunc
" Command to check for the presence of a function. " Command to check for the presence of a built-in function.
command -nargs=1 CheckFunction call CheckFunction(<f-args>) command -nargs=1 CheckFunction call CheckFunction(<f-args>)
func CheckFunction(name) func CheckFunction(name)
if !exists('?' .. a:name)
throw 'Checking for non-existent function ' .. a:name
endif
if !exists('*' .. a:name) if !exists('*' .. a:name)
throw 'Skipped: ' .. a:name .. ' function missing' throw 'Skipped: ' .. a:name .. ' function missing'
endif endif

View File

@ -92,6 +92,11 @@ func Test_exists()
" Function that may be created by script autoloading " Function that may be created by script autoloading
call assert_equal(0, exists('*footest#F')) call assert_equal(0, exists('*footest#F'))
call assert_equal(has('float'), exists('*acos'))
call assert_equal(1, exists('?acos'))
call assert_equal(has('win32'), exists('*debugbreak'))
call assert_equal(1, exists('?debugbreak'))
" Valid internal command (full match) " Valid internal command (full match)
call assert_equal(2, exists(':edit')) call assert_equal(2, exists(':edit'))
" Valid internal command (full match) with garbage " Valid internal command (full match) with garbage

View File

@ -738,6 +738,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
459,
/**/ /**/
458, 458,
/**/ /**/