forked from aniani/vim
patch 8.2.1137: Vim9: modifiers not cleared after compiling function
Problem: Vim9: modifiers not cleared after compiling function. Solution: Clear command modifiers. (closes #6396)
This commit is contained in:
parent
846178a72c
commit
47e7d70b58
@ -25,7 +25,6 @@ static char_u *do_one_cmd(char_u **, int, cstack_T *, char_u *(*fgetline)(int, v
|
|||||||
static char_u *do_one_cmd(char_u **, int, char_u *(*fgetline)(int, void *, int, int), void *cookie);
|
static char_u *do_one_cmd(char_u **, int, char_u *(*fgetline)(int, void *, int, int), void *cookie);
|
||||||
static int if_level = 0; // depth in :if
|
static int if_level = 0; // depth in :if
|
||||||
#endif
|
#endif
|
||||||
static void free_cmdmod(void);
|
|
||||||
static void append_command(char_u *cmd);
|
static void append_command(char_u *cmd);
|
||||||
|
|
||||||
#ifndef FEAT_MENU
|
#ifndef FEAT_MENU
|
||||||
@ -2611,32 +2610,10 @@ doend:
|
|||||||
? cmdnames[(int)ea.cmdidx].cmd_name : (char_u *)NULL);
|
? cmdnames[(int)ea.cmdidx].cmd_name : (char_u *)NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ea.verbose_save >= 0)
|
undo_cmdmod(&ea, save_msg_scroll);
|
||||||
p_verbose = ea.verbose_save;
|
|
||||||
|
|
||||||
free_cmdmod();
|
|
||||||
cmdmod = save_cmdmod;
|
cmdmod = save_cmdmod;
|
||||||
reg_executing = save_reg_executing;
|
reg_executing = save_reg_executing;
|
||||||
|
|
||||||
if (ea.save_msg_silent != -1)
|
|
||||||
{
|
|
||||||
// messages could be enabled for a serious error, need to check if the
|
|
||||||
// counters don't become negative
|
|
||||||
if (!did_emsg || msg_silent > ea.save_msg_silent)
|
|
||||||
msg_silent = ea.save_msg_silent;
|
|
||||||
emsg_silent -= ea.did_esilent;
|
|
||||||
if (emsg_silent < 0)
|
|
||||||
emsg_silent = 0;
|
|
||||||
// Restore msg_scroll, it's set by file I/O commands, even when no
|
|
||||||
// message is actually displayed.
|
|
||||||
msg_scroll = save_msg_scroll;
|
|
||||||
|
|
||||||
// "silent reg" or "silent echo x" inside "redir" leaves msg_col
|
|
||||||
// somewhere in the line. Put it back in the first column.
|
|
||||||
if (redirecting())
|
|
||||||
msg_col = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_SANDBOX
|
#ifdef HAVE_SANDBOX
|
||||||
if (ea.did_sandbox)
|
if (ea.did_sandbox)
|
||||||
--sandbox;
|
--sandbox;
|
||||||
@ -2927,11 +2904,14 @@ parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free contents of "cmdmod".
|
* Unod and free contents of "cmdmod".
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
free_cmdmod(void)
|
undo_cmdmod(exarg_T *eap, int save_msg_scroll)
|
||||||
{
|
{
|
||||||
|
if (eap->verbose_save >= 0)
|
||||||
|
p_verbose = eap->verbose_save;
|
||||||
|
|
||||||
if (cmdmod.save_ei != NULL)
|
if (cmdmod.save_ei != NULL)
|
||||||
{
|
{
|
||||||
// Restore 'eventignore' to the value before ":noautocmd".
|
// Restore 'eventignore' to the value before ":noautocmd".
|
||||||
@ -2942,6 +2922,25 @@ free_cmdmod(void)
|
|||||||
|
|
||||||
if (cmdmod.filter_regmatch.regprog != NULL)
|
if (cmdmod.filter_regmatch.regprog != NULL)
|
||||||
vim_regfree(cmdmod.filter_regmatch.regprog);
|
vim_regfree(cmdmod.filter_regmatch.regprog);
|
||||||
|
|
||||||
|
if (eap->save_msg_silent != -1)
|
||||||
|
{
|
||||||
|
// messages could be enabled for a serious error, need to check if the
|
||||||
|
// counters don't become negative
|
||||||
|
if (!did_emsg || msg_silent > eap->save_msg_silent)
|
||||||
|
msg_silent = eap->save_msg_silent;
|
||||||
|
emsg_silent -= eap->did_esilent;
|
||||||
|
if (emsg_silent < 0)
|
||||||
|
emsg_silent = 0;
|
||||||
|
// Restore msg_scroll, it's set by file I/O commands, even when no
|
||||||
|
// message is actually displayed.
|
||||||
|
msg_scroll = save_msg_scroll;
|
||||||
|
|
||||||
|
// "silent reg" or "silent echo x" inside "redir" leaves msg_col
|
||||||
|
// somewhere in the line. Put it back in the first column.
|
||||||
|
if (redirecting())
|
||||||
|
msg_col = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -6,6 +6,7 @@ int getline_equal(char_u *(*fgetline)(int, void *, int, int), void *cookie, char
|
|||||||
void *getline_cookie(char_u *(*fgetline)(int, void *, int, int), void *cookie);
|
void *getline_cookie(char_u *(*fgetline)(int, void *, int, int), void *cookie);
|
||||||
char_u *getline_peek(char_u *(*fgetline)(int, void *, int, int), void *cookie);
|
char_u *getline_peek(char_u *(*fgetline)(int, void *, int, int), void *cookie);
|
||||||
int parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only);
|
int parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only);
|
||||||
|
void undo_cmdmod(exarg_T *eap, int save_msg_scroll);
|
||||||
int parse_cmd_address(exarg_T *eap, char **errormsg, int silent);
|
int parse_cmd_address(exarg_T *eap, char **errormsg, int silent);
|
||||||
int checkforcmd(char_u **pp, char *cmd, int len);
|
int checkforcmd(char_u **pp, char *cmd, int len);
|
||||||
char_u *find_ex_command(exarg_T *eap, int *full, void *(*lookup)(char_u *, size_t, cctx_T *), cctx_T *cctx);
|
char_u *find_ex_command(exarg_T *eap, int *full, void *(*lookup)(char_u *, size_t, cctx_T *), cctx_T *cctx);
|
||||||
|
6
src/testdir/dumps/Test_vim9_silent_echo.dump
Normal file
6
src/testdir/dumps/Test_vim9_silent_echo.dump
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
| +0&#ffffff0@74
|
||||||
|
|~+0#4040ff13&| @73
|
||||||
|
|~| @73
|
||||||
|
|~| @73
|
||||||
|
|~| @73
|
||||||
|
|:+0#0000000&|a|b|c> @70
|
@ -3,6 +3,7 @@
|
|||||||
source check.vim
|
source check.vim
|
||||||
source view_util.vim
|
source view_util.vim
|
||||||
source vim9.vim
|
source vim9.vim
|
||||||
|
source screendump.vim
|
||||||
|
|
||||||
func Test_def_basic()
|
func Test_def_basic()
|
||||||
def SomeFunc(): string
|
def SomeFunc(): string
|
||||||
@ -903,5 +904,27 @@ def Test_line_continuation_in_def()
|
|||||||
assert_equal('full', Line_continuation_in_def('.'))
|
assert_equal('full', Line_continuation_in_def('.'))
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
def Test_silent_echo()
|
||||||
|
CheckScreendump
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
def EchoNothing()
|
||||||
|
silent echo ''
|
||||||
|
enddef
|
||||||
|
defcompile
|
||||||
|
END
|
||||||
|
writefile(lines, 'XTest_silent_echo')
|
||||||
|
|
||||||
|
" Check that the balloon shows up after a mouse move
|
||||||
|
let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
|
||||||
|
term_sendkeys(buf, ":abc")
|
||||||
|
call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
|
||||||
|
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('XTest_silent_echo')
|
||||||
|
enddef
|
||||||
|
|
||||||
|
|
||||||
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
||||||
|
@ -754,6 +754,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1137,
|
||||||
/**/
|
/**/
|
||||||
1136,
|
1136,
|
||||||
/**/
|
/**/
|
||||||
|
@ -6809,6 +6809,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
|
|||||||
exarg_T ea;
|
exarg_T ea;
|
||||||
int starts_with_colon = FALSE;
|
int starts_with_colon = FALSE;
|
||||||
char_u *cmd;
|
char_u *cmd;
|
||||||
|
int save_msg_scroll = msg_scroll;
|
||||||
|
|
||||||
// Bail out on the first error to avoid a flood of errors and report
|
// Bail out on the first error to avoid a flood of errors and report
|
||||||
// the right line number when inside try/catch.
|
// the right line number when inside try/catch.
|
||||||
@ -6897,6 +6898,8 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
|
|||||||
line = (char_u *)"";
|
line = (char_u *)"";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// TODO: use modifiers in the command
|
||||||
|
undo_cmdmod(&ea, save_msg_scroll);
|
||||||
|
|
||||||
// Skip ":call" to get to the function name.
|
// Skip ":call" to get to the function name.
|
||||||
if (checkforcmd(&ea.cmd, "call", 3))
|
if (checkforcmd(&ea.cmd, "call", 3))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user