To: vim_dev@googlegroups.com Subject: Patch 8.1.0410 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0410 Problem: The ex_copen() function is too long. Solution: Refactor to split off two functions. (Yegappan Lakshmanan) Files: src/quickfix.c *** ../vim-8.1.0409/src/quickfix.c 2018-09-18 22:50:02.692936259 +0200 --- src/quickfix.c 2018-09-19 21:54:26.509737127 +0200 *************** *** 3807,3812 **** --- 3807,3918 ---- } /* + * 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,3824 **** { qf_info_T *qi = &ql_info; int height; ! win_T *win; ! tabpage_T *prevtab = curtab; ! buf_T *qf_buf; ! win_T *oldwin = curwin; if (is_loclist_cmd(eap->cmdidx)) { --- 3921,3927 ---- { qf_info_T *qi = &ql_info; int height; ! int status = FAIL; if (is_loclist_cmd(eap->cmdidx)) { *************** *** 3835,3941 **** else height = QF_WINHEIGHT; ! 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; ! } qf_set_title_var(&qi->qf_lists[qi->qf_curlist]); ! /* ! * 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 */ } /* --- 3938,3965 ---- else height = QF_WINHEIGHT; ! reset_VIsual_and_resel(); // stop Visual mode #ifdef FEAT_GUI need_mouse_correct = TRUE; #endif ! // 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. 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 } /* *** ../vim-8.1.0409/src/version.c 2018-09-19 21:06:28.344234982 +0200 --- src/version.c 2018-09-19 21:54:49.149575674 +0200 *************** *** 796,797 **** --- 796,799 ---- { /* Add new patch number below this line */ + /**/ + 410, /**/ -- You are only young once, but you can stay immature indefinitely. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///