mirror of
https://github.com/vim/vim.git
synced 2025-09-30 04:44:14 -04:00
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)
This commit is contained in:
committed by
Bram Moolenaar
parent
49d008d96b
commit
1104a6d0c2
@@ -100,6 +100,9 @@ pum_display(
|
|||||||
#if defined(FEAT_QUICKFIX)
|
#if defined(FEAT_QUICKFIX)
|
||||||
win_T *pvwin;
|
win_T *pvwin;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef FEAT_RIGHTLEFT
|
||||||
|
int right_left = State == CMDLINE ? FALSE : curwin->w_p_rl;
|
||||||
|
#endif
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -156,11 +159,17 @@ pum_display(
|
|||||||
{
|
{
|
||||||
// pum above "pum_win_row"
|
// pum above "pum_win_row"
|
||||||
|
|
||||||
|
if (State == CMDLINE)
|
||||||
|
// for cmdline pum, no need for context lines
|
||||||
|
context_lines = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
// Leave two lines of context if possible
|
// Leave two lines of context if possible
|
||||||
if (curwin->w_wrow - curwin->w_cline_row >= 2)
|
if (curwin->w_wrow - curwin->w_cline_row >= 2)
|
||||||
context_lines = 2;
|
context_lines = 2;
|
||||||
else
|
else
|
||||||
context_lines = curwin->w_wrow - curwin->w_cline_row;
|
context_lines = curwin->w_wrow - curwin->w_cline_row;
|
||||||
|
}
|
||||||
|
|
||||||
if (pum_win_row >= size + context_lines)
|
if (pum_win_row >= size + context_lines)
|
||||||
{
|
{
|
||||||
@@ -182,6 +191,11 @@ pum_display(
|
|||||||
{
|
{
|
||||||
// pum below "pum_win_row"
|
// pum below "pum_win_row"
|
||||||
|
|
||||||
|
if (State == CMDLINE)
|
||||||
|
// for cmdline pum, no need for context lines
|
||||||
|
context_lines = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
// Leave two lines of context if possible
|
// Leave two lines of context if possible
|
||||||
validate_cheight();
|
validate_cheight();
|
||||||
if (curwin->w_cline_row
|
if (curwin->w_cline_row
|
||||||
@@ -190,6 +204,7 @@ pum_display(
|
|||||||
else
|
else
|
||||||
context_lines = curwin->w_cline_row
|
context_lines = curwin->w_cline_row
|
||||||
+ curwin->w_cline_height - curwin->w_wrow;
|
+ curwin->w_cline_height - curwin->w_wrow;
|
||||||
|
}
|
||||||
|
|
||||||
pum_row = pum_win_row + context_lines;
|
pum_row = pum_win_row + context_lines;
|
||||||
if (size > below_row - pum_row)
|
if (size > below_row - pum_row)
|
||||||
@@ -226,7 +241,7 @@ pum_display(
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
if (curwin->w_p_rl)
|
if (right_left)
|
||||||
cursor_col = curwin->w_wincol + curwin->w_width
|
cursor_col = curwin->w_wincol + curwin->w_width
|
||||||
- curwin->w_wcol - 1;
|
- curwin->w_wcol - 1;
|
||||||
else
|
else
|
||||||
@@ -245,12 +260,10 @@ pum_display(
|
|||||||
if (def_width < max_width)
|
if (def_width < max_width)
|
||||||
def_width = max_width;
|
def_width = max_width;
|
||||||
|
|
||||||
if (((cursor_col < Columns - p_pw
|
if (((cursor_col < Columns - p_pw || cursor_col < Columns - max_width)
|
||||||
|| cursor_col < Columns - max_width)
|
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
&& !curwin->w_p_rl)
|
&& !right_left)
|
||||||
|| (curwin->w_p_rl
|
|| (right_left && (cursor_col > p_pw || cursor_col > max_width)
|
||||||
&& (cursor_col > p_pw || cursor_col > max_width)
|
|
||||||
#endif
|
#endif
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
@@ -259,7 +272,7 @@ pum_display(
|
|||||||
|
|
||||||
// start with the maximum space available
|
// start with the maximum space available
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
if (curwin->w_p_rl)
|
if (right_left)
|
||||||
pum_width = pum_col - pum_scrollbar + 1;
|
pum_width = pum_col - pum_scrollbar + 1;
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@@ -276,22 +289,22 @@ pum_display(
|
|||||||
}
|
}
|
||||||
else if (((cursor_col > p_pw || cursor_col > max_width)
|
else if (((cursor_col > p_pw || cursor_col > max_width)
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
&& !curwin->w_p_rl)
|
&& !right_left)
|
||||||
|| (curwin->w_p_rl && (cursor_col < Columns - p_pw
|
|| (right_left && (cursor_col < Columns - p_pw
|
||||||
|| cursor_col < Columns - max_width)
|
|| cursor_col < Columns - max_width)
|
||||||
#endif
|
#endif
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
// align pum edge with "cursor_col"
|
// align pum edge with "cursor_col"
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
if (curwin->w_p_rl
|
if (right_left
|
||||||
&& W_ENDCOL(curwin) < max_width + pum_scrollbar + 1)
|
&& W_ENDCOL(curwin) < max_width + pum_scrollbar + 1)
|
||||||
{
|
{
|
||||||
pum_col = cursor_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 (!right_left)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (curwin->w_wincol > Columns - max_width - pum_scrollbar
|
if (curwin->w_wincol > Columns - max_width - pum_scrollbar
|
||||||
@@ -305,7 +318,7 @@ pum_display(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
if (curwin->w_p_rl)
|
if (right_left)
|
||||||
pum_width = pum_col - pum_scrollbar + 1;
|
pum_width = pum_col - pum_scrollbar + 1;
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@@ -315,7 +328,7 @@ pum_display(
|
|||||||
{
|
{
|
||||||
pum_width = p_pw;
|
pum_width = p_pw;
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
if (curwin->w_p_rl)
|
if (right_left)
|
||||||
{
|
{
|
||||||
if (pum_width > pum_col)
|
if (pum_width > pum_col)
|
||||||
pum_width = pum_col;
|
pum_width = pum_col;
|
||||||
@@ -343,7 +356,7 @@ pum_display(
|
|||||||
{
|
{
|
||||||
// not enough room, will use what we have
|
// not enough room, will use what we have
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
if (curwin->w_p_rl)
|
if (right_left)
|
||||||
pum_col = Columns - 1;
|
pum_col = Columns - 1;
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@@ -355,7 +368,7 @@ pum_display(
|
|||||||
if (max_width > p_pw)
|
if (max_width > p_pw)
|
||||||
max_width = p_pw; // truncate
|
max_width = p_pw; // truncate
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
if (curwin->w_p_rl)
|
if (right_left)
|
||||||
pum_col = max_width - 1;
|
pum_col = max_width - 1;
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
10
src/testdir/dumps/Test_wildmenu_pum_term_01.dump
Normal file
10
src/testdir/dumps/Test_wildmenu_pum_term_01.dump
Normal file
@@ -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
|
@@ -2510,6 +2510,30 @@ func Test_wildmenumode_with_pum()
|
|||||||
cunmap <F2>
|
cunmap <F2>
|
||||||
endfunc
|
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, "\<C-W>:sign \<Tab>")
|
||||||
|
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 (|)
|
" Test for completion after a :substitute command followed by a pipe (|)
|
||||||
" character
|
" character
|
||||||
func Test_cmdline_complete_substitute()
|
func Test_cmdline_complete_substitute()
|
||||||
|
@@ -935,7 +935,7 @@ func TerminalTmap(remap)
|
|||||||
tunmap 123
|
tunmap 123
|
||||||
tunmap 456
|
tunmap 456
|
||||||
call assert_equal('', maparg('123', 't'))
|
call assert_equal('', maparg('123', 't'))
|
||||||
close
|
exe buf . 'bwipe'
|
||||||
unlet g:job
|
unlet g:job
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
@@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
4655,
|
||||||
/**/
|
/**/
|
||||||
4654,
|
4654,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user