aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.lua
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-01-16 11:30:35 +0800
committerGitHub <noreply@github.com>2024-01-16 11:30:35 +0800
commit46a7c1b3193d1f4ba09cd66ce03a1e2340d324a7 (patch)
treeee2fd693a3555362c1e86f2433c152a3fee026d4 /src/nvim/eval.lua
parent267e90f31d186cc06202f308e1a63fbcc6bbed2c (diff)
downloadrneovim-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.lua42
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 = {},