To: vim_dev@googlegroups.com Subject: Patch 9.0.0099 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0099 Problem: Scrollback can be wrong after redrawing the command line. Solution: Clear unfinished scrollback when redrawing. (closes #10807) Files: src/ex_getln.c, src/message.c, src/proto/message.pro, src/testdir/test_messages.vim *** ../vim-9.0.0098/src/ex_getln.c 2022-07-26 20:42:21.822448308 +0100 --- src/ex_getln.c 2022-07-28 12:28:25.999926525 +0100 *************** *** 3892,3897 **** --- 3892,3898 ---- return; } + sb_text_restart_cmdline(); msg_start(); redrawcmdprompt(); *************** *** 4106,4112 **** #if defined(FEAT_EVAL) || defined(FEAT_CMDWIN) || defined(PROTO) /* ! * Get pointer to the command line info to use. save_ccline() may clear * ccline and put the previous value in prev_ccline. */ static cmdline_info_T * --- 4107,4113 ---- #if defined(FEAT_EVAL) || defined(FEAT_CMDWIN) || defined(PROTO) /* ! * Get pointer to the command line info to use. save_cmdline() may clear * ccline and put the previous value in prev_ccline. */ static cmdline_info_T * *** ../vim-9.0.0098/src/message.c 2022-07-25 19:50:53.954361274 +0100 --- src/message.c 2022-07-28 12:28:25.999926525 +0100 *************** *** 2535,2540 **** --- 2535,2541 ---- || do_clear_sb_text == SB_CLEAR_CMDLINE_DONE) { clear_sb_text(do_clear_sb_text == SB_CLEAR_ALL); + msg_sb_eol(); // prevent messages from overlapping do_clear_sb_text = SB_CLEAR_NONE; } *************** *** 2579,2601 **** } /* ! * Starting to edit the command line, do not clear messages now. */ void sb_text_start_cmdline(void) { do_clear_sb_text = SB_CLEAR_CMDLINE_BUSY; ! msg_sb_eol(); } /* ! * Ending to edit the command line. Clear old lines but the last one later. */ void sb_text_end_cmdline(void) { do_clear_sb_text = SB_CLEAR_CMDLINE_DONE; - msg_sb_eol(); } /* --- 2580,2637 ---- } /* ! * Starting to edit the command line: do not clear messages now. */ void sb_text_start_cmdline(void) { + if (do_clear_sb_text == SB_CLEAR_CMDLINE_BUSY) + // Invoking command line recursively: the previous-level command line + // doesn't need to be remembered as it will be redrawn when returning + // to that level. + sb_text_restart_cmdline(); + else + { + msg_sb_eol(); + do_clear_sb_text = SB_CLEAR_CMDLINE_BUSY; + } + } + + /* + * Redrawing the command line: clear the last unfinished line. + */ + void + sb_text_restart_cmdline(void) + { + msgchunk_T *tofree; + + // Needed when returning from nested command line. do_clear_sb_text = SB_CLEAR_CMDLINE_BUSY; ! ! if (last_msgchunk == NULL || last_msgchunk->sb_eol) ! // No unfinished line: don't clear anything. ! return; ! ! tofree = msg_sb_start(last_msgchunk); ! last_msgchunk = tofree->sb_prev; ! if (last_msgchunk != NULL) ! last_msgchunk->sb_next = NULL; ! while (tofree != NULL) ! { ! msgchunk_T *tofree_next = tofree->sb_next; ! ! vim_free(tofree); ! tofree = tofree_next; ! } } /* ! * Ending to edit the command line: clear old lines but the last one later. */ void sb_text_end_cmdline(void) { do_clear_sb_text = SB_CLEAR_CMDLINE_DONE; } /* *** ../vim-9.0.0098/src/proto/message.pro 2022-06-27 23:15:15.000000000 +0100 --- src/proto/message.pro 2022-07-28 12:28:25.999926525 +0100 *************** *** 48,53 **** --- 48,54 ---- int message_filtered(char_u *msg); void may_clear_sb_text(void); void sb_text_start_cmdline(void); + void sb_text_restart_cmdline(void); void sb_text_end_cmdline(void); void clear_sb_text(int all); void show_sb_text(void); *** ../vim-9.0.0098/src/testdir/test_messages.vim 2022-07-25 19:50:53.954361274 +0100 --- src/testdir/test_messages.vim 2022-07-28 12:28:25.999926525 +0100 *************** *** 176,182 **** let buf = RunVimInTerminal('', {'rows': 6}) call term_sendkeys(buf, ":call setline(1, range(1, 100))\n") ! call term_sendkeys(buf, ":%p#\n") call WaitForAssert({-> assert_equal(' 5 5', term_getline(buf, 5))}) call WaitForAssert({-> assert_equal('-- More --', term_getline(buf, 6))}) --- 176,184 ---- let buf = RunVimInTerminal('', {'rows': 6}) call term_sendkeys(buf, ":call setline(1, range(1, 100))\n") ! call term_sendkeys(buf, ":%pfoo\\\#") ! call WaitForAssert({-> assert_equal(':%p#', term_getline(buf, 6))}) ! call term_sendkeys(buf, "\n") call WaitForAssert({-> assert_equal(' 5 5', term_getline(buf, 5))}) call WaitForAssert({-> assert_equal('-- More --', term_getline(buf, 6))}) *************** *** 252,257 **** --- 254,266 ---- call WaitForAssert({-> assert_equal('100 100', term_getline(buf, 5))}) call WaitForAssert({-> assert_equal('Press ENTER or type command to continue', term_getline(buf, 6))}) + " A command line that doesn't print text is appended to scrollback, + " even if it invokes a nested command line. + call term_sendkeys(buf, ":\=':'\:\g<") + call WaitForAssert({-> assert_equal('100 100', term_getline(buf, 4))}) + call WaitForAssert({-> assert_equal(':::', term_getline(buf, 5))}) + call WaitForAssert({-> assert_equal('Press ENTER or type command to continue', term_getline(buf, 6))}) + call term_sendkeys(buf, ":%p#\n") call WaitForAssert({-> assert_equal(' 5 5', term_getline(buf, 5))}) call WaitForAssert({-> assert_equal('-- More --', term_getline(buf, 6))}) *** ../vim-9.0.0098/src/version.c 2022-07-28 12:09:00.605870804 +0100 --- src/version.c 2022-07-28 12:29:52.175778831 +0100 *************** *** 737,738 **** --- 737,740 ---- { /* Add new patch number below this line */ + /**/ + 99, /**/ -- hundred-and-one symptoms of being an internet addict: 166. You have been on your computer soo long that you didn't realize you had grandchildren. /// 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 ///