Skip to content

Commit

Permalink
Cannot wrap around in popup_filter_menu()
Browse files Browse the repository at this point in the history
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#12689

Adjut test
  • Loading branch information
chrisbra committed Jul 20, 2023
1 parent d392a74 commit e8ffddc
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 15 deletions.
20 changes: 14 additions & 6 deletions src/popupwin.c
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
6 changes: 3 additions & 3 deletions src/testdir/dumps/Test_popupwin_menu_scroll_3.dump
Original file line number Diff line number Diff line change
@@ -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
Expand Down
10 changes: 10 additions & 0 deletions src/testdir/dumps/Test_popupwin_menu_scroll_3a.dump
Original file line number Diff line number Diff line change
@@ -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|
6 changes: 3 additions & 3 deletions src/testdir/dumps/Test_popupwin_menu_scroll_6.dump
Original file line number Diff line number Diff line change
@@ -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
Expand Down
10 changes: 10 additions & 0 deletions src/testdir/dumps/Test_popupwin_menu_scroll_6a.dump
Original file line number Diff line number Diff line change
@@ -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|
15 changes: 12 additions & 3 deletions src/testdir/test_popupwin.vim
Original file line number Diff line number Diff line change
Expand Up @@ -1794,7 +1794,8 @@ func Test_popup_menu()
let winid = ShowMenu(" ", 1)
let winid = ShowMenu("j \<CR>", 2)
let winid = ShowMenu("JjK \<CR>", 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)
Expand Down Expand Up @@ -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, " ")

Expand Down

0 comments on commit e8ffddc

Please sign in to comment.