mirror of
https://github.com/neovim/neovim.git
synced 2025-10-08 10:56:31 +00:00
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:
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user