aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/popupmenu.c6
-rw-r--r--test/functional/ui/popupmenu_spec.lua243
2 files changed, 218 insertions, 31 deletions
diff --git a/src/nvim/popupmenu.c b/src/nvim/popupmenu.c
index b1c6e02449..d26651fb84 100644
--- a/src/nvim/popupmenu.c
+++ b/src/nvim/popupmenu.c
@@ -686,13 +686,13 @@ void pum_redraw(void)
char *rt_start = rt;
int cells = vim_strsize(rt);
- if (cells > pum_width) {
+ if (grid_col - cells < col_off - pum_width) {
do {
cells -= utf_ptr2cells(rt);
MB_PTR_ADV(rt);
- } while (cells > pum_width);
+ } while (grid_col - cells < col_off - pum_width);
- if (cells < pum_width) {
+ if (grid_col - cells > col_off - pum_width) {
// Most left character requires 2-cells but only 1 cell is available on
// screen. Put a '<' on the left of the pum item.
*(--rt) = '<';
diff --git a/test/functional/ui/popupmenu_spec.lua b/test/functional/ui/popupmenu_spec.lua
index 9403f39ba1..0b7cff168b 100644
--- a/test/functional/ui/popupmenu_spec.lua
+++ b/test/functional/ui/popupmenu_spec.lua
@@ -5498,31 +5498,115 @@ describe('builtin popupmenu', function()
screen:try_resize(32, 8)
command('set completeopt+=menuone,noselect')
feed('i' .. string.rep(' ', 13))
- fn.complete(14, { '哦哦哦哦哦哦哦哦哦哦' })
+
+ fn.complete(14, { '一二三四五六七八九十' })
if multigrid then
screen:expect({
grid = [[
- ## grid 1
- [2:--------------------------------]|*7
- [3:--------------------------------]|
- ## grid 2
- ^ |
- {1:~ }|*6
- ## grid 3
- {2:-- INSERT --} |
- ## grid 4
- {n: 哦哦哦哦哦哦哦哦哦>}|
+ ## grid 1
+ [2:--------------------------------]|*7
+ [3:--------------------------------]|
+ ## grid 2
+ ^ |
+ {1:~ }|*6
+ ## grid 3
+ {2:-- INSERT --} |
+ ## grid 4
+ {n: 一二三四五六七八九>}|
]],
float_pos = { [4] = { -1, 'NW', 2, 1, 12, false, 100 } },
})
else
screen:expect([[
^ |
- {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}|
+ {1:~ }{n: 一二三四五六七八九>}|
{1:~ }|*5
{2:-- INSERT --} |
]])
end
+ feed('<C-E>')
+
+ fn.complete(14, { { word = '一二三', kind = '四五六', menu = '七八九十' } })
+ if multigrid then
+ screen:expect({
+ grid = [[
+ ## grid 1
+ [2:--------------------------------]|*7
+ [3:--------------------------------]|
+ ## grid 2
+ ^ |
+ {1:~ }|*6
+ ## grid 3
+ {2:-- INSERT --} |
+ ## grid 4
+ {n: 一二三 四五六 七八>}|
+ ]],
+ float_pos = { [4] = { -1, 'NW', 2, 1, 12, false, 100 } },
+ })
+ else
+ screen:expect([[
+ ^ |
+ {1:~ }{n: 一二三 四五六 七八>}|
+ {1:~ }|*5
+ {2:-- INSERT --} |
+ ]])
+ end
+ feed('<C-E>')
+
+ command('set rightleft')
+ fn.complete(14, { '一二三四五六七八九十' })
+ if multigrid then
+ screen:expect({
+ grid = [[
+ ## grid 1
+ [2:--------------------------------]|*7
+ [3:--------------------------------]|
+ ## grid 2
+ ^ |
+ {1: ~}|*6
+ ## grid 3
+ {2:-- INSERT --} |
+ ## grid 4
+ {n:<九八七六五四三二一 }|
+ ]],
+ float_pos = { [4] = { -1, 'NW', 2, 1, 0, false, 100 } },
+ })
+ else
+ screen:expect([[
+ ^ |
+ {n:<九八七六五四三二一 }{1: ~}|
+ {1: ~}|*5
+ {2:-- INSERT --} |
+ ]])
+ end
+ feed('<C-E>')
+
+ fn.complete(14, { { word = '一二三', kind = '四五六', menu = '七八九十' } })
+ if multigrid then
+ screen:expect({
+ grid = [[
+ ## grid 1
+ [2:--------------------------------]|*7
+ [3:--------------------------------]|
+ ## grid 2
+ ^ |
+ {1: ~}|*6
+ ## grid 3
+ {2:-- INSERT --} |
+ ## grid 4
+ {n:<八七 六五四 三二一 }|
+ ]],
+ float_pos = { [4] = { -1, 'NW', 2, 1, 0, false, 100 } },
+ })
+ else
+ screen:expect([[
+ ^ |
+ {n:<八七 六五四 三二一 }{1: ~}|
+ {1: ~}|*5
+ {2:-- INSERT --} |
+ ]])
+ end
+ feed('<C-E>')
end)
it('truncates double-width character correctly with scrollbar', function()
@@ -5530,37 +5614,140 @@ describe('builtin popupmenu', function()
command('set completeopt+=noselect')
command('set pumheight=4')
feed('i' .. string.rep(' ', 12))
- local items = {}
+ local items1 = {}
+ local items2 = {}
for _ = 1, 8 do
- table.insert(items, { word = '哦哦哦哦哦哦哦哦哦哦', equal = 1, dup = 1 })
+ table.insert(items1, { word = '一二三四五六七八九十', equal = 1, dup = 1 })
+ end
+ for _ = 1, 2 do
+ table.insert(
+ items2,
+ { word = 'abcdef', kind = 'ghijkl', menu = 'mnopqrst', equal = 1, dup = 1 }
+ )
end
- fn.complete(13, items)
+ for _ = 3, 8 do
+ table.insert(
+ items2,
+ { word = '一二三', kind = '四五六', menu = '七八九十', equal = 1, dup = 1 }
+ )
+ end
+
+ fn.complete(13, items1)
if multigrid then
screen:expect({
grid = [[
- ## grid 1
- [2:--------------------------------]|*7
- [3:--------------------------------]|
- ## grid 2
- ^ |
- {1:~ }|*6
- ## grid 3
- {2:-- INSERT --} |
- ## grid 4
- {n: 哦哦哦哦哦哦哦哦哦>}{c: }|*2
- {n: 哦哦哦哦哦哦哦哦哦>}{s: }|*2
+ ## grid 1
+ [2:--------------------------------]|*7
+ [3:--------------------------------]|
+ ## grid 2
+ ^ |
+ {1:~ }|*6
+ ## grid 3
+ {2:-- INSERT --} |
+ ## grid 4
+ {n: 一二三四五六七八九>}{c: }|*2
+ {n: 一二三四五六七八九>}{s: }|*2
+ ]],
+ float_pos = { [4] = { -1, 'NW', 2, 1, 11, false, 100 } },
+ })
+ else
+ screen:expect([[
+ ^ |
+ {1:~ }{n: 一二三四五六七八九>}{c: }|*2
+ {1:~ }{n: 一二三四五六七八九>}{s: }|*2
+ {1:~ }|*2
+ {2:-- INSERT --} |
+ ]])
+ end
+ feed('<C-E>')
+
+ fn.complete(13, items2)
+ if multigrid then
+ screen:expect({
+ grid = [[
+ ## grid 1
+ [2:--------------------------------]|*7
+ [3:--------------------------------]|
+ ## grid 2
+ ^ |
+ {1:~ }|*6
+ ## grid 3
+ {2:-- INSERT --} |
+ ## grid 4
+ {n: abcdef ghijkl mnopq}{c: }|*2
+ {n: 一二三 四五六 七八>}{s: }|*2
]],
float_pos = { [4] = { -1, 'NW', 2, 1, 11, false, 100 } },
})
else
screen:expect([[
^ |
- {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}{c: }|*2
- {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}{s: }|*2
+ {1:~ }{n: abcdef ghijkl mnopq}{c: }|*2
+ {1:~ }{n: 一二三 四五六 七八>}{s: }|*2
{1:~ }|*2
{2:-- INSERT --} |
]])
end
+ feed('<C-E>')
+
+ command('set rightleft')
+ fn.complete(13, items1)
+ if multigrid then
+ screen:expect({
+ grid = [[
+ ## grid 1
+ [2:--------------------------------]|*7
+ [3:--------------------------------]|
+ ## grid 2
+ ^ |
+ {1: ~}|*6
+ ## grid 3
+ {2:-- INSERT --} |
+ ## grid 4
+ {c: }{n:<九八七六五四三二一 }|*2
+ {s: }{n:<九八七六五四三二一 }|*2
+ ]],
+ float_pos = { [4] = { -1, 'NW', 2, 1, 0, false, 100 } },
+ })
+ else
+ screen:expect([[
+ ^ |
+ {c: }{n:<九八七六五四三二一 }{1: ~}|*2
+ {s: }{n:<九八七六五四三二一 }{1: ~}|*2
+ {1: ~}|*2
+ {2:-- INSERT --} |
+ ]])
+ end
+ feed('<C-E>')
+
+ fn.complete(13, items2)
+ if multigrid then
+ screen:expect({
+ grid = [[
+ ## grid 1
+ [2:--------------------------------]|*7
+ [3:--------------------------------]|
+ ## grid 2
+ ^ |
+ {1: ~}|*6
+ ## grid 3
+ {2:-- INSERT --} |
+ ## grid 4
+ {c: }{n:qponm lkjihg fedcba }|*2
+ {s: }{n:<八七 六五四 三二一 }|*2
+ ]],
+ float_pos = { [4] = { -1, 'NW', 2, 1, 0, false, 100 } },
+ })
+ else
+ screen:expect([[
+ ^ |
+ {c: }{n:qponm lkjihg fedcba }{1: ~}|*2
+ {s: }{n:<八七 六五四 三二一 }{1: ~}|*2
+ {1: ~}|*2
+ {2:-- INSERT --} |
+ ]])
+ end
+ feed('<C-E>')
end)
it('supports mousemodel=popup', function()