mirror of
https://github.com/vim/vim.git
synced 2025-10-05 05:34:07 -04:00
patch 8.0.1769: repeated saving and restoring viewstate for 'incsearch'
Problem: Repeated saving and restoring viewstate for 'incsearch'. Solution: Use a structure.
This commit is contained in:
@@ -187,6 +187,45 @@ empty_pattern(char_u *p)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef FEAT_SEARCH_EXTRA
|
||||
typedef struct {
|
||||
colnr_T vs_curswant;
|
||||
colnr_T vs_leftcol;
|
||||
linenr_T vs_topline;
|
||||
# ifdef FEAT_DIFF
|
||||
int vs_topfill;
|
||||
# endif
|
||||
linenr_T vs_botline;
|
||||
linenr_T vs_empty_rows;
|
||||
} viewstate_T;
|
||||
|
||||
static void
|
||||
save_viewstate(viewstate_T *vs)
|
||||
{
|
||||
vs->vs_curswant = curwin->w_curswant;
|
||||
vs->vs_leftcol = curwin->w_leftcol;
|
||||
vs->vs_topline = curwin->w_topline;
|
||||
# ifdef FEAT_DIFF
|
||||
vs->vs_topfill = curwin->w_topfill;
|
||||
# endif
|
||||
vs->vs_botline = curwin->w_botline;
|
||||
vs->vs_empty_rows = curwin->w_empty_rows;
|
||||
}
|
||||
|
||||
static void
|
||||
restore_viewstate(viewstate_T *vs)
|
||||
{
|
||||
curwin->w_curswant = vs->vs_curswant;
|
||||
curwin->w_leftcol = vs->vs_leftcol;
|
||||
curwin->w_topline = vs->vs_topline;
|
||||
# ifdef FEAT_DIFF
|
||||
curwin->w_topfill = vs->vs_topfill;
|
||||
# endif
|
||||
curwin->w_botline = vs->vs_botline;
|
||||
curwin->w_empty_rows = vs->vs_empty_rows;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* getcmdline() - accept a command line starting with firstc.
|
||||
*
|
||||
@@ -225,21 +264,10 @@ getcmdline(
|
||||
#ifdef FEAT_SEARCH_EXTRA
|
||||
pos_T search_start; /* where 'incsearch' starts searching */
|
||||
pos_T save_cursor;
|
||||
colnr_T old_curswant;
|
||||
colnr_T init_curswant = curwin->w_curswant;
|
||||
colnr_T old_leftcol;
|
||||
colnr_T init_leftcol = curwin->w_leftcol;
|
||||
linenr_T old_topline;
|
||||
linenr_T init_topline = curwin->w_topline;
|
||||
viewstate_T init_viewstate;
|
||||
viewstate_T old_viewstate;
|
||||
pos_T match_start = curwin->w_cursor;
|
||||
pos_T match_end;
|
||||
# ifdef FEAT_DIFF
|
||||
int old_topfill;
|
||||
int init_topfill = curwin->w_topfill;
|
||||
# endif
|
||||
linenr_T old_botline, old_empty_rows;
|
||||
linenr_T init_botline = curwin->w_botline;
|
||||
linenr_T init_empty_rows = curwin->w_empty_rows;
|
||||
int did_incsearch = FALSE;
|
||||
int incsearch_postponed = FALSE;
|
||||
#endif
|
||||
@@ -285,14 +313,8 @@ getcmdline(
|
||||
CLEAR_POS(&match_end);
|
||||
save_cursor = curwin->w_cursor; /* may be restored later */
|
||||
search_start = curwin->w_cursor;
|
||||
old_curswant = curwin->w_curswant;
|
||||
old_leftcol = curwin->w_leftcol;
|
||||
old_topline = curwin->w_topline;
|
||||
# ifdef FEAT_DIFF
|
||||
old_topfill = curwin->w_topfill;
|
||||
# endif
|
||||
old_botline = curwin->w_botline;
|
||||
old_empty_rows = curwin->w_empty_rows;
|
||||
save_viewstate(&init_viewstate);
|
||||
save_viewstate(&old_viewstate);
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -1070,14 +1092,7 @@ getcmdline(
|
||||
search_start = save_cursor;
|
||||
/* save view settings, so that the screen
|
||||
* won't be restored at the wrong position */
|
||||
old_curswant = init_curswant;
|
||||
old_leftcol = init_leftcol;
|
||||
old_topline = init_topline;
|
||||
# ifdef FEAT_DIFF
|
||||
old_topfill = init_topfill;
|
||||
# endif
|
||||
old_botline = init_botline;
|
||||
old_empty_rows = init_empty_rows;
|
||||
old_viewstate = init_viewstate;
|
||||
}
|
||||
#endif
|
||||
redrawcmd();
|
||||
@@ -1800,14 +1815,7 @@ getcmdline(
|
||||
update_topline();
|
||||
validate_cursor();
|
||||
highlight_match = TRUE;
|
||||
old_curswant = curwin->w_curswant;
|
||||
old_leftcol = curwin->w_leftcol;
|
||||
old_topline = curwin->w_topline;
|
||||
# ifdef FEAT_DIFF
|
||||
old_topfill = curwin->w_topfill;
|
||||
# endif
|
||||
old_botline = curwin->w_botline;
|
||||
old_empty_rows = curwin->w_empty_rows;
|
||||
save_viewstate(&old_viewstate);
|
||||
update_screen(NOT_VALID);
|
||||
redrawcmdline();
|
||||
}
|
||||
@@ -2018,13 +2026,7 @@ cmdline_changed:
|
||||
|
||||
/* first restore the old curwin values, so the screen is
|
||||
* positioned in the same way as the actual search command */
|
||||
curwin->w_leftcol = old_leftcol;
|
||||
curwin->w_topline = old_topline;
|
||||
# ifdef FEAT_DIFF
|
||||
curwin->w_topfill = old_topfill;
|
||||
# endif
|
||||
curwin->w_botline = old_botline;
|
||||
curwin->w_empty_rows = old_empty_rows;
|
||||
restore_viewstate(&old_viewstate);
|
||||
changed_cline_bef_curs();
|
||||
update_topline();
|
||||
|
||||
@@ -2112,14 +2114,7 @@ returncmd:
|
||||
}
|
||||
curwin->w_cursor = search_start;
|
||||
}
|
||||
curwin->w_curswant = old_curswant;
|
||||
curwin->w_leftcol = old_leftcol;
|
||||
curwin->w_topline = old_topline;
|
||||
# ifdef FEAT_DIFF
|
||||
curwin->w_topfill = old_topfill;
|
||||
# endif
|
||||
curwin->w_botline = old_botline;
|
||||
curwin->w_empty_rows = old_empty_rows;
|
||||
restore_viewstate(&old_viewstate);
|
||||
highlight_match = FALSE;
|
||||
validate_cursor(); /* needed for TAB */
|
||||
redraw_all_later(SOME_VALID);
|
||||
|
Reference in New Issue
Block a user