To: vim_dev@googlegroups.com Subject: Patch 9.0.0350 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0350 Problem: :echowindow does not work in a compiled function. Solution: Handle the expression at compile time. Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c, src/vim9cmds.c, src/ex_docmd.c, src/proto/ex_docmd.pro, src/channel.c, src/popupwin.c, src/proto/popupwin.pro, src/testdir/test_vim9_disassemble.vim, src/testdir/test_vim9_script.vim *** ../vim-9.0.0349/src/vim9compile.c 2022-08-24 16:30:30.690752449 +0100 --- src/vim9compile.c 2022-09-01 15:41:48.305050277 +0100 *************** *** 3251,3260 **** case CMD_echo: case CMD_echon: - case CMD_execute: - case CMD_echomsg: - case CMD_echoerr: case CMD_echoconsole: line = compile_mult_expr(p, ea.cmdidx, &cctx); break; --- 3251,3263 ---- case CMD_echo: case CMD_echon: case CMD_echoconsole: + case CMD_echoerr: + case CMD_echomsg: + #ifdef HAS_MESSAGE_WINDOW + case CMD_echowindow: + #endif + case CMD_execute: line = compile_mult_expr(p, ea.cmdidx, &cctx); break; *** ../vim-9.0.0349/src/vim9.h 2022-05-17 15:59:25.000000000 +0100 --- src/vim9.h 2022-09-01 15:33:20.216795598 +0100 *************** *** 25,30 **** --- 25,31 ---- ISN_EXECUTE, // :execute with isn_arg.number items on top of stack ISN_ECHOMSG, // :echomsg with isn_arg.number items on top of stack ISN_ECHOCONSOLE, // :echoconsole with isn_arg.number items on top of stack + ISN_ECHOWINDOW, // :echowindow with isn_arg.number items on top of stack ISN_ECHOERR, // :echoerr with isn_arg.number items on top of stack ISN_RANGE, // compute range from isn_arg.string, push to stack ISN_SUBSTITUTE, // :s command with expression *** ../vim-9.0.0349/src/vim9execute.c 2022-07-18 17:48:46.380542879 +0100 --- src/vim9execute.c 2022-09-01 15:48:23.887919735 +0100 *************** *** 2858,2867 **** --- 2858,2869 ---- // :execute {string} ... // :echomsg {string} ... + // :echowindow {string} ... // :echoconsole {string} ... // :echoerr {string} ... case ISN_EXECUTE: case ISN_ECHOMSG: + case ISN_ECHOWINDOW: case ISN_ECHOCONSOLE: case ISN_ECHOERR: { *************** *** 2932,2937 **** --- 2934,2947 ---- msg_attr(ga.ga_data, echo_attr); out_flush(); } + #ifdef HAS_MESSAGE_WINDOW + else if (iptr->isn_type == ISN_ECHOWINDOW) + { + start_echowindow(); + msg_attr(ga.ga_data, echo_attr); + end_echowindow(); + } + #endif else if (iptr->isn_type == ISN_ECHOCONSOLE) { ui_write(ga.ga_data, (int)STRLEN(ga.ga_data), *************** *** 5570,5575 **** --- 5580,5589 ---- smsg("%s%4d ECHOMSG %lld", pfx, current, (varnumber_T)(iptr->isn_arg.number)); break; + case ISN_ECHOWINDOW: + smsg("%s%4d ECHOWINDOW %lld", pfx, current, + (varnumber_T)(iptr->isn_arg.number)); + break; case ISN_ECHOCONSOLE: smsg("%s%4d ECHOCONSOLE %lld", pfx, current, (varnumber_T)(iptr->isn_arg.number)); *** ../vim-9.0.0349/src/vim9cmds.c 2022-08-14 21:46:03.686021093 +0100 --- src/vim9cmds.c 2022-09-01 15:42:15.825060050 +0100 *************** *** 1735,1740 **** --- 1735,1744 ---- generate_MULT_EXPR(cctx, ISN_EXECUTE, count); else if (cmdidx == CMD_echomsg) generate_MULT_EXPR(cctx, ISN_ECHOMSG, count); + #ifdef HAS_MESSAGE_WINDOW + else if (cmdidx == CMD_echowindow) + generate_MULT_EXPR(cctx, ISN_ECHOWINDOW, count); + #endif else if (cmdidx == CMD_echoconsole) generate_MULT_EXPR(cctx, ISN_ECHOCONSOLE, count); else *** ../vim-9.0.0349/src/ex_docmd.c 2022-09-01 12:58:46.580970180 +0100 --- src/ex_docmd.c 2022-09-01 15:47:26.992101004 +0100 *************** *** 8349,8359 **** } /* ! * ":redraw": force redraw */ void ex_redraw(exarg_T *eap) { int r = RedrawingDisabled; int p = p_lz; --- 8349,8368 ---- } /* ! * ":redraw": force redraw, with clear for ":redraw!". */ void ex_redraw(exarg_T *eap) { + redraw_cmd(eap->forceit); + } + + /* + * ":redraw": force redraw, with clear if "clear" is TRUE. + */ + void + redraw_cmd(int clear) + { int r = RedrawingDisabled; int p = p_lz; *************** *** 8361,8367 **** p_lz = FALSE; validate_cursor(); update_topline(); ! update_screen(eap->forceit ? UPD_CLEAR : VIsual_active ? UPD_INVERTED : 0); if (need_maketitle) maketitle(); #if defined(MSWIN) && (!defined(FEAT_GUI_MSWIN) || defined(VIMDLL)) --- 8370,8376 ---- p_lz = FALSE; validate_cursor(); update_topline(); ! update_screen(clear ? UPD_CLEAR : VIsual_active ? UPD_INVERTED : 0); if (need_maketitle) maketitle(); #if defined(MSWIN) && (!defined(FEAT_GUI_MSWIN) || defined(VIMDLL)) *** ../vim-9.0.0349/src/proto/ex_docmd.pro 2022-06-27 23:15:04.000000000 +0100 --- src/proto/ex_docmd.pro 2022-09-01 15:47:21.336119928 +0100 *************** *** 55,60 **** --- 55,61 ---- void do_sleep(long msec, int hide_cursor); void ex_may_print(exarg_T *eap); void ex_redraw(exarg_T *eap); + void redraw_cmd(int clear); int vim_mkdir_emsg(char_u *name, int prot); FILE *open_exfile(char_u *fname, int forceit, char *mode); void update_topline_cursor(void); *** ../vim-9.0.0349/src/channel.c 2022-08-30 19:48:17.198760230 +0100 --- src/channel.c 2022-09-01 15:47:00.592190781 +0100 *************** *** 2731,2742 **** } else if (STRCMP(cmd, "redraw") == 0) { - exarg_T ea; - ch_log(channel, "redraw"); ! CLEAR_FIELD(ea); ! ea.forceit = *arg != NUL; ! ex_redraw(&ea); showruler(FALSE); setcursor(); out_flush_cursor(TRUE, FALSE); --- 2731,2738 ---- } else if (STRCMP(cmd, "redraw") == 0) { ch_log(channel, "redraw"); ! redraw_cmd(*arg != NUL); showruler(FALSE); setcursor(); out_flush_cursor(TRUE, FALSE); *** ../vim-9.0.0349/src/popupwin.c 2022-08-31 14:46:07.911016920 +0100 --- src/popupwin.c 2022-09-01 15:45:36.136504932 +0100 *************** *** 4529,4534 **** --- 4529,4559 ---- popup_hide(message_win); } + /* + * Invoked before outputting a message for ":echowindow". + */ + void + start_echowindow(void) + { + in_echowindow = TRUE; + } + + /* + * Invoked after outputting a message for ":echowindow". + */ + void + end_echowindow(void) + { + // show the message window now + redraw_cmd(FALSE); + + // do not overwrite messages + // TODO: only for message window + msg_didout = TRUE; + if (msg_col == 0) + msg_col = 1; + in_echowindow = FALSE; + } #endif /* *** ../vim-9.0.0349/src/proto/popupwin.pro 2022-08-31 14:46:07.911016920 +0100 --- src/proto/popupwin.pro 2022-09-01 15:42:55.833073763 +0100 *************** *** 67,72 **** --- 67,74 ---- void popup_show_message_win(void); int popup_message_win_visible(void); void popup_hide_message_win(void); + void start_echowindow(void); + void end_echowindow(void); int popup_win_closed(win_T *win); void popup_set_title(win_T *wp); void popup_update_preview_title(void); *** ../vim-9.0.0349/src/testdir/test_vim9_disassemble.vim 2022-08-29 22:31:15.923685244 +0100 --- src/testdir/test_vim9_disassemble.vim 2022-09-01 15:55:52.190913466 +0100 *************** *** 2274,2279 **** --- 2274,2281 ---- echomsg 'some' 'message' echoconsole 'nothing' echoerr 'went' .. 'wrong' + var local = 'window' + echowin 'in' local enddef def Test_disassemble_echomsg() *************** *** 2289,2295 **** "echoerr 'went' .. 'wrong'\\_s*" .. '\d PUSHS "wentwrong"\_s*' .. '\d ECHOERR 1\_s*' .. ! '\d RETURN void', res) enddef --- 2291,2304 ---- "echoerr 'went' .. 'wrong'\\_s*" .. '\d PUSHS "wentwrong"\_s*' .. '\d ECHOERR 1\_s*' .. ! "var local = 'window'\\_s*" .. ! '\d\+ PUSHS "window"\_s*' .. ! '\d\+ STORE $0\_s*' .. ! "echowin 'in' local\\_s*" .. ! '\d\+ PUSHS "in"\_s*' .. ! '\d\+ LOAD $0\_s*' .. ! '\d\+ ECHOWINDOW 2\_s*' .. ! '\d\+ RETURN void', res) enddef *** ../vim-9.0.0349/src/testdir/test_vim9_script.vim 2022-08-29 22:31:15.923685244 +0100 --- src/testdir/test_vim9_script.vim 2022-09-01 15:30:52.472680102 +0100 *************** *** 2011,2016 **** --- 2011,2023 ---- # output goes anywhere enddef + def Test_echowindow_cmd() + var local = 'local' + echowindow 'something' local # comment + # output goes in message window + popup_clear() + enddef + def Test_for_outside_of_function() var lines =<< trim END vim9script *** ../vim-9.0.0349/src/version.c 2022-09-01 15:00:17.992986820 +0100 --- src/version.c 2022-09-01 15:31:25.376708178 +0100 *************** *** 709,710 **** --- 709,712 ---- { /* Add new patch number below this line */ + /**/ + 350, /**/ -- | Ceci n'est pas une pipe. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///