summaryrefslogtreecommitdiff
path: root/src/edit.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-03-01 12:29:10 +0100
committerBram Moolenaar <Bram@vim.org>2017-03-01 12:29:10 +0100
commitcb03642399ae4f3c47a006f608a6b912f9d98b5f (patch)
tree518b169429d0ba22416156d9e0876189c0893911 /src/edit.c
parent5342f00ff95ed0256b8183063a83d72112f1243c (diff)
downloadvim-git-cb03642399ae4f3c47a006f608a6b912f9d98b5f.tar.gz
patch 8.0.0390: when the window scrolls the popup menu may be garbledv8.0.0390
Problem: When the window scrolls horizontally when the popup menu is displayed part of it may not be cleared. (Neovim issue #6184) Solution: Remove the menu when the windows scrolled. (closes #1524)
Diffstat (limited to 'src/edit.c')
-rw-r--r--src/edit.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/src/edit.c b/src/edit.c
index 6fc1e35ac..25896f3d3 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -186,7 +186,7 @@ static int ins_compl_pum_key(int c);
static int ins_compl_key2count(int c);
static int ins_compl_use_match(int c);
static int ins_complete(int c, int enable_pum);
-static void show_pum(int save_w_wrow);
+static void show_pum(int prev_w_wrow, int prev_w_leftcol);
static unsigned quote_meta(char_u *dest, char_u *str, int len);
#endif /* FEAT_INS_EXPAND */
@@ -2818,6 +2818,7 @@ completeopt_was_set(void)
set_completion(colnr_T startcol, list_T *list)
{
int save_w_wrow = curwin->w_wrow;
+ int save_w_leftcol = curwin->w_leftcol;
/* If already doing completions stop it. */
if (ctrl_x_mode != 0)
@@ -2858,7 +2859,7 @@ set_completion(colnr_T startcol, list_T *list)
/* Lazily show the popup menu, unless we got interrupted. */
if (!compl_interrupted)
- show_pum(save_w_wrow);
+ show_pum(save_w_wrow, save_w_leftcol);
out_flush();
}
@@ -5096,6 +5097,7 @@ ins_complete(int c, int enable_pum)
colnr_T curs_col; /* cursor column */
int n;
int save_w_wrow;
+ int save_w_leftcol;
int insert_match;
int save_did_ai = did_ai;
@@ -5539,6 +5541,7 @@ ins_complete(int c, int enable_pum)
* Find next match (and following matches).
*/
save_w_wrow = curwin->w_wrow;
+ save_w_leftcol = curwin->w_leftcol;
n = ins_compl_next(TRUE, ins_compl_key2count(c), insert_match, FALSE);
/* may undisplay the popup menu */
@@ -5691,9 +5694,8 @@ ins_complete(int c, int enable_pum)
/* Show the popup menu, unless we got interrupted. */
if (enable_pum && !compl_interrupted)
- {
- show_pum(save_w_wrow);
- }
+ show_pum(save_w_wrow, save_w_leftcol);
+
compl_was_interrupted = compl_interrupted;
compl_interrupted = FALSE;
@@ -5701,21 +5703,22 @@ ins_complete(int c, int enable_pum)
}
static void
-show_pum(int save_w_wrow)
+show_pum(int prev_w_wrow, int prev_w_leftcol)
{
- /* RedrawingDisabled may be set when invoked through complete(). */
- int n = RedrawingDisabled;
+ /* RedrawingDisabled may be set when invoked through complete(). */
+ int n = RedrawingDisabled;
- RedrawingDisabled = 0;
+ RedrawingDisabled = 0;
- /* If the cursor moved we need to remove the pum first. */
- setcursor();
- if (save_w_wrow != curwin->w_wrow)
- ins_compl_del_pum();
+ /* If the cursor moved or the display scrolled we need to remove the pum
+ * first. */
+ setcursor();
+ if (prev_w_wrow != curwin->w_wrow || prev_w_leftcol != curwin->w_leftcol)
+ ins_compl_del_pum();
- ins_compl_show_pum();
- setcursor();
- RedrawingDisabled = n;
+ ins_compl_show_pum();
+ setcursor();
+ RedrawingDisabled = n;
}
/*