0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.0.1540: popup menu positioning fails with longer string

Problem:    Popup menu positioning fails with longer string.
Solution:   Only align with right side of window when width is less than
            'pumwidth' (closes #2661)
This commit is contained in:
Bram Moolenaar
2018-02-24 21:25:44 +01:00
parent 6bb2cdfe60
commit 2b10bcbfc1
5 changed files with 43 additions and 16 deletions

View File

@@ -69,7 +69,7 @@ pum_compute_size(void)
/* /*
* Show the popup menu with items "array[size]". * Show the popup menu with items "array[size]".
* "array" must remain valid until pum_undisplay() is called! * "array" must remain valid until pum_undisplay() is called!
* When possible the leftmost character is aligned with screen column "col". * When possible the leftmost character is aligned with cursor column.
* The menu appears above the screen line "row" or at "row" + "height" - 1. * The menu appears above the screen line "row" or at "row" + "height" - 1.
*/ */
void void
@@ -83,7 +83,7 @@ pum_display(
int max_width; int max_width;
int row; int row;
int context_lines; int context_lines;
int col; int cursor_col;
int above_row; int above_row;
int below_row; int below_row;
int redo_count = 0; int redo_count = 0;
@@ -199,10 +199,11 @@ pum_display(
/* Calculate column */ /* Calculate column */
#ifdef FEAT_RIGHTLEFT #ifdef FEAT_RIGHTLEFT
if (curwin->w_p_rl) if (curwin->w_p_rl)
col = curwin->w_wincol + curwin->w_width - curwin->w_wcol - 1; cursor_col = curwin->w_wincol + curwin->w_width
- curwin->w_wcol - 1;
else else
#endif #endif
col = curwin->w_wincol + curwin->w_wcol; cursor_col = curwin->w_wincol + curwin->w_wcol;
/* if there are more items than room we need a scrollbar */ /* if there are more items than room we need a scrollbar */
if (pum_height < size) if (pum_height < size)
@@ -216,15 +217,17 @@ pum_display(
if (def_width < max_width) if (def_width < max_width)
def_width = max_width; def_width = max_width;
if (((col < Columns - p_pw || col < Columns - max_width) if (((cursor_col < Columns - p_pw
|| cursor_col < Columns - max_width)
#ifdef FEAT_RIGHTLEFT #ifdef FEAT_RIGHTLEFT
&& !curwin->w_p_rl) && !curwin->w_p_rl)
|| (curwin->w_p_rl && (col > p_pw || col > max_width) || (curwin->w_p_rl
&& (cursor_col > p_pw || cursor_col > max_width)
#endif #endif
)) ))
{ {
/* align pum column with "col" */ /* align pum with "cursor_col" */
pum_col = col; pum_col = cursor_col;
/* start with the maximum space available */ /* start with the maximum space available */
#ifdef FEAT_RIGHTLEFT #ifdef FEAT_RIGHTLEFT
@@ -237,33 +240,36 @@ pum_display(
if (pum_width > max_width + pum_kind_width + pum_extra_width + 1 if (pum_width > max_width + pum_kind_width + pum_extra_width + 1
&& pum_width > p_pw) && pum_width > p_pw)
{ {
/* the width is too much, make it narrower */ /* the width is more than needed for the items, make it
* narrower */
pum_width = max_width + pum_kind_width + pum_extra_width + 1; pum_width = max_width + pum_kind_width + pum_extra_width + 1;
if (pum_width < p_pw) if (pum_width < p_pw)
pum_width = p_pw; pum_width = p_pw;
} }
else if (((col > p_pw || col > max_width) else if (((cursor_col > p_pw || cursor_col > max_width)
#ifdef FEAT_RIGHTLEFT #ifdef FEAT_RIGHTLEFT
&& !curwin->w_p_rl) && !curwin->w_p_rl)
|| (curwin->w_p_rl && (col < Columns - p_pw || (curwin->w_p_rl && (cursor_col < Columns - p_pw
|| col < Columns - max_width) || cursor_col < Columns - max_width)
#endif #endif
)) ))
{ {
/* align right pum edge with "col" */ /* align pum edge with "cursor_col" */
#ifdef FEAT_RIGHTLEFT #ifdef FEAT_RIGHTLEFT
if (curwin->w_p_rl if (curwin->w_p_rl
&& W_ENDCOL(curwin) < max_width + pum_scrollbar + 1) && W_ENDCOL(curwin) < max_width + pum_scrollbar + 1)
{ {
pum_col = col + max_width + pum_scrollbar + 1; pum_col = cursor_col + max_width + pum_scrollbar + 1;
if (pum_col >= Columns) if (pum_col >= Columns)
pum_col = Columns - 1; pum_col = Columns - 1;
} }
else if (!curwin->w_p_rl) else if (!curwin->w_p_rl)
#endif #endif
{ {
if (curwin->w_wincol > Columns - max_width - pum_scrollbar) if (curwin->w_wincol > Columns - max_width - pum_scrollbar
&& max_width <= p_pw)
{ {
/* use full width to end of the screen */
pum_col = Columns - max_width - pum_scrollbar; pum_col = Columns - max_width - pum_scrollbar;
if (pum_col < 0) if (pum_col < 0)
pum_col = 0; pum_col = 0;

View File

@@ -0,0 +1,10 @@
|1+0&#ffffff0|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7||+1&&|1+0&&|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7
|8|9|_|a| @32||+1&&|8+0&&|9|_|a| @32
|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7||+1&&|1+0&&|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7
|8|9|_|b| @32||+1&&|8+0&&|9|_|b| @32
@12|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5||+1&&| +0&&@11|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5
|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|a| @20||+1&&|6+0&&|7|8|9|_|1|2|3|4|5|6|7|8|9|_|a| @20
|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @9| +0#0000001#e0e0e08|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5
|~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @9| +0#0000001#ffd7ff255|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5
|~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35
|~| @35||+1#0000000&|~+0#4040ff13&| @35

View File

@@ -48,7 +48,7 @@ endfunc
" Stop a Vim running in terminal buffer "buf". " Stop a Vim running in terminal buffer "buf".
func StopVimInTerminal(buf) func StopVimInTerminal(buf)
call assert_equal("running", term_getstatus(a:buf)) call assert_equal("running", term_getstatus(a:buf))
call term_sendkeys(a:buf, ":qa!\<cr>") call term_sendkeys(a:buf, "\<Esc>\<Esc>:qa!\<cr>")
call WaitFor('term_getstatus(' . a:buf . ') == "finished"') call WaitFor('term_getstatus(' . a:buf . ') == "finished"')
only! only!
endfunc endfunc

View File

@@ -772,6 +772,15 @@ func Test_popup_position()
call term_sendkeys(buf, "GA\<C-N>") call term_sendkeys(buf, "GA\<C-N>")
call VerifyScreenDump(buf, 'Test_popup_position_03', {'rows': 8}) call VerifyScreenDump(buf, 'Test_popup_position_03', {'rows': 8})
" completed text wider than the window and 'pumwidth' smaller than available
" space
call term_sendkeys(buf, "\<Esc>u")
call term_sendkeys(buf, ":set pumwidth=20\<CR>")
call term_sendkeys(buf, "ggI123456789_\<Esc>")
call term_sendkeys(buf, "jI123456789_\<Esc>")
call term_sendkeys(buf, "GA\<C-N>")
call VerifyScreenDump(buf, 'Test_popup_position_04', {'rows': 10})
call term_sendkeys(buf, "\<Esc>u") call term_sendkeys(buf, "\<Esc>u")
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
call delete('Xtest') call delete('Xtest')

View File

@@ -778,6 +778,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1540,
/**/ /**/
1539, 1539,
/**/ /**/