feat(lua): allow :=expr as a shorter version of :lua =expr

existing behavior of
  :=
and
  :[range]=

are unchanged. `|` is still allowed with this usage.

However,
   :=p
and similar are changed in a way which could be construed as a breaking
change. Allowing |ex-flags| for := in the first place was a mistake as
any form of := DOES NOT MOVE THE CURSOR. So it would print one line number
and then print a completely different line contents after that.
This commit is contained in:
bfredl
2023-03-20 21:11:10 +01:00
parent 4cba53e09e
commit a92b38934a
10 changed files with 41 additions and 19 deletions

View File

@@ -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 The Lua print() function redirects its output to the Nvim message area, with
arguments separated by " " (space) instead of "\t" (tab). arguments separated by " " (space) instead of "\t" (tab).
*:lua* *:lua=* *:lua*
:lua {chunk} :lua {chunk}
Executes Lua chunk {chunk}. If {chunk} starts with "=" the rest of the Executes Lua chunk {chunk}. If {chunk} starts with "=" the rest of the
chunk is evaluated as an expression and printed. `:lua =expr` is chunk is evaluated as an expression and printed. `:lua =expr` or `:=expr` is
equivalent to `:lua print(vim.inspect(expr))` equivalent to `:lua print(vim.inspect(expr))`.
Examples: >vim Examples: >vim
:lua vim.api.nvim_command('echo "Hello, Nvim!"') :lua vim.api.nvim_command('echo "Hello, Nvim!"')

View File

@@ -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, • The `win_viewport` UI event now contains information about virtual lines,
meaning that smooth scrolling can now be implemented more consistenlty. 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* REMOVED FEATURES *news-removed*

View File

@@ -173,13 +173,12 @@ g8 Print the hex values of the bytes used in the
Like ":z" or ":z!", but number the lines. Like ":z" or ":z!", but number the lines.
*:=* *:=*
:= [flags] Print the last line number. := Without arg: Print the last line number.
See |ex-flags| for [flags]. 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: > this prints the current line number: >
:.= :.=
< See |ex-flags| for [flags].
:norm[al][!] {commands} *:norm* *:normal* :norm[al][!] {commands} *:norm* *:normal*
Execute Normal mode commands {commands}. This makes Execute Normal mode commands {commands}. This makes

View File

@@ -460,6 +460,7 @@ Commands:
|:doautocmd| does not warn about "No matching autocommands". |:doautocmd| does not warn about "No matching autocommands".
|:wincmd| accepts a count. |:wincmd| accepts a count.
`:write!` does not show a prompt if the file was updated externally. `: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: Command-line:
The meanings of arrow keys do not change depending on 'wildoptions'. The meanings of arrow keys do not change depending on 'wildoptions'.

View File

@@ -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); return set_context_in_scriptnames_cmd(xp, arg);
case CMD_lua: case CMD_lua:
case CMD_equal:
xp->xp_context = EXPAND_LUA; xp->xp_context = EXPAND_LUA;
break; break;

View File

@@ -3319,7 +3319,7 @@ module.cmds = {
{ {
command='=', command='=',
enum='CMD_equal', 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', addr_type='ADDR_LINES',
func='ex_equal', func='ex_equal',
}, },

View File

@@ -5658,8 +5658,13 @@ static void ex_pwd(exarg_T *eap)
/// ":=". /// ":=".
static void ex_equal(exarg_T *eap) static void ex_equal(exarg_T *eap)
{ {
smsg("%" PRId64, (int64_t)eap->line2); if (*eap->arg != NUL && *eap->arg != '|') {
ex_may_print(eap); // 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) static void ex_sleep(exarg_T *eap)

View File

@@ -1621,14 +1621,15 @@ void ex_lua(exarg_T *const eap)
xfree(code); xfree(code);
return; return;
} }
// When =expr is used transform it to print(vim.inspect(expr)) // When =expr is used transform it to vim.print(expr)
if (code[0] == '=') { if (eap->cmdidx == CMD_equal || code[0] == '=') {
len += sizeof("vim.print()") - sizeof("="); 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. // 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 // lua nlua_typval_exec doesn't expect null terminated string so len
// needs to end before null byte. // needs to end before null byte.
char *code_buf = xmallocz(len); 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); xfree(code);
code = code_buf; code = code_buf;
} }

View File

@@ -146,6 +146,7 @@ describe(':lua command', function()
it('prints result of =expr', function() it('prints result of =expr', function()
exec_lua("x = 5") exec_lua("x = 5")
eq("5", exec_capture(':lua =x')) eq("5", exec_capture(':lua =x'))
eq("5", exec_capture('=x'))
exec_lua("function x() return 'hello' end") exec_lua("function x() return 'hello' end")
eq('hello', exec_capture(':lua = x()')) eq('hello', exec_capture(':lua = x()'))
exec_lua("x = {a = 1, b = 2}") exec_lua("x = {a = 1, b = 2}")
@@ -165,7 +166,7 @@ describe(':lua command', function()
false false
nil nil
Error message]], Error message]],
exec_capture(':lua =x(false)')) exec_capture('=x(false)'))
end) end)
end) end)

View File

@@ -7,6 +7,19 @@ func Test_ex_equal()
let a = execute('=') let a = execute('=')
call assert_equal("\n2", a) 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('=#') let a = execute('=#')
call assert_equal("\n2\n 1 foo bar", a) call assert_equal("\n2\n 1 foo bar", a)
@@ -22,10 +35,6 @@ func Test_ex_equal()
let a = execute('=p#') let a = execute('=p#')
call assert_equal("\n2\n 1 foo bar", a) 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:') call assert_fails('=x', 'E488:')
bwipe! bwipe!