diff src/ex_getln.c @ 13794:530a6b894ae2 v8.0.1769

patch 8.0.1769: repeated saving and restoring viewstate for 'incsearch' commit https://github.com/vim/vim/commit/9b25af36204c0511eab08d621688f0f2008fc68e Author: Bram Moolenaar <Bram@vim.org> Date: Sat Apr 28 13:56:09 2018 +0200 patch 8.0.1769: repeated saving and restoring viewstate for 'incsearch' Problem: Repeated saving and restoring viewstate for 'incsearch'. Solution: Use a structure.
author Christian Brabandt <cb@256bit.org>
date Sat, 28 Apr 2018 14:00:08 +0200
parents 0e9b2971d7c3
children 1f95ec5de238
line wrap: on
line diff
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -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);