0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 9.0.0321: cannot use the message popup window directly

Problem:    Cannot use the message popup window directly.
Solution:   Add ":echowindow".
This commit is contained in:
Bram Moolenaar 2022-08-29 18:16:32 +01:00
parent 54acb90d9e
commit 37fef16c22
14 changed files with 114 additions and 31 deletions

View File

@ -3821,6 +3821,16 @@ text...
:echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see." :echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
< See |:echo-redraw| to avoid the message disappearing < See |:echo-redraw| to avoid the message disappearing
when the screen is redrawn. when the screen is redrawn.
*:echow* *:echowin* *:echowindow*
:echow[indow] {expr1} ..
Like |:echomsg| but when the messages popup window is
available the message is displayed there. This means
it will show for three seconds and avoid a
|hit-enter| prompt.
The message window is available when Vim was compiled
with the +timer and the +popupwin features.
*:echoe* *:echoerr* *:echoe* *:echoerr*
:echoe[rr] {expr1} .. Echo the expression(s) as an error message, saving the :echoe[rr] {expr1} .. Echo the expression(s) as an error message, saving the
message in the |message-history|. When used in a message in the |message-history|. When used in a

View File

@ -2078,7 +2078,8 @@ set_context_for_expression(
if ((cmdidx == CMD_execute if ((cmdidx == CMD_execute
|| cmdidx == CMD_echo || cmdidx == CMD_echo
|| cmdidx == CMD_echon || cmdidx == CMD_echon
|| cmdidx == CMD_echomsg) || cmdidx == CMD_echomsg
|| cmdidx == CMD_echowindow)
&& xp->xp_context == EXPAND_EXPRESSION) && xp->xp_context == EXPAND_EXPRESSION)
{ {
for (;;) for (;;)
@ -6709,6 +6710,7 @@ get_echo_attr(void)
/* /*
* ":execute expr1 ..." execute the result of an expression. * ":execute expr1 ..." execute the result of an expression.
* ":echomsg expr1 ..." Print a message * ":echomsg expr1 ..." Print a message
* ":echowindow expr1 ..." Print a message in the messages window
* ":echoerr expr1 ..." Print an error * ":echoerr expr1 ..." Print an error
* ":echoconsole expr1 ..." Print a message on stdout * ":echoconsole expr1 ..." Print a message on stdout
* Each gets spaces around each argument and a newline at the end for * Each gets spaces around each argument and a newline at the end for
@ -6726,6 +6728,9 @@ ex_execute(exarg_T *eap)
long start_lnum = SOURCING_LNUM; long start_lnum = SOURCING_LNUM;
ga_init2(&ga, 1, 80); ga_init2(&ga, 1, 80);
#ifdef HAS_MESSAGE_WINDOW
in_echowindow = (eap->cmdidx == CMD_echowindow);
#endif
if (eap->skip) if (eap->skip)
++emsg_skip; ++emsg_skip;
@ -6780,7 +6785,9 @@ ex_execute(exarg_T *eap)
// use the first line of continuation lines for messages // use the first line of continuation lines for messages
SOURCING_LNUM = start_lnum; SOURCING_LNUM = start_lnum;
if (eap->cmdidx == CMD_echomsg || eap->cmdidx == CMD_echoerr) if (eap->cmdidx == CMD_echomsg
|| eap->cmdidx == CMD_echowindow
|| eap->cmdidx == CMD_echoerr)
{ {
// Mark the already saved text as finishing the line, so that what // Mark the already saved text as finishing the line, so that what
// follows is displayed on a new line when scrolling back at the // follows is displayed on a new line when scrolling back at the
@ -6788,7 +6795,7 @@ ex_execute(exarg_T *eap)
msg_sb_eol(); msg_sb_eol();
} }
if (eap->cmdidx == CMD_echomsg) if (eap->cmdidx == CMD_echomsg || eap->cmdidx == CMD_echowindow)
{ {
msg_attr(ga.ga_data, echo_attr); msg_attr(ga.ga_data, echo_attr);
out_flush(); out_flush();
@ -6835,6 +6842,7 @@ ex_execute(exarg_T *eap)
if (msg_col == 0) if (msg_col == 0)
msg_col = 1; msg_col = 1;
} }
in_echowindow = FALSE;
#endif #endif
set_nextcmd(eap, arg); set_nextcmd(eap, arg);
} }

View File

@ -10,27 +10,27 @@ static const unsigned short cmdidxs1[26] =
/* c */ 45, /* c */ 45,
/* d */ 112, /* d */ 112,
/* e */ 137, /* e */ 137,
/* f */ 165, /* f */ 166,
/* g */ 182, /* g */ 183,
/* h */ 188, /* h */ 189,
/* i */ 197, /* i */ 198,
/* j */ 217, /* j */ 218,
/* k */ 219, /* k */ 220,
/* l */ 224, /* l */ 225,
/* m */ 287, /* m */ 288,
/* n */ 305, /* n */ 306,
/* o */ 325, /* o */ 326,
/* p */ 337, /* p */ 338,
/* q */ 376, /* q */ 377,
/* r */ 379, /* r */ 380,
/* s */ 399, /* s */ 400,
/* t */ 469, /* t */ 470,
/* u */ 515, /* u */ 516,
/* v */ 526, /* v */ 527,
/* w */ 547, /* w */ 548,
/* x */ 561, /* x */ 562,
/* y */ 571, /* y */ 572,
/* z */ 572 /* z */ 573
}; };
/* /*
@ -45,7 +45,7 @@ static const unsigned char cmdidxs2[26][26] =
/* b */ { 2, 0, 0, 5, 6, 8, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 23, 0, 0, 0 }, /* b */ { 2, 0, 0, 5, 6, 8, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 23, 0, 0, 0 },
/* c */ { 3, 12, 16, 18, 20, 22, 25, 0, 0, 0, 0, 33, 38, 41, 47, 57, 59, 60, 61, 0, 63, 0, 66, 0, 0, 0 }, /* c */ { 3, 12, 16, 18, 20, 22, 25, 0, 0, 0, 0, 33, 38, 41, 47, 57, 59, 60, 61, 0, 63, 0, 66, 0, 0, 0 },
/* d */ { 0, 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 19, 0, 0, 20, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0 }, /* d */ { 0, 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 19, 0, 0, 20, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0 },
/* e */ { 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 8, 10, 11, 0, 0, 0, 0, 0, 0, 0, 22, 0, 23, 0, 0 }, /* e */ { 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 9, 11, 12, 0, 0, 0, 0, 0, 0, 0, 23, 0, 24, 0, 0 },
/* f */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0 }, /* f */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0 },
/* g */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 4, 5, 0, 0, 0, 0 }, /* g */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 4, 5, 0, 0, 0, 0 },
/* h */ { 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* h */ { 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
@ -69,4 +69,4 @@ static const unsigned char cmdidxs2[26][26] =
/* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } /* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
}; };
static const int command_count = 589; static const int command_count = 590;

View File

@ -548,6 +548,9 @@ EXCMD(CMD_echoconsole, "echoconsole", ex_execute,
EXCMD(CMD_echon, "echon", ex_echo, EXCMD(CMD_echon, "echon", ex_echo,
EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK, EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE), ADDR_NONE),
EXCMD(CMD_echowindow, "echowindow", ex_execute,
EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE),
EXCMD(CMD_else, "else", ex_else, EXCMD(CMD_else, "else", ex_else,
EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE, EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
ADDR_NONE), ADDR_NONE),

View File

@ -3872,6 +3872,8 @@ redrawcmdprompt(void)
void void
redrawcmd(void) redrawcmd(void)
{ {
int save_in_echowindow = in_echowindow;
if (cmd_silent) if (cmd_silent)
return; return;
@ -3883,6 +3885,9 @@ redrawcmd(void)
return; return;
} }
// Do not put this in the message window.
in_echowindow = FALSE;
sb_text_restart_cmdline(); sb_text_restart_cmdline();
msg_start(); msg_start();
redrawcmdprompt(); redrawcmdprompt();
@ -3906,6 +3911,8 @@ redrawcmd(void)
// Typing ':' at the more prompt may set skip_redraw. We don't want this // Typing ':' at the more prompt may set skip_redraw. We don't want this
// in cmdline mode // in cmdline mode
skip_redraw = FALSE; skip_redraw = FALSE;
in_echowindow = save_in_echowindow;
} }
void void

View File

@ -236,6 +236,7 @@ EXTERN int uncaught_emsg; // number of times emsg() was
EXTERN int did_emsg_syntax; // did_emsg set because of a EXTERN int did_emsg_syntax; // did_emsg set because of a
// syntax error // syntax error
EXTERN int called_emsg; // always incremented by emsg() EXTERN int called_emsg; // always incremented by emsg()
EXTERN int in_echowindow; // executing ":echowindow"
EXTERN int ex_exitval INIT(= 0); // exit value for ex mode EXTERN int ex_exitval INIT(= 0); // exit value for ex mode
EXTERN int emsg_on_display INIT(= FALSE); // there is an error message EXTERN int emsg_on_display INIT(= FALSE); // there is an error message
EXTERN int rc_did_emsg INIT(= FALSE); // vim_regcomp() called emsg() EXTERN int rc_did_emsg INIT(= FALSE); // vim_regcomp() called emsg()

View File

@ -1438,7 +1438,8 @@ use_message_window(void)
#ifdef HAS_MESSAGE_WINDOW #ifdef HAS_MESSAGE_WINDOW
// TRUE if there is no command line showing ('cmdheight' is zero and not // TRUE if there is no command line showing ('cmdheight' is zero and not
// already editing or showing a message) use a popup window for messages. // already editing or showing a message) use a popup window for messages.
return p_ch == 0 && cmdline_row >= Rows; // Also when using ":echowindow".
return (p_ch == 0 && cmdline_row >= Rows) || in_echowindow;
#else #else
return FALSE; return FALSE;
#endif #endif
@ -1484,8 +1485,9 @@ msg_start(void)
#ifdef HAS_MESSAGE_WINDOW #ifdef HAS_MESSAGE_WINDOW
if (use_message_window()) if (use_message_window())
{ {
if (popup_message_win_visible() && msg_col > 0 if (popup_message_win_visible()
&& (msg_scroll || !full_screen)) && ((msg_col > 0 && (msg_scroll || !full_screen))
|| in_echowindow))
{ {
win_T *wp = popup_get_message_win(); win_T *wp = popup_get_message_win();

View File

@ -1302,7 +1302,8 @@ popup_adjust_position(win_T *wp)
} }
if (wp->w_popup_pos == POPPOS_BOTTOM) if (wp->w_popup_pos == POPPOS_BOTTOM)
// assume that each buffer line takes one screen line // assume that each buffer line takes one screen line
wp->w_winrow = MAX(Rows - wp->w_buffer->b_ml.ml_line_count - 1, 0); wp->w_winrow = MAX(cmdline_row
- wp->w_buffer->b_ml.ml_line_count - 1, 0);
if (!use_wantcol) if (!use_wantcol)
center_hor = TRUE; center_hor = TRUE;

View File

@ -2606,7 +2606,7 @@ typedef enum {
POPPOS_BOTRIGHT, POPPOS_BOTRIGHT,
POPPOS_TOPRIGHT, POPPOS_TOPRIGHT,
POPPOS_CENTER, POPPOS_CENTER,
POPPOS_BOTTOM, // bottom of popup at bottom of screen POPPOS_BOTTOM, // bottom of popup just above the command line
POPPOS_NONE POPPOS_NONE
} poppos_T; } poppos_T;

View File

@ -0,0 +1,8 @@
>s+0&#ffffff0|o|m|e| |t|e|x|t| @65
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|═+0#e000002&@74
|f|i|r|s|t| |l|i|n|e| @64
| +0#0000000&@56|1|,|1| @10|A|l@1|

View File

@ -0,0 +1,8 @@
>s+0&#ffffff0|o|m|e| |t|e|x|t| @65
|~+0#4040ff13&| @73
|~| @73
|~| @73
|═+0#e000002&@74
|f|i|r|s|t| |l|i|n|e| @64
|s|e|c|o|n|d| |l|i|n|e| @63
| +0#0000000&@56|1|,|1| @10|A|l@1|

View File

@ -0,0 +1,8 @@
>s+0&#ffffff0|o|m|e| |t|e|x|t| @65
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
| +0#0000000&@56|1|,|1| @10|A|l@1|

View File

@ -537,5 +537,30 @@ func Test_cmdheight_zero_shell()
set cmdheight& set cmdheight&
endfunc endfunc
func Test_echowindow()
CheckScreendump
let lines =<< trim END
call setline(1, 'some text')
func ShowMessage(arg)
echowindow a:arg
endfunc
echowindow 'first line'
END
call writefile(lines, 'XtestEchowindow')
let buf = RunVimInTerminal('-S XtestEchowindow', #{rows: 8})
call VerifyScreenDump(buf, 'Test_echowindow_1', {})
call term_sendkeys(buf, ":call ShowMessage('second line')\<CR>")
call VerifyScreenDump(buf, 'Test_echowindow_2', {})
call term_sendkeys(buf, ":call popup_clear()\<CR>")
call VerifyScreenDump(buf, 'Test_echowindow_3', {})
" clean up
call StopVimInTerminal(buf)
call delete('XtestEchowindow')
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@ -707,6 +707,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 */
/**/
321,
/**/ /**/
320, 320,
/**/ /**/