mirror of
https://github.com/neovim/neovim.git
synced 2025-09-14 15:28:17 +00:00
vim-patch:8.1.0057: popup menu displayed wrong when using autocmd
Problem: Popup menu displayed wrong when using autocmd.
Solution: Use aucmd_prepbuf(). Force updating status line if the popup menu
is going to be redrawn anyway. (Christian Brabandt, closes vim/vim#3009)
6ba3ec1bac
This commit is contained in:
@@ -1390,7 +1390,12 @@ ins_redraw (
|
|||||||
if (ready && has_event(EVENT_TEXTCHANGEDI)
|
if (ready && has_event(EVENT_TEXTCHANGEDI)
|
||||||
&& curbuf->b_last_changedtick != buf_get_changedtick(curbuf)
|
&& curbuf->b_last_changedtick != buf_get_changedtick(curbuf)
|
||||||
&& !pum_visible()) {
|
&& !pum_visible()) {
|
||||||
|
aco_save_T aco;
|
||||||
|
|
||||||
|
// save and restore curwin and curbuf, in case the autocmd changes them
|
||||||
|
aucmd_prepbuf(&aco, curbuf);
|
||||||
apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, false, curbuf);
|
apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, false, curbuf);
|
||||||
|
aucmd_restbuf(&aco);
|
||||||
curbuf->b_last_changedtick = buf_get_changedtick(curbuf);
|
curbuf->b_last_changedtick = buf_get_changedtick(curbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1400,8 +1405,13 @@ ins_redraw (
|
|||||||
if (ready && has_event(EVENT_TEXTCHANGEDP)
|
if (ready && has_event(EVENT_TEXTCHANGEDP)
|
||||||
&& curbuf->b_last_changedtick_pum != buf_get_changedtick(curbuf)
|
&& curbuf->b_last_changedtick_pum != buf_get_changedtick(curbuf)
|
||||||
&& pum_visible()) {
|
&& pum_visible()) {
|
||||||
apply_autocmds(EVENT_TEXTCHANGEDP, NULL, NULL, false, curbuf);
|
aco_save_T aco;
|
||||||
curbuf->b_last_changedtick_pum = buf_get_changedtick(curbuf);
|
|
||||||
|
// save and restore curwin and curbuf, in case the autocmd changes them
|
||||||
|
aucmd_prepbuf(&aco, curbuf);
|
||||||
|
apply_autocmds(EVENT_TEXTCHANGEDP, NULL, NULL, false, curbuf);
|
||||||
|
aucmd_restbuf(&aco);
|
||||||
|
curbuf->b_last_changedtick_pum = buf_get_changedtick(curbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (must_redraw)
|
if (must_redraw)
|
||||||
|
@@ -423,7 +423,7 @@ void update_screen(int type)
|
|||||||
|
|
||||||
/* redraw status line after the window to minimize cursor movement */
|
/* redraw status line after the window to minimize cursor movement */
|
||||||
if (wp->w_redr_status) {
|
if (wp->w_redr_status) {
|
||||||
win_redr_status(wp);
|
win_redr_status(wp, true); // any popup menu will be redrawn below
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end_search_hl();
|
end_search_hl();
|
||||||
@@ -589,7 +589,7 @@ void update_debug_sign(const buf_T *const buf, const linenr_T lnum)
|
|||||||
win_update(wp);
|
win_update(wp);
|
||||||
}
|
}
|
||||||
if (wp->w_redr_status) {
|
if (wp->w_redr_status) {
|
||||||
win_redr_status(wp);
|
win_redr_status(wp, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4542,7 +4542,7 @@ void redraw_statuslines(void)
|
|||||||
{
|
{
|
||||||
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
|
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
|
||||||
if (wp->w_redr_status) {
|
if (wp->w_redr_status) {
|
||||||
win_redr_status(wp);
|
win_redr_status(wp, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (redraw_tabline)
|
if (redraw_tabline)
|
||||||
@@ -4809,7 +4809,9 @@ win_redr_status_matches (
|
|||||||
/// Redraw the status line of window `wp`.
|
/// Redraw the status line of window `wp`.
|
||||||
///
|
///
|
||||||
/// If inversion is possible we use it. Else '=' characters are used.
|
/// If inversion is possible we use it. Else '=' characters are used.
|
||||||
static void win_redr_status(win_T *wp)
|
/// If "ignore_pum" is true, also redraw statusline when the popup menu is
|
||||||
|
/// displayed.
|
||||||
|
static void win_redr_status(win_T *wp, int ignore_pum)
|
||||||
{
|
{
|
||||||
int row;
|
int row;
|
||||||
char_u *p;
|
char_u *p;
|
||||||
@@ -4832,7 +4834,7 @@ static void win_redr_status(win_T *wp)
|
|||||||
if (wp->w_status_height == 0) {
|
if (wp->w_status_height == 0) {
|
||||||
// no status line, can only be last window
|
// no status line, can only be last window
|
||||||
redraw_cmdline = true;
|
redraw_cmdline = true;
|
||||||
} else if (!redrawing() || pum_drawn()) {
|
} else if (!redrawing() || (!ignore_pum && pum_drawn())) {
|
||||||
// Don't redraw right now, do it later. Don't update status line when
|
// Don't redraw right now, do it later. Don't update status line when
|
||||||
// popup menu is visible and may be drawn over it
|
// popup menu is visible and may be drawn over it
|
||||||
wp->w_redr_status = true;
|
wp->w_redr_status = true;
|
||||||
|
Reference in New Issue
Block a user