aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/popupmnu.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c
index ac0c1f6eb1..f242b7d71a 100644
--- a/src/nvim/popupmnu.c
+++ b/src/nvim/popupmnu.c
@@ -376,6 +376,8 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
// the positioning. Limit this to two times, when there is not much
// room the window size will keep changing.
} while (pum_set_selected(selected, redo_count) && (++redo_count <= 2));
+
+ pum_redraw();
}
/// Redraw the popup menu, using "pum_first" and "pum_selected".
@@ -534,7 +536,17 @@ void pum_redraw(void)
xfree(st);
col -= width;
} else {
- grid_puts_len(&pum_grid, st, (int)STRLEN(st), row, col, attr);
+ int size = (int)STRLEN(st);
+ int cells = (int)mb_string2cells(st);
+
+ // only draw the text that fits
+ while (size > 0 && col + cells > pum_width + pum_col) {
+ size--;
+ size -= utf_head_off(st, st + size);
+ cells -= utf_ptr2cells(st + size);
+ }
+
+ grid_puts_len(&pum_grid, st, size, row, col, attr);
xfree(st);
col += width;
}
@@ -824,10 +836,6 @@ static int pum_set_selected(int n, int repeat)
}
}
- if (!resized) {
- pum_redraw();
- }
-
return resized;
}