mirror of
https://github.com/neovim/neovim.git
synced 2024-09-17 20:58:20 -04:00
Merge pull request #22743 from bfredl/luaequals
feat(lua): allow `:=expr` as a shorter version of `:lua =expr`
This commit is contained in:
commit
c45b5e2c5b
@ -233,11 +233,11 @@ command calls. The |lua-stdlib| modules, user modules, and anything else on
|
||||
The Lua print() function redirects its output to the Nvim message area, with
|
||||
arguments separated by " " (space) instead of "\t" (tab).
|
||||
|
||||
*:lua*
|
||||
*:lua=* *:lua*
|
||||
:lua {chunk}
|
||||
Executes Lua chunk {chunk}. If {chunk} starts with "=" the rest of the
|
||||
chunk is evaluated as an expression and printed. `:lua =expr` is
|
||||
equivalent to `:lua print(vim.inspect(expr))`
|
||||
chunk is evaluated as an expression and printed. `:lua =expr` or `:=expr` is
|
||||
equivalent to `:lua print(vim.inspect(expr))`.
|
||||
|
||||
Examples: >vim
|
||||
:lua vim.api.nvim_command('echo "Hello, Nvim!"')
|
||||
|
@ -237,6 +237,11 @@ The following changes to existing APIs or features add new behavior.
|
||||
• The `win_viewport` UI event now contains information about virtual lines,
|
||||
meaning that smooth scrolling can now be implemented more consistenlty.
|
||||
|
||||
• The `:= {expr}` syntax can be used to evaluate a lua expression, as
|
||||
a shorter form of `:lua ={expr}`. `:=` and `:[range]=` without argument
|
||||
are unchanged. However `:=#` and similar variants using |ex-flags|
|
||||
are no longer supported.
|
||||
|
||||
==============================================================================
|
||||
REMOVED FEATURES *news-removed*
|
||||
|
||||
|
@ -173,13 +173,12 @@ g8 Print the hex values of the bytes used in the
|
||||
Like ":z" or ":z!", but number the lines.
|
||||
|
||||
*:=*
|
||||
:= [flags] Print the last line number.
|
||||
See |ex-flags| for [flags].
|
||||
:= Without arg: Print the last line number.
|
||||
with args: equivalent to `:lua ={expr}`. see |:lua|
|
||||
|
||||
:{range}= [flags] Prints the last line number in {range}. For example,
|
||||
:{range}= Prints the last line number in {range}. For example,
|
||||
this prints the current line number: >
|
||||
:.=
|
||||
< See |ex-flags| for [flags].
|
||||
|
||||
:norm[al][!] {commands} *:norm* *:normal*
|
||||
Execute Normal mode commands {commands}. This makes
|
||||
|
@ -460,6 +460,7 @@ Commands:
|
||||
|:doautocmd| does not warn about "No matching autocommands".
|
||||
|:wincmd| accepts a count.
|
||||
`:write!` does not show a prompt if the file was updated externally.
|
||||
|:=| does not accept |ex-flags|. With an arg it is equivalent to |:lua=|
|
||||
|
||||
Command-line:
|
||||
The meanings of arrow keys do not change depending on 'wildoptions'.
|
||||
|
@ -2141,6 +2141,7 @@ static const char *set_context_by_cmdname(const char *cmd, cmdidx_T cmdidx, expa
|
||||
return set_context_in_scriptnames_cmd(xp, arg);
|
||||
|
||||
case CMD_lua:
|
||||
case CMD_equal:
|
||||
xp->xp_context = EXPAND_LUA;
|
||||
break;
|
||||
|
||||
|
@ -3319,7 +3319,7 @@ module.cmds = {
|
||||
{
|
||||
command='=',
|
||||
enum='CMD_equal',
|
||||
flags=bit.bor(RANGE, TRLBAR, DFLALL, FLAGS, CMDWIN, LOCK_OK),
|
||||
flags=bit.bor(RANGE, EXTRA, DFLALL, ARGOPT, CMDWIN, LOCK_OK),
|
||||
addr_type='ADDR_LINES',
|
||||
func='ex_equal',
|
||||
},
|
||||
|
@ -5658,8 +5658,13 @@ static void ex_pwd(exarg_T *eap)
|
||||
/// ":=".
|
||||
static void ex_equal(exarg_T *eap)
|
||||
{
|
||||
smsg("%" PRId64, (int64_t)eap->line2);
|
||||
ex_may_print(eap);
|
||||
if (*eap->arg != NUL && *eap->arg != '|') {
|
||||
// equivalent to :lua= expr
|
||||
ex_lua(eap);
|
||||
} else {
|
||||
eap->nextcmd = find_nextcmd(eap->arg);
|
||||
smsg("%" PRId64, (int64_t)eap->line2);
|
||||
}
|
||||
}
|
||||
|
||||
static void ex_sleep(exarg_T *eap)
|
||||
|
@ -1621,14 +1621,15 @@ void ex_lua(exarg_T *const eap)
|
||||
xfree(code);
|
||||
return;
|
||||
}
|
||||
// When =expr is used transform it to print(vim.inspect(expr))
|
||||
if (code[0] == '=') {
|
||||
len += sizeof("vim.print()") - sizeof("=");
|
||||
// When =expr is used transform it to vim.print(expr)
|
||||
if (eap->cmdidx == CMD_equal || code[0] == '=') {
|
||||
size_t off = (eap->cmdidx == CMD_equal) ? 0 : 1;
|
||||
len += sizeof("vim.print()") - 1 - off;
|
||||
// code_buf needs to be 1 char larger then len for null byte in the end.
|
||||
// lua nlua_typval_exec doesn't expect null terminated string so len
|
||||
// needs to end before null byte.
|
||||
char *code_buf = xmallocz(len);
|
||||
vim_snprintf(code_buf, len + 1, "vim.print(%s)", code + 1);
|
||||
vim_snprintf(code_buf, len + 1, "vim.print(%s)", code + off);
|
||||
xfree(code);
|
||||
code = code_buf;
|
||||
}
|
||||
|
@ -146,6 +146,7 @@ describe(':lua command', function()
|
||||
it('prints result of =expr', function()
|
||||
exec_lua("x = 5")
|
||||
eq("5", exec_capture(':lua =x'))
|
||||
eq("5", exec_capture('=x'))
|
||||
exec_lua("function x() return 'hello' end")
|
||||
eq('hello', exec_capture(':lua = x()'))
|
||||
exec_lua("x = {a = 1, b = 2}")
|
||||
@ -165,7 +166,7 @@ describe(':lua command', function()
|
||||
false
|
||||
nil
|
||||
Error message]],
|
||||
exec_capture(':lua =x(false)'))
|
||||
exec_capture('=x(false)'))
|
||||
end)
|
||||
end)
|
||||
|
||||
|
@ -7,6 +7,19 @@ func Test_ex_equal()
|
||||
let a = execute('=')
|
||||
call assert_equal("\n2", a)
|
||||
|
||||
let a = execute('.=')
|
||||
call assert_equal("\n1", a)
|
||||
|
||||
call assert_fails('3=', 'E16:')
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
func Test_ex_equal_arg()
|
||||
throw 'skipped: Nvim evaluates lua with := [arg]'
|
||||
|
||||
new
|
||||
call setline(1, ["foo\tbar", "bar\tfoo"])
|
||||
|
||||
let a = execute('=#')
|
||||
call assert_equal("\n2\n 1 foo bar", a)
|
||||
|
||||
@ -22,10 +35,6 @@ func Test_ex_equal()
|
||||
let a = execute('=p#')
|
||||
call assert_equal("\n2\n 1 foo bar", a)
|
||||
|
||||
let a = execute('.=')
|
||||
call assert_equal("\n1", a)
|
||||
|
||||
call assert_fails('3=', 'E16:')
|
||||
call assert_fails('=x', 'E488:')
|
||||
|
||||
bwipe!
|
||||
|
Loading…
Reference in New Issue
Block a user