diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2021-12-28 23:18:07 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-28 23:18:07 +0100 |
commit | 7bb593169ec8c4253d2e8a373fa2ce41cec1cc74 (patch) | |
tree | f1916b215749503bcaa0e4b934c248a75d096003 /src/nvim/ex_getln.c | |
parent | 08616571f47cc367a5fe59b52295708b9fda3b09 (diff) | |
parent | eff11b3c3fcb9aa777deafb0a33b1523aa05b603 (diff) | |
download | rneovim-7bb593169ec8c4253d2e8a373fa2ce41cec1cc74.tar.gz rneovim-7bb593169ec8c4253d2e8a373fa2ce41cec1cc74.tar.bz2 rneovim-7bb593169ec8c4253d2e8a373fa2ce41cec1cc74.zip |
Merge pull request #16752 from gpanders/lua-user-commands
feat(api): implement nvim_{add,del}_user_command
Diffstat (limited to 'src/nvim/ex_getln.c')
-rw-r--r-- | src/nvim/ex_getln.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index ba2238ace2..67fd5a4efc 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -4983,6 +4983,9 @@ static int ExpandFromContext(expand_T *xp, char_u *pat, int *num_file, char_u ** if (xp->xp_context == EXPAND_USER_LIST) { return ExpandUserList(xp, num_file, file); } + if (xp->xp_context == EXPAND_USER_LUA) { + return ExpandUserLua(xp, num_file, file); + } if (xp->xp_context == EXPAND_PACKADD) { return ExpandPackAddDir(pat, num_file, file); } @@ -5411,6 +5414,35 @@ static int ExpandUserList(expand_T *xp, int *num_file, char_u ***file) return OK; } +static int ExpandUserLua(expand_T *xp, int *num_file, char_u ***file) +{ + typval_T rettv; + nlua_call_user_expand_func(xp, &rettv); + if (rettv.v_type != VAR_LIST) { + tv_clear(&rettv); + return FAIL; + } + + list_T *const retlist = rettv.vval.v_list; + + garray_T ga; + ga_init(&ga, (int)sizeof(char *), 3); + // Loop over the items in the list. + TV_LIST_ITER_CONST(retlist, li, { + if (TV_LIST_ITEM_TV(li)->v_type != VAR_STRING + || TV_LIST_ITEM_TV(li)->vval.v_string == NULL) { + continue; // Skip non-string items and empty strings. + } + + GA_APPEND(char *, &ga, xstrdup((const char *)TV_LIST_ITEM_TV(li)->vval.v_string)); + }); + tv_list_unref(retlist); + + *file = ga.ga_data; + *num_file = ga.ga_len; + return OK; +} + /// Expand color scheme, compiler or filetype names. /// Search from 'runtimepath': /// 'runtimepath'/{dirnames}/{pat}.vim |