diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt index b9e992b04c..b1e6c0cb35 100644 --- a/runtime/doc/popup.txt +++ b/runtime/doc/popup.txt @@ -1,4 +1,4 @@ -*popup.txt* For Vim version 9.1. Last change: 2024 Jun 16 +*popup.txt* For Vim version 9.1. Last change: 2024 Dec 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -705,7 +705,6 @@ The second argument of |popup_create()| is a dictionary with options: present. Use zero to reset. fixed When FALSE (the default), and: - "pos" is "botleft" or "topleft", and - - "wrap" is off, and - the popup would be truncated at the right edge of the screen, then the popup is moved to the left so as to fit the diff --git a/src/popupwin.c b/src/popupwin.c index 8c567173f9..404549097b 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -1434,17 +1434,7 @@ popup_adjust_position(win_T *wp) len = linetabsize(wp, lnum); wp->w_width = w_width; - if (wp->w_p_wrap) - { - while (len + margin_width > maxwidth) - { - ++wrapped; - len -= maxwidth - margin_width; - wp->w_width = maxwidth; - used_maxwidth = TRUE; - } - } - else if (len + margin_width > maxwidth + if (len + margin_width > maxwidth && allow_adjust_left && (wp->w_popup_pos == POPPOS_TOPLEFT || wp->w_popup_pos == POPPOS_BOTLEFT)) @@ -1456,7 +1446,6 @@ popup_adjust_position(win_T *wp) { int truncate_shift = shift_by - wp->w_wincol; - len -= truncate_shift; shift_by -= truncate_shift; } @@ -1464,6 +1453,16 @@ popup_adjust_position(win_T *wp) maxwidth += shift_by; wp->w_width = maxwidth; } + if (wp->w_p_wrap) + { + while (len + margin_width > maxwidth) + { + ++wrapped; + len -= maxwidth - margin_width; + wp->w_width = maxwidth; + used_maxwidth = TRUE; + } + } if (wp->w_width < len + margin_width) { wp->w_width = len + margin_width; diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index d345b3eed6..8b6b78ff96 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -31,7 +31,7 @@ func Test_simple_popup() \ .. "#{text: 'a comment line', props: [#{" \ .. "col: 3, length: 7, minwidth: 20, type: 'comment'" \ .. "}]}," - \ .. "], #{line: 4, col: 9, minwidth: 20})\") + \ .. "], #{line: 4, col: 9, minwidth: 20, fixed: v:true})\") call VerifyScreenDump(buf, 'Test_popupwin_02', {}) " switch back to first tabpage @@ -87,7 +87,7 @@ func Test_popup_with_border_and_padding() call popup_create('hello both', #{line: 2, col: 43, border: [], padding: [], highlight: 'Normal'}) call popup_create('border TL', #{line: 6, col: 3, border: [1, 0, 0, 4]}) call popup_create('paddings', #{line: 6, col: 23, padding: range(1, 4)}) - call popup_create('wrapped longer text', #{line: 8, col: 55, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]}) + call popup_create('wrapped longer text', #{line: 8, col: 55, padding: [0, 3, 0, 3], border: [0, 1, 0, 1], fixed: v:true}) call popup_create('right aligned text', #{line: 11, col: 56, wrap: 0, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]}) call popup_create('X', #{line: 2, col: 73}) call popup_create('X', #{line: 3, col: 74}) @@ -1970,7 +1970,7 @@ func Test_popup_position_adjust() " Anything placed past the last cell on the right of the screen is moved to " the left. " - " When wrapping is disabled, we also shift to the left to display on the + " We also shift to the left to display on the " screen, unless fixed is set. " Entries for cases which don't vary based on wrapping. @@ -1995,9 +1995,10 @@ func Test_popup_position_adjust() " - expected height let tests = [ \ #{ - \ comment: 'left-aligned with wrapping', + \ comment: 'left aligned with wrapping, fixed position', \ options: #{ \ wrap: 1, + \ fixed: v:true, \ pos: 'botleft', \ }, \ tests: both_wrap_tests + [ @@ -2022,9 +2023,22 @@ func Test_popup_position_adjust() \ ], \ }, \ #{ - \ comment: 'left aligned without wrapping', + \ comment: 'left aligned with wrapping, no fixed position', + \ options: #{ + \ wrap: 1, + \ fixed: v:false, + \ pos: 'botleft', + \ }, + \ tests: both_wrap_tests + [ + \ [ repeat('a', &columns*3), 5, &columns, 3, 1, &columns, 3], + \ [ repeat('a', 50), 5, &columns, 5, &columns - 50 + 1, 50, 1], + \ ], + \ }, + \ #{ + \ comment: 'left aligned without wrapping, no fixed position', \ options: #{ \ wrap: 0, + \ fixed: v:false, \ pos: 'botleft', \ }, \ tests: both_wrap_tests + [ @@ -2048,7 +2062,7 @@ func Test_popup_position_adjust() \ ], \ }, \ #{ - \ comment: 'left aligned with fixed position', + \ comment: 'left aligned without wrapping, fixed position', \ options: #{ \ wrap: 0, \ fixed: 1, diff --git a/src/version.c b/src/version.c index 00088ff273..762919e6bb 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 949, /**/ 948, /**/