From e8ffddc85758bd2a933ab086c7a65363fd46831b Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Thu, 20 Jul 2023 07:41:39 +0200 Subject: [PATCH] Cannot wrap around in popup_filter_menu() Currently, it is not possible, to wrap around at the end of the list using e.g. down (and go back to the top) or up at the beginning of the list and go directly to the last item. So let's just allow this. fixes vim/vim#12689 Adjut test --- src/popupwin.c | 20 +++++++++++++------ .../dumps/Test_popupwin_menu_scroll_3.dump | 6 +++--- .../dumps/Test_popupwin_menu_scroll_3a.dump | 10 ++++++++++ .../dumps/Test_popupwin_menu_scroll_6.dump | 6 +++--- .../dumps/Test_popupwin_menu_scroll_6a.dump | 10 ++++++++++ src/testdir/test_popupwin.vim | 15 +++++++++++--- 6 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 src/testdir/dumps/Test_popupwin_menu_scroll_3a.dump create mode 100644 src/testdir/dumps/Test_popupwin_menu_scroll_6a.dump diff --git a/src/popupwin.c b/src/popupwin.c index a0d33fd0bb56f..afbc52f235f68 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -2560,12 +2560,20 @@ f_popup_filter_menu(typval_T *argvars, typval_T *rettv) res.v_type = VAR_NUMBER; old_lnum = wp->w_cursor.lnum; - if ((c == 'k' || c == 'K' || c == K_UP || c == Ctrl_P) - && wp->w_cursor.lnum > 1) - --wp->w_cursor.lnum; - if ((c == 'j' || c == 'J' || c == K_DOWN || c == Ctrl_N) - && wp->w_cursor.lnum < wp->w_buffer->b_ml.ml_line_count) - ++wp->w_cursor.lnum; + if (c == 'k' || c == 'K' || c == K_UP || c == Ctrl_P) + { + if (wp->w_cursor.lnum > 1) + --wp->w_cursor.lnum; + else + wp->w_cursor.lnum = wp->w_buffer->b_ml.ml_line_count; + } + if (c == 'j' || c == 'J' || c == K_DOWN || c == Ctrl_N) + { + if (wp->w_cursor.lnum < wp->w_buffer->b_ml.ml_line_count) + ++wp->w_cursor.lnum; + else + wp->w_cursor.lnum = 1; + } if (old_lnum != wp->w_cursor.lnum) { // caller will call popup_highlight_curline() diff --git a/src/testdir/dumps/Test_popupwin_menu_scroll_3.dump b/src/testdir/dumps/Test_popupwin_menu_scroll_3.dump index 00fe0c816a016..26bb3f913f8c8 100644 --- a/src/testdir/dumps/Test_popupwin_menu_scroll_3.dump +++ b/src/testdir/dumps/Test_popupwin_menu_scroll_3.dump @@ -1,9 +1,9 @@ >1+0&#ffffff0| @73 |2| @73 |3| @29|╔+0#0000001#ffd7ff255|═@10|╗| +0#0000000#ffffff0@30 -|4| @29|║+0#0000001#ffd7ff255| |s|e|v|e|n| @3| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 -|5| @29|║+0#0000001#ffd7ff255| |e|i|g|h|t| @3| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 -|6| @29|║+0#0000001#ffd7ff255| |n+0&#e0e0e08|i|n|e| @3| +0&#ffd7ff255| +0#0000000#0000001|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|4| @29|║+0#0000001#ffd7ff255| |f|i|v|e| @4| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|5| @29|║+0#0000001#ffd7ff255| |s|i|x| @5| +0#0000000#0000001|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|6| @29|║+0#0000001#ffd7ff255| |s+0&#e0e0e08|e|v|e|n| @2| +0&#ffd7ff255| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 |7| @29|╚+0#0000001#ffd7ff255|═@10|╝| +0#0000000#ffffff0@30 |8| @73 |9| @73 diff --git a/src/testdir/dumps/Test_popupwin_menu_scroll_3a.dump b/src/testdir/dumps/Test_popupwin_menu_scroll_3a.dump new file mode 100644 index 0000000000000..00fe0c816a016 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_menu_scroll_3a.dump @@ -0,0 +1,10 @@ +>1+0&#ffffff0| @73 +|2| @73 +|3| @29|╔+0#0000001#ffd7ff255|═@10|╗| +0#0000000#ffffff0@30 +|4| @29|║+0#0000001#ffd7ff255| |s|e|v|e|n| @3| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|5| @29|║+0#0000001#ffd7ff255| |e|i|g|h|t| @3| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|6| @29|║+0#0000001#ffd7ff255| |n+0&#e0e0e08|i|n|e| @3| +0&#ffd7ff255| +0#0000000#0000001|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|7| @29|╚+0#0000001#ffd7ff255|═@10|╝| +0#0000000#ffffff0@30 +|8| @73 +|9| @73 +@57|1|,|1| @10|T|o|p| diff --git a/src/testdir/dumps/Test_popupwin_menu_scroll_6.dump b/src/testdir/dumps/Test_popupwin_menu_scroll_6.dump index 6718bb37b0d4c..f4272aff26310 100644 --- a/src/testdir/dumps/Test_popupwin_menu_scroll_6.dump +++ b/src/testdir/dumps/Test_popupwin_menu_scroll_6.dump @@ -1,9 +1,9 @@ >1+0&#ffffff0| @73 |2| @73 |3| @29|╔+0#0000001#ffd7ff255|═@10|╗| +0#0000000#ffffff0@30 -|4| @29|║+0#0000001#ffd7ff255| |o+0&#e0e0e08|n|e| @4| +0&#ffd7ff255| +0#0000000#0000001|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 -|5| @29|║+0#0000001#ffd7ff255| |t|w|o| @5| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 -|6| @29|║+0#0000001#ffd7ff255| |t|h|r|e@1| @3| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|4| @29|║+0#0000001#ffd7ff255| |f+0&#e0e0e08|o|u|r| @3| +0&#ffd7ff255| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|5| @29|║+0#0000001#ffd7ff255| |f|i|v|e| @4| +0#0000000#0000001|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|6| @29|║+0#0000001#ffd7ff255| |s|i|x| @5| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 |7| @29|╚+0#0000001#ffd7ff255|═@10|╝| +0#0000000#ffffff0@30 |8| @73 |9| @73 diff --git a/src/testdir/dumps/Test_popupwin_menu_scroll_6a.dump b/src/testdir/dumps/Test_popupwin_menu_scroll_6a.dump new file mode 100644 index 0000000000000..6718bb37b0d4c --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_menu_scroll_6a.dump @@ -0,0 +1,10 @@ +>1+0&#ffffff0| @73 +|2| @73 +|3| @29|╔+0#0000001#ffd7ff255|═@10|╗| +0#0000000#ffffff0@30 +|4| @29|║+0#0000001#ffd7ff255| |o+0&#e0e0e08|n|e| @4| +0&#ffd7ff255| +0#0000000#0000001|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|5| @29|║+0#0000001#ffd7ff255| |t|w|o| @5| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|6| @29|║+0#0000001#ffd7ff255| |t|h|r|e@1| @3| +0#0000000#a8a8a8255|║+0#0000001#ffd7ff255| +0#0000000#ffffff0@30 +|7| @29|╚+0#0000001#ffd7ff255|═@10|╝| +0#0000000#ffffff0@30 +|8| @73 +|9| @73 +@57|1|,|1| @10|T|o|p| diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 7e1a0fca868b7..8a202473c65c3 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -1794,7 +1794,8 @@ func Test_popup_menu() let winid = ShowMenu(" ", 1) let winid = ShowMenu("j \", 2) let winid = ShowMenu("JjK \", 2) - let winid = ShowMenu("jjjjjj ", 3) + " wraps around + let winid = ShowMenu("jjjjjj ", 1) let winid = ShowMenu("kkk ", 1) let winid = ShowMenu("x", -1) let winid = ShowMenu("X", -1) @@ -3053,20 +3054,28 @@ func Test_popup_menu_with_scrollbar() call term_sendkeys(buf, "jjj") call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {}) - " if the cursor is the bottom line, it stays at the bottom line. + " the cursor wraps around at the bottom call term_sendkeys(buf, repeat("j", 20)) call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {}) + " if the cursor is again at the bottom line + call term_sendkeys(buf, repeat("j", 2)) + call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3a', {}) + call term_sendkeys(buf, "kk") call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {}) call term_sendkeys(buf, "k") call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {}) - " if the cursor is in the top line, it stays in the top line. + " the cursor wraps around at the top call term_sendkeys(buf, repeat("k", 20)) call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {}) + " the cursor at the top of the window again + call term_sendkeys(buf, repeat("k", 3)) + call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6a', {}) + " close the menu popupwin. call term_sendkeys(buf, " ")