0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 8.0.1812: the qf_jump_to_usable_window() function is too long

Problem:    The qf_jump_to_usable_window() function is too long.
Solution:   Split it in parts. (Yegappan Lakshmanan, closes #2891)
This commit is contained in:
Bram Moolenaar
2018-05-10 18:55:28 +02:00
parent 72cf47a279
commit 7a2b0e55e9
2 changed files with 208 additions and 135 deletions

View File

@@ -2027,7 +2027,7 @@ qf_clean_dir_stack(struct dir_stack_T **stackptr)
* Cleans up intermediate directory entries. * Cleans up intermediate directory entries.
* *
* TODO: How to solve the following problem? * TODO: How to solve the following problem?
* If we have the this directory tree: * If we have this directory tree:
* ./ * ./
* ./aa * ./aa
* ./aa/bb * ./aa/bb
@@ -2079,7 +2079,7 @@ qf_guess_filepath(qf_info_T *qi, int qf_idx, char_u *filename)
vim_free(ds_tmp); vim_free(ds_tmp);
} }
return ds_ptr==NULL? NULL: ds_ptr->dirname; return ds_ptr == NULL ? NULL : ds_ptr->dirname;
} }
/* /*
@@ -2108,7 +2108,7 @@ qflist_valid (win_T *wp, int_u qf_id)
/* /*
* When loading a file from the quickfix, the auto commands may modify it. * When loading a file from the quickfix, the auto commands may modify it.
* This may invalidate the current quickfix entry. This function checks * This may invalidate the current quickfix entry. This function checks
* whether a entry is still present in the quickfix. * whether an entry is still present in the quickfix list.
* Similar to location list. * Similar to location list.
*/ */
static int static int
@@ -2272,6 +2272,21 @@ get_nth_entry(
return qf_ptr; return qf_ptr;
} }
/*
* 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. * Find a help window or open one.
*/ */
@@ -2284,9 +2299,7 @@ jump_to_help_window(qf_info_T *qi, int *opened_window)
if (cmdmod.tab != 0) if (cmdmod.tab != 0)
wp = NULL; wp = NULL;
else else
FOR_ALL_WINDOWS(wp) wp = qf_find_help_win();
if (bt_help(wp->w_buffer))
break;
if (wp != NULL && wp->w_buffer->b_nwindows > 0) if (wp != NULL && wp->w_buffer->b_nwindows > 0)
win_enter(wp, TRUE); win_enter(wp, TRUE);
else else
@@ -2325,79 +2338,70 @@ jump_to_help_window(qf_info_T *qi, int *opened_window)
} }
/* /*
* Find a suitable window for opening a file (qf_fnum) and jump to it. * Find a non-quickfix window using the given location list.
* If the file is already opened in a window, jump to it. * 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 static int
qf_jump_to_usable_window(int qf_fnum, int *opened_window) qf_goto_tabwin_with_file(int fnum)
{ {
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;
}
}
/*
* If no usable window is found and 'switchbuf' contains "usetab"
* then search in other tabs.
*/
if (!usable_win && (swb_flags & SWB_USETAB))
{
tabpage_T *tp; tabpage_T *tp;
win_T *wp; win_T *wp;
FOR_ALL_TAB_WINDOWS(tp, wp) FOR_ALL_TAB_WINDOWS(tp, wp)
{ if (wp->w_buffer->b_fnum == fnum)
if (wp->w_buffer->b_fnum == qf_fnum)
{ {
goto_tabpage_win(tp, wp); goto_tabpage_win(tp, wp);
usable_win = 1; return TRUE;
goto win_found;
} }
}
}
win_found:
/* return FALSE;
* If there is only one window and it is the quickfix window, create a }
* new one above the quickfix window.
/*
* Create a new window to show a file above the quickfix window. Called when
* only the quickfix window is present.
*/ */
if ((ONE_WINDOW && bt_quickfix(curbuf)) || !usable_win) static int
{ qf_open_new_file_win(qf_info_T *ll_ref)
{
int flags;
flags = WSP_ABOVE; flags = WSP_ABOVE;
if (ll_ref != NULL) if (ll_ref != NULL)
flags |= WSP_NEWLOC; flags |= WSP_NEWLOC;
if (win_split(0, flags) == FAIL) if (win_split(0, flags) == FAIL)
return FAIL; /* not enough room for window */ return FAIL; /* not enough room for window */
*opened_window = TRUE; /* close it when fail */
p_swb = empty_option; /* don't split again */ p_swb = empty_option; /* don't split again */
swb_flags = 0; swb_flags = 0;
RESET_BINDING(curwin); RESET_BINDING(curwin);
@@ -2408,13 +2412,20 @@ win_found:
curwin->w_llist = ll_ref; curwin->w_llist = ll_ref;
ll_ref->qf_refcount++; ll_ref->qf_refcount++;
} }
} return OK;
else }
{
if (curwin->w_llist_ref != NULL) /*
{ * Go to a window that shows the right buffer. If the window is not found, go
/* In a location window */ * to the window just above the location list window. This is used for opening
win = usable_win_ptr; * 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) if (win == NULL)
{ {
/* Find the window showing the selected file */ /* Find the window showing the selected file */
@@ -2445,14 +2456,19 @@ win_found:
win->w_llist = ll_ref; win->w_llist = ll_ref;
ll_ref->qf_refcount++; ll_ref->qf_refcount++;
} }
} }
else
{
/* /*
* Try to find a window that shows the right buffer. * Go to a window that shows the specified file. If a window is not found, go
* Default to the window just above the quickfix buffer. * 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; win = curwin;
altwin = NULL; altwin = NULL;
for (;;) for (;;)
@@ -2484,7 +2500,64 @@ win_found:
} }
win_goto(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)
{
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;
}
/*
* If no usable window is found and 'switchbuf' contains "usetab"
* 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
* new one above the quickfix window.
*/
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; return OK;
@@ -2562,8 +2635,8 @@ qf_jump_edit_buffer(
} }
/* /*
* Goto the error line in the current file using either line/column number or a * Go to the error line in the current file using either line/column number or
* search pattern. * a search pattern.
*/ */
static void static void
qf_jump_goto_line( qf_jump_goto_line(
@@ -5779,7 +5852,7 @@ qf_setprop_context(qf_info_T *qi, int qf_idx, dictitem_T *di)
/* /*
* Set quickfix/location list properties (title, items, context). * Set quickfix/location list properties (title, items, context).
* Also used to add items from parsing a list of lines. * Also used to add items from parsing a list of lines.
* Used by the setqflist() and setloclist() VimL functions. * Used by the setqflist() and setloclist() Vim script functions.
*/ */
static int static int
qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title) qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title)
@@ -6162,9 +6235,7 @@ hgr_get_ll(int *new_ll)
wp = curwin; wp = curwin;
else else
/* Find an existing help window */ /* Find an existing help window */
FOR_ALL_WINDOWS(wp) wp = qf_find_help_win();
if (bt_help(wp->w_buffer))
break;
if (wp == NULL) /* Help window not found */ if (wp == NULL) /* Help window not found */
qi = NULL; qi = NULL;

View File

@@ -761,6 +761,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1812,
/**/ /**/
1811, 1811,
/**/ /**/