diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-02-24 21:25:44 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-02-24 21:25:44 +0100 |
commit | 2b10bcbfc1c025bf7e6358326ee70105e7d30e96 (patch) | |
tree | bb749db849a551b73f39c1111351118c06edc372 /src | |
parent | 6bb2cdfe604e51eec216cbe23bb6e8fb47810347 (diff) | |
download | vim-2b10bcbfc1c025bf7e6358326ee70105e7d30e96.zip |
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)
Diffstat (limited to 'src')
-rw-r--r-- | src/popupmnu.c | 36 | ||||
-rw-r--r-- | src/testdir/dumps/Test_popup_position_04.dump | 10 | ||||
-rw-r--r-- | src/testdir/screendump.vim | 2 | ||||
-rw-r--r-- | src/testdir/test_popup.vim | 9 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 43 insertions, 16 deletions
diff --git a/src/popupmnu.c b/src/popupmnu.c index 6ac121d91..d9def3664 100644 --- a/src/popupmnu.c +++ b/src/popupmnu.c @@ -69,7 +69,7 @@ pum_compute_size(void) /* * Show the popup menu with items "array[size]". * "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. */ void @@ -83,7 +83,7 @@ pum_display( int max_width; int row; int context_lines; - int col; + int cursor_col; int above_row; int below_row; int redo_count = 0; @@ -199,10 +199,11 @@ pum_display( /* Calculate column */ #ifdef FEAT_RIGHTLEFT 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 #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 (pum_height < size) @@ -216,15 +217,17 @@ pum_display( if (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 && !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 )) { - /* align pum column with "col" */ - pum_col = col; + /* align pum with "cursor_col" */ + pum_col = cursor_col; /* start with the maximum space available */ #ifdef FEAT_RIGHTLEFT @@ -237,33 +240,36 @@ pum_display( if (pum_width > max_width + pum_kind_width + pum_extra_width + 1 && 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; if (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 && !curwin->w_p_rl) - || (curwin->w_p_rl && (col < Columns - p_pw - || col < Columns - max_width) + || (curwin->w_p_rl && (cursor_col < Columns - p_pw + || cursor_col < Columns - max_width) #endif )) { - /* align right pum edge with "col" */ + /* align pum edge with "cursor_col" */ #ifdef FEAT_RIGHTLEFT if (curwin->w_p_rl && 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) pum_col = Columns - 1; } else if (!curwin->w_p_rl) #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; if (pum_col < 0) pum_col = 0; diff --git a/src/testdir/dumps/Test_popup_position_04.dump b/src/testdir/dumps/Test_popup_position_04.dump new file mode 100644 index 000000000..b1a3af201 --- /dev/null +++ b/src/testdir/dumps/Test_popup_position_04.dump @@ -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 diff --git a/src/testdir/screendump.vim b/src/testdir/screendump.vim index 584f9ac71..1016646c5 100644 --- a/src/testdir/screendump.vim +++ b/src/testdir/screendump.vim @@ -48,7 +48,7 @@ endfunc " Stop a Vim running in terminal buffer "buf". func StopVimInTerminal(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"') only! endfunc diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim index b0024e67b..499b08bd6 100644 --- a/src/testdir/test_popup.vim +++ b/src/testdir/test_popup.vim @@ -772,6 +772,15 @@ func Test_popup_position() call term_sendkeys(buf, "GA\<C-N>") 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 StopVimInTerminal(buf) call delete('Xtest') diff --git a/src/version.c b/src/version.c index c75d29033..48c21fc44 100644 --- a/src/version.c +++ b/src/version.c @@ -779,6 +779,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1540, +/**/ 1539, /**/ 1538, |