diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-01-16 11:30:35 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-16 11:30:35 +0800 |
commit | 46a7c1b3193d1f4ba09cd66ce03a1e2340d324a7 (patch) | |
tree | ee2fd693a3555362c1e86f2433c152a3fee026d4 /src/nvim/eval.lua | |
parent | 267e90f31d186cc06202f308e1a63fbcc6bbed2c (diff) | |
download | rneovim-46a7c1b3193d1f4ba09cd66ce03a1e2340d324a7.tar.gz rneovim-46a7c1b3193d1f4ba09cd66ce03a1e2340d324a7.tar.bz2 rneovim-46a7c1b3193d1f4ba09cd66ce03a1e2340d324a7.zip |
vim-patch:partial:9.1.0027: Vim is missing a foreach() func (#27037)
Problem: Vim is missing a foreach() func
Solution: Implement foreach({expr1}, {expr2}) function,
which applies {expr2} for each item in {expr1}
without changing it (Ernie Rael)
closes: vim/vim#12166
https://github.com/vim/vim/commit/e79e2077607e8f829ba823308c91104a795736ba
Partial port as this doesn't handle non-materialized range() lists.
vim-patch:c92b8bed1fa6
runtime(help): delete duplicate help tag E741 (vim/vim#13861)
https://github.com/vim/vim/commit/c92b8bed1fa632569c8358feb3b72dd6a0844ef7
Co-authored-by: Ernie Rael <errael@raelity.com>
Diffstat (limited to 'src/nvim/eval.lua')
-rw-r--r-- | src/nvim/eval.lua | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua index 9545cb9823..9a66d20dbb 100644 --- a/src/nvim/eval.lua +++ b/src/nvim/eval.lua @@ -2923,6 +2923,48 @@ M.funcs = { returns = 'string', signature = 'foldtextresult({lnum})', }, + foreach = { + args = 2, + base = 1, + desc = [=[ + {expr1} must be a |List|, |String|, |Blob| or |Dictionary|. + For each item in {expr1} execute {expr2}. {expr1} is not + modified; its values may be, as with |:lockvar| 1. |E741| + See |map()| and |filter()| to modify {expr1}. + + {expr2} must be a |string| or |Funcref|. + + If {expr2} is a |string|, inside {expr2} |v:val| has the value + of the current item. For a |Dictionary| |v:key| has the key + of the current item and for a |List| |v:key| has the index of + the current item. For a |Blob| |v:key| has the index of the + current byte. For a |String| |v:key| has the index of the + current character. + Examples: > + call foreach(mylist, 'let used[v:val] = v:true') + <This records the items that are in the {expr1} list. + + Note that {expr2} is the result of expression and is then used + as a command. Often it is good to use a |literal-string| to + avoid having to double backslashes. + + If {expr2} is a |Funcref| it must take two arguments: + 1. the key or the index of the current item. + 2. the value of the current item. + With a lambda you don't get an error if it only accepts one + argument. + If the function returns a value, it is ignored. + + Returns {expr1} in all cases. + When an error is encountered while executing {expr2} no + further items in {expr1} are processed. + When {expr2} is a Funcref errors inside a function are ignored, + unless it was defined with the "abort" flag. + ]=], + name = 'foreach', + params = { { 'expr1', 'any' }, { 'expr2', 'any' } }, + signature = 'foreach({expr1}, {expr2})', + }, foreground = { args = 0, params = {}, |