# HG changeset patch # User Bram Moolenaar # Date 1648727104 -7200 # Node ID 0f1a0bef2c02dbc13f1e4bf9670d1f5fac337bd4 # Parent 26ce95b122e19455e636be2e273b235da597b6b2 patch 8.2.4655: cmdline completion popup menu positioned wrong Commit: https://github.com/vim/vim/commit/1104a6d0c2004d39e9b6cb8f804d12b628a69869 Author: Yegappan Lakshmanan Date: Thu Mar 31 12:34:15 2022 +0100 patch 8.2.4655: cmdline completion popup menu positioned wrong Problem: Command line completion popup menu positioned wrong when using a terminal window. Solution: Position the popup menu differently when editing the command line. (Yegappan Lakshmanan, closes #10050, closes #10035) diff --git a/src/popupmenu.c b/src/popupmenu.c --- a/src/popupmenu.c +++ b/src/popupmenu.c @@ -100,6 +100,9 @@ pum_display( #if defined(FEAT_QUICKFIX) win_T *pvwin; #endif +#ifdef FEAT_RIGHTLEFT + int right_left = State == CMDLINE ? FALSE : curwin->w_p_rl; +#endif do { @@ -156,11 +159,17 @@ pum_display( { // pum above "pum_win_row" - // Leave two lines of context if possible - if (curwin->w_wrow - curwin->w_cline_row >= 2) - context_lines = 2; + if (State == CMDLINE) + // for cmdline pum, no need for context lines + context_lines = 0; else - context_lines = curwin->w_wrow - curwin->w_cline_row; + { + // Leave two lines of context if possible + if (curwin->w_wrow - curwin->w_cline_row >= 2) + context_lines = 2; + else + context_lines = curwin->w_wrow - curwin->w_cline_row; + } if (pum_win_row >= size + context_lines) { @@ -182,14 +191,20 @@ pum_display( { // pum below "pum_win_row" - // Leave two lines of context if possible - validate_cheight(); - if (curwin->w_cline_row + if (State == CMDLINE) + // for cmdline pum, no need for context lines + context_lines = 0; + else + { + // Leave two lines of context if possible + validate_cheight(); + if (curwin->w_cline_row + curwin->w_cline_height - curwin->w_wrow >= 3) - context_lines = 3; - else - context_lines = curwin->w_cline_row - + curwin->w_cline_height - curwin->w_wrow; + context_lines = 3; + else + context_lines = curwin->w_cline_row + + curwin->w_cline_height - curwin->w_wrow; + } pum_row = pum_win_row + context_lines; if (size > below_row - pum_row) @@ -226,7 +241,7 @@ pum_display( else #endif #ifdef FEAT_RIGHTLEFT - if (curwin->w_p_rl) + if (right_left) cursor_col = curwin->w_wincol + curwin->w_width - curwin->w_wcol - 1; else @@ -245,12 +260,10 @@ pum_display( if (def_width < max_width) def_width = max_width; - if (((cursor_col < Columns - p_pw - || cursor_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 - && (cursor_col > p_pw || cursor_col > max_width) + && !right_left) + || (right_left && (cursor_col > p_pw || cursor_col > max_width) #endif )) { @@ -259,7 +272,7 @@ pum_display( // start with the maximum space available #ifdef FEAT_RIGHTLEFT - if (curwin->w_p_rl) + if (right_left) pum_width = pum_col - pum_scrollbar + 1; else #endif @@ -276,22 +289,22 @@ pum_display( } else if (((cursor_col > p_pw || cursor_col > max_width) #ifdef FEAT_RIGHTLEFT - && !curwin->w_p_rl) - || (curwin->w_p_rl && (cursor_col < Columns - p_pw + && !right_left) + || (right_left && (cursor_col < Columns - p_pw || cursor_col < Columns - max_width) #endif )) { // align pum edge with "cursor_col" #ifdef FEAT_RIGHTLEFT - if (curwin->w_p_rl + if (right_left && W_ENDCOL(curwin) < 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) + else if (!right_left) #endif { if (curwin->w_wincol > Columns - max_width - pum_scrollbar @@ -305,7 +318,7 @@ pum_display( } #ifdef FEAT_RIGHTLEFT - if (curwin->w_p_rl) + if (right_left) pum_width = pum_col - pum_scrollbar + 1; else #endif @@ -315,7 +328,7 @@ pum_display( { pum_width = p_pw; #ifdef FEAT_RIGHTLEFT - if (curwin->w_p_rl) + if (right_left) { if (pum_width > pum_col) pum_width = pum_col; @@ -343,7 +356,7 @@ pum_display( { // not enough room, will use what we have #ifdef FEAT_RIGHTLEFT - if (curwin->w_p_rl) + if (right_left) pum_col = Columns - 1; else #endif @@ -355,7 +368,7 @@ pum_display( if (max_width > p_pw) max_width = p_pw; // truncate #ifdef FEAT_RIGHTLEFT - if (curwin->w_p_rl) + if (right_left) pum_col = max_width - 1; else #endif diff --git a/src/testdir/dumps/Test_wildmenu_pum_term_01.dump b/src/testdir/dumps/Test_wildmenu_pum_term_01.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_wildmenu_pum_term_01.dump @@ -0,0 +1,10 @@ +| +0&#ffffff0@74 +@75 +@75 +@5| +0#0000001#e0e0e08|d|e|f|i|n|e| @8| +0#0000000#ffffff0@53 +|<+2#ffffff16#00e0003|o|r|t| | +0#0000001#ffd7ff255|j|u|m|p| @10|w+2#ffffff16#00e0003|r|i|t|e|(|s|y|s|.|s|t|d|i|n|.|r|e|a|d|(|)@1|"| |[|r|u|n@1|i|n|g|]| @1|0|,|0|-|1| @9|A|l@1 +| +0#0000000#ffffff0@4| +0#0000001#ffd7ff255|l|i|s|t| @10| +0#0000000#ffffff0@53 +|~+0#4040ff13&| @3| +0#0000001#ffd7ff255|p|l|a|c|e| @9| +0#4040ff13#ffffff0@53 +|~| @3| +0#0000001#ffd7ff255|u|n|d|e|f|i|n|e| @6| +0#4040ff13#ffffff0@53 +|[+1#0000000&|N|o| |N| +0#0000001#ffd7ff255|u|n|p|l|a|c|e| @7| +1#0000000#ffffff0@35|0|,|0|-|1| @9|A|l@1 +|:+0&&|s|i|g|n| |d|e|f|i|n|e> @62 diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -2510,6 +2510,30 @@ func Test_wildmenumode_with_pum() cunmap endfunc +" Test for opening the cmdline completion popup menu from the terminal window. +" The popup menu should be positioned correctly over the status line of the +" bottom-most window. +func Test_wildmenu_pum_from_terminal() + CheckRunVimInTerminal + let python = PythonProg() + call CheckPython(python) + + %bw! + let cmds = ['set wildmenu wildoptions=pum'] + let pcmd = python .. ' -c "import sys; sys.stdout.write(sys.stdin.read())"' + call add(cmds, "call term_start('" .. pcmd .. "')") + call writefile(cmds, 'Xtest') + let buf = RunVimInTerminal('-S Xtest', #{rows: 10}) + call term_sendkeys(buf, "\r\r\r") + call term_wait(buf) + call term_sendkeys(buf, "\:sign \") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_wildmenu_pum_term_01', {}) + call term_wait(buf) + call StopVimInTerminal(buf) + call delete('Xtest') +endfunc + " Test for completion after a :substitute command followed by a pipe (|) " character func Test_cmdline_complete_substitute() diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim --- a/src/testdir/test_terminal.vim +++ b/src/testdir/test_terminal.vim @@ -935,7 +935,7 @@ func TerminalTmap(remap) tunmap 123 tunmap 456 call assert_equal('', maparg('123', 't')) - close + exe buf . 'bwipe' unlet g:job endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4655, +/**/ 4654, /**/ 4653,