ex_cmds: port :eval

Cherry-picked from patch v8.1.1807.
Required for patch v8.2.2761.
This commit is contained in:
Jan Edmund Lazo
2021-04-14 17:37:38 -04:00
parent b8c0fac762
commit b34dc4c458
3 changed files with 31 additions and 0 deletions

View File

@@ -10099,6 +10099,8 @@ This function can then be called with: >
The recursiveness of user functions is restricted with the |'maxfuncdepth'| The recursiveness of user functions is restricted with the |'maxfuncdepth'|
option. option.
It is also possible to use `:eval`. It does not support a range.
AUTOMATICALLY LOADING FUNCTIONS ~ AUTOMATICALLY LOADING FUNCTIONS ~
*autoload-functions* *autoload-functions*
@@ -10532,6 +10534,20 @@ text...
Unlock the internal variable {name}. Does the Unlock the internal variable {name}. Does the
opposite of |:lockvar|. opposite of |:lockvar|.
*:eval*
:eval {expr} Evaluate {expr} and discard the result. Example: >
:eval append(Filter(Getlist()), '$')
< The expression is supposed to have a side effect,
since the resulting value is not used. In the example
the `append()` call appends the List with text to the
buffer. This is similar to `:call` but works with any
expression.
The command can be shortened to `:ev` or `:eva`, but
these are hard to recognize and therefore not to be
used.
:if {expr1} *:if* *:end* *:endif* *:en* *E171* *E579* *E580* :if {expr1} *:if* *:end* *:endif* *:en* *E171* *E579* *E580*
:en[dif] Execute the commands until the next matching ":else" :en[dif] Execute the commands until the next matching ":else"

View File

@@ -927,6 +927,12 @@ module.cmds = {
addr_type='ADDR_NONE', addr_type='ADDR_NONE',
func='ex_edit', func='ex_edit',
}, },
{
command='eval',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
addr_type='ADDR_NONE',
func='ex_eval',
},
{ {
command='ex', command='ex',
flags=bit.bor(BANG, FILE1, CMDARG, ARGOPT, TRLBAR), flags=bit.bor(BANG, FILE1, CMDARG, ARGOPT, TRLBAR),

View File

@@ -788,6 +788,15 @@ void report_discard_pending(int pending, void *value)
} }
} }
// ":eval".
void ex_eval(exarg_T *eap)
{
typval_T tv;
if (eval0(eap->arg, &tv, &eap->nextcmd, !eap->skip) == OK) {
tv_clear(&tv);
}
}
/* /*
* ":if". * ":if".