To: vim_dev@googlegroups.com Subject: Patch 8.0.1812 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1812 Problem: The qf_jump_to_usable_window() function is too long. Solution: Split it in parts. (Yegappan Lakshmanan, closes #2891) Files: src/quickfix.c *** ../vim-8.0.1811/src/quickfix.c 2018-05-08 22:31:32.769389714 +0200 --- src/quickfix.c 2018-05-10 18:54:07.236205061 +0200 *************** *** 2027,2033 **** * Cleans up intermediate directory entries. * * TODO: How to solve the following problem? ! * If we have the this directory tree: * ./ * ./aa * ./aa/bb --- 2027,2033 ---- * Cleans up intermediate directory entries. * * TODO: How to solve the following problem? ! * If we have this directory tree: * ./ * ./aa * ./aa/bb *************** *** 2079,2085 **** vim_free(ds_tmp); } ! return ds_ptr==NULL? NULL: ds_ptr->dirname; } /* --- 2079,2085 ---- vim_free(ds_tmp); } ! return ds_ptr == NULL ? NULL : ds_ptr->dirname; } /* *************** *** 2108,2114 **** /* * When loading a file from the quickfix, the auto commands may modify it. * This may invalidate the current quickfix entry. This function checks ! * whether a entry is still present in the quickfix. * Similar to location list. */ static int --- 2108,2114 ---- /* * When loading a file from the quickfix, the auto commands may modify it. * This may invalidate the current quickfix entry. This function checks ! * whether an entry is still present in the quickfix list. * Similar to location list. */ static int *************** *** 2273,2278 **** --- 2273,2293 ---- } /* + * Find a window displaying a Vim help file. + */ + static win_T * + qf_find_help_win(void) + { + win_T *wp; + + FOR_ALL_WINDOWS(wp) + if (bt_help(wp->w_buffer)) + return wp; + + return NULL; + } + + /* * Find a help window or open one. */ static int *************** *** 2284,2292 **** if (cmdmod.tab != 0) wp = NULL; else ! FOR_ALL_WINDOWS(wp) ! if (bt_help(wp->w_buffer)) ! break; if (wp != NULL && wp->w_buffer->b_nwindows > 0) win_enter(wp, TRUE); else --- 2299,2305 ---- if (cmdmod.tab != 0) wp = NULL; else ! wp = qf_find_help_win(); if (wp != NULL && wp->w_buffer->b_nwindows > 0) win_enter(wp, TRUE); else *************** *** 2325,2332 **** } /* ! * Find a suitable window for opening a file (qf_fnum) and jump to it. ! * If the file is already opened in a window, jump to it. */ static int qf_jump_to_usable_window(int qf_fnum, int *opened_window) --- 2338,2512 ---- } /* ! * Find a non-quickfix window using the given location list. ! * Returns NULL if a matching window is not found. ! */ ! static win_T * ! qf_find_win_with_loclist(qf_info_T *ll) ! { ! win_T *wp; ! ! FOR_ALL_WINDOWS(wp) ! if (wp->w_llist == ll && !bt_quickfix(wp->w_buffer)) ! return wp; ! ! return NULL; ! } ! ! /* ! * Find a window containing a normal buffer ! */ ! static win_T * ! qf_find_win_with_normal_buf(void) ! { ! win_T *wp; ! ! FOR_ALL_WINDOWS(wp) ! if (wp->w_buffer->b_p_bt[0] == NUL) ! return wp; ! ! return NULL; ! } ! ! /* ! * Go to a window in any tabpage containing the specified file. Returns TRUE ! * if successfully jumped to the window. Otherwise returns FALSE. ! */ ! static int ! qf_goto_tabwin_with_file(int fnum) ! { ! tabpage_T *tp; ! win_T *wp; ! ! FOR_ALL_TAB_WINDOWS(tp, wp) ! if (wp->w_buffer->b_fnum == fnum) ! { ! goto_tabpage_win(tp, wp); ! return TRUE; ! } ! ! return FALSE; ! } ! ! /* ! * Create a new window to show a file above the quickfix window. Called when ! * only the quickfix window is present. ! */ ! static int ! qf_open_new_file_win(qf_info_T *ll_ref) ! { ! int flags; ! ! flags = WSP_ABOVE; ! if (ll_ref != NULL) ! flags |= WSP_NEWLOC; ! if (win_split(0, flags) == FAIL) ! return FAIL; /* not enough room for window */ ! p_swb = empty_option; /* don't split again */ ! swb_flags = 0; ! RESET_BINDING(curwin); ! if (ll_ref != NULL) ! { ! /* The new window should use the location list from the ! * location list window */ ! curwin->w_llist = ll_ref; ! ll_ref->qf_refcount++; ! } ! return OK; ! } ! ! /* ! * Go to a window that shows the right buffer. If the window is not found, go ! * to the window just above the location list window. This is used for opening ! * a file from a location window and not from a quickfix window. If some usable ! * window is previously found, then it is supplied in 'use_win'. ! */ ! static void ! qf_goto_win_with_ll_file(win_T *use_win, int qf_fnum, qf_info_T *ll_ref) ! { ! win_T *win = use_win; ! ! if (win == NULL) ! { ! /* Find the window showing the selected file */ ! FOR_ALL_WINDOWS(win) ! if (win->w_buffer->b_fnum == qf_fnum) ! break; ! if (win == NULL) ! { ! /* Find a previous usable window */ ! win = curwin; ! do ! { ! if (win->w_buffer->b_p_bt[0] == NUL) ! break; ! if (win->w_prev == NULL) ! win = lastwin; /* wrap around the top */ ! else ! win = win->w_prev; /* go to previous window */ ! } while (win != curwin); ! } ! } ! win_goto(win); ! ! /* If the location list for the window is not set, then set it ! * to the location list from the location window */ ! if (win->w_llist == NULL) ! { ! win->w_llist = ll_ref; ! ll_ref->qf_refcount++; ! } ! } ! ! /* ! * Go to a window that shows the specified file. If a window is not found, go ! * to the window just above the quickfix window. This is used for opening a ! * file from a quickfix window and not from a location window. ! */ ! static void ! qf_goto_win_with_qfl_file(int qf_fnum) ! { ! win_T *win; ! win_T *altwin; ! ! win = curwin; ! altwin = NULL; ! for (;;) ! { ! if (win->w_buffer->b_fnum == qf_fnum) ! break; ! if (win->w_prev == NULL) ! win = lastwin; /* wrap around the top */ ! else ! win = win->w_prev; /* go to previous window */ ! ! if (IS_QF_WINDOW(win)) ! { ! /* Didn't find it, go to the window before the quickfix ! * window. */ ! if (altwin != NULL) ! win = altwin; ! else if (curwin->w_prev != NULL) ! win = curwin->w_prev; ! else ! win = curwin->w_next; ! break; ! } ! ! /* Remember a usable window. */ ! if (altwin == NULL && !win->w_p_pvw ! && win->w_buffer->b_p_bt[0] == NUL) ! altwin = win; ! } ! ! win_goto(win); ! } ! ! /* ! * Find a suitable window for opening a file (qf_fnum) from the ! * quickfix/location list and jump to it. If the file is already opened in a ! * window, jump to it. Otherwise open a new window to display the file. This is ! * called from either a quickfix or a location list window. */ static int qf_jump_to_usable_window(int qf_fnum, int *opened_window) *************** *** 2334,2368 **** win_T *usable_win_ptr = NULL; int usable_win; qf_info_T *ll_ref; - int flags; win_T *win; - win_T *altwin; usable_win = 0; ll_ref = curwin->w_llist_ref; if (ll_ref != NULL) { ! /* Find a window using the same location list that is not a ! * quickfix window. */ ! FOR_ALL_WINDOWS(usable_win_ptr) ! if (usable_win_ptr->w_llist == ll_ref ! && !bt_quickfix(usable_win_ptr->w_buffer)) ! { ! usable_win = 1; ! break; ! } } if (!usable_win) { /* Locate a window showing a normal buffer */ ! FOR_ALL_WINDOWS(win) ! if (win->w_buffer->b_p_bt[0] == NUL) ! { ! usable_win = 1; ! break; ! } } /* --- 2514,2538 ---- win_T *usable_win_ptr = NULL; int usable_win; qf_info_T *ll_ref; win_T *win; usable_win = 0; ll_ref = curwin->w_llist_ref; if (ll_ref != NULL) { ! /* Find a non-quickfix window with this location list */ ! usable_win_ptr = qf_find_win_with_loclist(ll_ref); ! if (usable_win_ptr != NULL) ! usable_win = 1; } if (!usable_win) { /* Locate a window showing a normal buffer */ ! win = qf_find_win_with_normal_buf(); ! if (win != NULL) ! usable_win = 1; } /* *************** *** 2370,2390 **** * then search in other tabs. */ if (!usable_win && (swb_flags & SWB_USETAB)) ! { ! tabpage_T *tp; ! win_T *wp; ! ! FOR_ALL_TAB_WINDOWS(tp, wp) ! { ! if (wp->w_buffer->b_fnum == qf_fnum) ! { ! goto_tabpage_win(tp, wp); ! usable_win = 1; ! goto win_found; ! } ! } ! } ! win_found: /* * If there is only one window and it is the quickfix window, create a --- 2540,2546 ---- * then search in other tabs. */ if (!usable_win && (swb_flags & SWB_USETAB)) ! usable_win = qf_goto_tabwin_with_file(qf_fnum); /* * If there is only one window and it is the quickfix window, create a *************** *** 2392,2490 **** */ if ((ONE_WINDOW && bt_quickfix(curbuf)) || !usable_win) { ! flags = WSP_ABOVE; ! if (ll_ref != NULL) ! flags |= WSP_NEWLOC; ! if (win_split(0, flags) == FAIL) ! return FAIL; /* not enough room for window */ *opened_window = TRUE; /* close it when fail */ - p_swb = empty_option; /* don't split again */ - swb_flags = 0; - RESET_BINDING(curwin); - if (ll_ref != NULL) - { - /* The new window should use the location list from the - * location list window */ - curwin->w_llist = ll_ref; - ll_ref->qf_refcount++; - } } else { ! if (curwin->w_llist_ref != NULL) ! { ! /* In a location window */ ! win = usable_win_ptr; ! if (win == NULL) ! { ! /* Find the window showing the selected file */ ! FOR_ALL_WINDOWS(win) ! if (win->w_buffer->b_fnum == qf_fnum) ! break; ! if (win == NULL) ! { ! /* Find a previous usable window */ ! win = curwin; ! do ! { ! if (win->w_buffer->b_p_bt[0] == NUL) ! break; ! if (win->w_prev == NULL) ! win = lastwin; /* wrap around the top */ ! else ! win = win->w_prev; /* go to previous window */ ! } while (win != curwin); ! } ! } ! win_goto(win); ! ! /* If the location list for the window is not set, then set it ! * to the location list from the location window */ ! if (win->w_llist == NULL) ! { ! win->w_llist = ll_ref; ! ll_ref->qf_refcount++; ! } ! } ! else ! { ! ! /* ! * Try to find a window that shows the right buffer. ! * Default to the window just above the quickfix buffer. ! */ ! win = curwin; ! altwin = NULL; ! for (;;) ! { ! if (win->w_buffer->b_fnum == qf_fnum) ! break; ! if (win->w_prev == NULL) ! win = lastwin; /* wrap around the top */ ! else ! win = win->w_prev; /* go to previous window */ ! ! if (IS_QF_WINDOW(win)) ! { ! /* Didn't find it, go to the window before the quickfix ! * window. */ ! if (altwin != NULL) ! win = altwin; ! else if (curwin->w_prev != NULL) ! win = curwin->w_prev; ! else ! win = curwin->w_next; ! break; ! } ! ! /* Remember a usable window. */ ! if (altwin == NULL && !win->w_p_pvw ! && win->w_buffer->b_p_bt[0] == NUL) ! altwin = win; ! } ! ! win_goto(win); ! } } return OK; --- 2548,2563 ---- */ if ((ONE_WINDOW && bt_quickfix(curbuf)) || !usable_win) { ! if (qf_open_new_file_win(ll_ref) != OK) ! return FAIL; *opened_window = TRUE; /* close it when fail */ } else { ! if (curwin->w_llist_ref != NULL) /* In a location window */ ! qf_goto_win_with_ll_file(usable_win_ptr, qf_fnum, ll_ref); ! else /* In a quickfix window */ ! qf_goto_win_with_qfl_file(qf_fnum); } return OK; *************** *** 2562,2569 **** } /* ! * Goto the error line in the current file using either line/column number or a ! * search pattern. */ static void qf_jump_goto_line( --- 2635,2642 ---- } /* ! * Go to the error line in the current file using either line/column number or ! * a search pattern. */ static void qf_jump_goto_line( *************** *** 5779,5785 **** /* * Set quickfix/location list properties (title, items, context). * Also used to add items from parsing a list of lines. ! * Used by the setqflist() and setloclist() VimL functions. */ static int qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title) --- 5852,5858 ---- /* * Set quickfix/location list properties (title, items, context). * Also used to add items from parsing a list of lines. ! * Used by the setqflist() and setloclist() Vim script functions. */ static int qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title) *************** *** 6162,6170 **** wp = curwin; else /* Find an existing help window */ ! FOR_ALL_WINDOWS(wp) ! if (bt_help(wp->w_buffer)) ! break; if (wp == NULL) /* Help window not found */ qi = NULL; --- 6235,6241 ---- wp = curwin; else /* Find an existing help window */ ! wp = qf_find_help_win(); if (wp == NULL) /* Help window not found */ qi = NULL; *** ../vim-8.0.1811/src/version.c 2018-05-10 18:23:26.249136342 +0200 --- src/version.c 2018-05-10 18:55:13.287859769 +0200 *************** *** 763,764 **** --- 763,766 ---- { /* Add new patch number below this line */ + /**/ + 1812, /**/ -- Michael: There is no such thing as a dump question. Bernard: Sure there is. For example "what is a core dump?" /// 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 ///