]> granicus.if.org Git - vim/commitdiff
patch 8.1.0410: the ex_copen() function is too long v8.1.0410
authorBram Moolenaar <Bram@vim.org>
Wed, 19 Sep 2018 19:56:02 +0000 (21:56 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 19 Sep 2018 19:56:02 +0000 (21:56 +0200)
Problem:    The ex_copen() function is too long.
Solution:   Refactor to split off two functions. (Yegappan Lakshmanan)

src/quickfix.c
src/version.c

index c43ad60435d6c1d527b914a33827d83ea824c463..9c346519fa1e9227c7b02e54ae442b4e643b9a3a 100644 (file)
@@ -3806,6 +3806,112 @@ qf_set_title_var(qf_list_T *qfl)
        set_internal_string_var((char_u *)"w:quickfix_title", qfl->qf_title);
 }
 
+/*
+ * Goto a quickfix or location list window (if present).
+ * Returns OK if the window is found, FAIL otherwise.
+ */
+    static int
+qf_goto_cwindow(qf_info_T *qi, int resize, int sz, int vertsplit)
+{
+    win_T      *win;
+
+    win = qf_find_win(qi);
+    if (win == NULL)
+       return FAIL;
+
+    win_goto(win);
+    if (resize)
+    {
+       if (vertsplit)
+       {
+           if (sz != win->w_width)
+               win_setwidth(sz);
+       }
+       else if (sz != win->w_height)
+           win_setheight(sz);
+    }
+
+    return OK;
+}
+
+/*
+ * Open a new quickfix or location list window, load the quickfix buffer and
+ * set the appropriate options for the window.
+ * Returns FAIL if the window could not be opened.
+ */
+    static int
+qf_open_new_cwindow(qf_info_T *qi, int height)
+{
+    buf_T      *qf_buf;
+    win_T      *oldwin = curwin;
+    tabpage_T  *prevtab = curtab;
+    int                flags = 0;
+    win_T      *win;
+
+    qf_buf = qf_find_buf(qi);
+
+    // The current window becomes the previous window afterwards.
+    win = curwin;
+
+    if (IS_QF_STACK(qi) && cmdmod.split == 0)
+       // Create the new quickfix window at the very bottom, except when
+       // :belowright or :aboveleft is used.
+       win_goto(lastwin);
+    // Default is to open the window below the current window
+    if (cmdmod.split == 0)
+       flags = WSP_BELOW;
+    flags |= WSP_NEWLOC;
+    if (win_split(height, flags) == FAIL)
+       return FAIL;            // not enough room for window
+    RESET_BINDING(curwin);
+
+    if (IS_LL_STACK(qi))
+    {
+       // For the location list window, create a reference to the
+       // location list from the window 'win'.
+       curwin->w_llist_ref = win->w_llist;
+       win->w_llist->qf_refcount++;
+    }
+
+    if (oldwin != curwin)
+       oldwin = NULL;  // don't store info when in another window
+    if (qf_buf != NULL)
+    {
+       // Use the existing quickfix buffer
+       (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE,
+               ECMD_HIDE + ECMD_OLDBUF, oldwin);
+    }
+    else
+    {
+       // Create a new quickfix buffer
+       (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin);
+
+       // switch off 'swapfile'
+       set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
+       set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
+               OPT_LOCAL);
+       set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL);
+       RESET_BINDING(curwin);
+#ifdef FEAT_DIFF
+       curwin->w_p_diff = FALSE;
+#endif
+#ifdef FEAT_FOLDING
+       set_option_value((char_u *)"fdm", 0L, (char_u *)"manual",
+               OPT_LOCAL);
+#endif
+    }
+
+    // Only set the height when still in the same tab page and there is no
+    // window to the side.
+    if (curtab == prevtab && curwin->w_width == Columns)
+       win_setheight(height);
+    curwin->w_p_wfh = TRUE;        // set 'winfixheight'
+    if (win_valid(win))
+       prevwin = win;
+
+    return OK;
+}
+
 /*
  * ":copen": open a window that shows the list of errors.
  * ":lopen": open a window that shows the location list.
@@ -3815,10 +3921,7 @@ ex_copen(exarg_T *eap)
 {
     qf_info_T  *qi = &ql_info;
     int                height;
-    win_T      *win;
-    tabpage_T  *prevtab = curtab;
-    buf_T      *qf_buf;
-    win_T      *oldwin = curwin;
+    int                status = FAIL;
 
     if (is_loclist_cmd(eap->cmdidx))
     {
@@ -3835,107 +3938,28 @@ ex_copen(exarg_T *eap)
     else
        height = QF_WINHEIGHT;
 
-    reset_VIsual_and_resel();                  /* stop Visual mode */
+    reset_VIsual_and_resel();                  // stop Visual mode
 #ifdef FEAT_GUI
     need_mouse_correct = TRUE;
 #endif
 
-    /*
-     * Find existing quickfix window, or open a new one.
-     */
-    win = qf_find_win(qi);
-
-    if (win != NULL && cmdmod.tab == 0)
-    {
-       win_goto(win);
-       if (eap->addr_count != 0)
-       {
-           if (cmdmod.split & WSP_VERT)
-           {
-               if (height != win->w_width)
-                   win_setwidth(height);
-           }
-           else if (height != win->w_height)
-               win_setheight(height);
-       }
-    }
-    else
-    {
-       int flags = 0;
-
-       qf_buf = qf_find_buf(qi);
-
-       /* The current window becomes the previous window afterwards. */
-       win = curwin;
-
-       if ((eap->cmdidx == CMD_copen || eap->cmdidx == CMD_cwindow)
-               && cmdmod.split == 0)
-           /* Create the new quickfix window at the very bottom, except when
-            * :belowright or :aboveleft is used. */
-           win_goto(lastwin);
-       /* Default is to open the window below the current window */
-       if (cmdmod.split == 0)
-           flags = WSP_BELOW;
-       flags |= WSP_NEWLOC;
-       if (win_split(height, flags) == FAIL)
-           return;             /* not enough room for window */
-       RESET_BINDING(curwin);
-
-       if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow)
-       {
-           /*
-            * For the location list window, create a reference to the
-            * location list from the window 'win'.
-            */
-           curwin->w_llist_ref = win->w_llist;
-           win->w_llist->qf_refcount++;
-       }
-
-       if (oldwin != curwin)
-           oldwin = NULL;  /* don't store info when in another window */
-       if (qf_buf != NULL)
-           /* Use the existing quickfix buffer */
-           (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE,
-                                            ECMD_HIDE + ECMD_OLDBUF, oldwin);
-       else
-       {
-           /* Create a new quickfix buffer */
-           (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin);
-           /* switch off 'swapfile' */
-           set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
-           set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
-                                                                  OPT_LOCAL);
-           set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL);
-           RESET_BINDING(curwin);
-#ifdef FEAT_DIFF
-           curwin->w_p_diff = FALSE;
-#endif
-#ifdef FEAT_FOLDING
-           set_option_value((char_u *)"fdm", 0L, (char_u *)"manual",
-                                                                  OPT_LOCAL);
-#endif
-       }
-
-       /* Only set the height when still in the same tab page and there is no
-        * window to the side. */
-       if (curtab == prevtab && curwin->w_width == Columns)
-           win_setheight(height);
-       curwin->w_p_wfh = TRUE;     /* set 'winfixheight' */
-       if (win_valid(win))
-           prevwin = win;
-    }
+    // Find an existing quickfix window, or open a new one.
+    if (cmdmod.tab == 0)
+       status = qf_goto_cwindow(qi, eap->addr_count != 0, height,
+                                               cmdmod.split & WSP_VERT);
+    if (status == FAIL)
+       if (qf_open_new_cwindow(qi, height) == FAIL)
+           return;
 
     qf_set_title_var(&qi->qf_lists[qi->qf_curlist]);
 
-    /*
-     * Fill the buffer with the quickfix list.
-     */
+    // Fill the buffer with the quickfix list.
     qf_fill_buffer(qi, curbuf, NULL);
 
     curwin->w_cursor.lnum = qi->qf_lists[qi->qf_curlist].qf_index;
     curwin->w_cursor.col = 0;
     check_cursor();
-    update_topline();          /* scroll to show the line */
+    update_topline();          // scroll to show the line
 }
 
 /*
index 2726e6326fbed863b2770a5ae33daa263670b04c..10d8e49e832304c5ae978467c089326b441f9fdb 100644 (file)
@@ -794,6 +794,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    410,
 /**/
     409,
 /**/