diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-11-11 22:50:27 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-11-11 22:50:27 +0100 |
commit | b244373becbec124bee20dbbfd05365586cda8cd (patch) | |
tree | 469799b11b7a112879bd6b78611d866a6ab029b0 /src/quickfix.c | |
parent | f3aea59afa23304266dfd0dd26b5d8cc70a21331 (diff) | |
download | vim-git-b244373becbec124bee20dbbfd05365586cda8cd.tar.gz |
patch 8.1.0523: opening window from quickfix leaves empty buffer behindv8.1.0523
Problem: Opening window from quickfix leaves empty buffer behind.
Solution: Add qf_jump_newwin(). (Yegappan Lakshmanan, closes #2574)
Diffstat (limited to 'src/quickfix.c')
-rw-r--r-- | src/quickfix.c | 89 |
1 files changed, 58 insertions, 31 deletions
diff --git a/src/quickfix.c b/src/quickfix.c index 9b1922025..10a271787 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -2699,15 +2699,16 @@ qf_find_help_win(void) } /* - * Find a help window or open one. + * Find a help window or open one. If 'newwin' is TRUE, then open a new help + * window. */ static int -jump_to_help_window(qf_info_T *qi, int *opened_window) +jump_to_help_window(qf_info_T *qi, int newwin, int *opened_window) { win_T *wp; int flags; - if (cmdmod.tab != 0) + if (cmdmod.tab != 0 || newwin) wp = NULL; else wp = qf_find_help_win(); @@ -2721,8 +2722,10 @@ jump_to_help_window(qf_info_T *qi, int *opened_window) if (cmdmod.split == 0 && curwin->w_width != Columns && curwin->w_width < 80) flags |= WSP_TOP; - if (IS_LL_STACK(qi)) - flags |= WSP_NEWLOC; // don't copy the location list + // If the user asks to open a new window, then copy the location list. + // Otherwise, don't copy the location list. + if (IS_LL_STACK(qi) && !newwin) + flags |= WSP_NEWLOC; if (win_split(0, flags) == FAIL) return FAIL; @@ -2732,9 +2735,11 @@ jump_to_help_window(qf_info_T *qi, int *opened_window) if (curwin->w_height < p_hh) win_setheight((int)p_hh); - if (IS_LL_STACK(qi)) // not a quickfix list + // When using location list, the new window should use the supplied + // location list. If the user asks to open a new window, then the new + // window will get a copy of the location list. + if (IS_LL_STACK(qi) && !newwin) { - // The new window should use the supplied location list curwin->w_llist = qi; qi->qf_refcount++; } @@ -2915,20 +2920,26 @@ qf_goto_win_with_qfl_file(int qf_fnum) /* * 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. + * window, jump to it. Otherwise open a new window to display the file. If + * 'newwin' is TRUE, then always open a new window. 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) +qf_jump_to_usable_window(int qf_fnum, int newwin, int *opened_window) { win_T *usable_win_ptr = NULL; int usable_win; - qf_info_T *ll_ref; + qf_info_T *ll_ref = NULL; win_T *win; usable_win = 0; - ll_ref = curwin->w_llist_ref; + // If opening a new window, then don't use the location list referred by + // the current window. Otherwise two windows will refer to the same + // location list. + if (!newwin) + ll_ref = curwin->w_llist_ref; + if (ll_ref != NULL) { // Find a non-quickfix window with this location list @@ -2952,7 +2963,7 @@ qf_jump_to_usable_window(int qf_fnum, int *opened_window) // 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 ((ONE_WINDOW && bt_quickfix(curbuf)) || !usable_win || newwin) { if (qf_open_new_file_win(ll_ref) != OK) return FAIL; @@ -3146,17 +3157,22 @@ qf_jump_print_msg( /* * Find a usable window for opening a file from the quickfix/location list. If - * a window is not found then open a new window. + * a window is not found then open a new window. If 'newwin' is TRUE, then open + * a new window. * Returns OK if successfully jumped or opened a window. Returns FAIL if not * able to jump/open a window. Returns NOTDONE if a file is not associated * with the entry. */ static int -qf_jump_open_window(qf_info_T *qi, qfline_T *qf_ptr, int *opened_window) +qf_jump_open_window( + qf_info_T *qi, + qfline_T *qf_ptr, + int newwin, + int *opened_window) { // For ":helpgrep" find a help window or open one. if (qf_ptr->qf_type == 1 && (!bt_help(curwin->w_buffer) || cmdmod.tab != 0)) - if (jump_to_help_window(qi, opened_window) == FAIL) + if (jump_to_help_window(qi, newwin, opened_window) == FAIL) return FAIL; // If currently in the quickfix window, find another window to show the @@ -3168,7 +3184,8 @@ qf_jump_open_window(qf_info_T *qi, qfline_T *qf_ptr, int *opened_window) if (qf_ptr->qf_fnum == 0) return NOTDONE; - if (qf_jump_to_usable_window(qf_ptr->qf_fnum, opened_window) == FAIL) + if (qf_jump_to_usable_window(qf_ptr->qf_fnum, newwin, + opened_window) == FAIL) return FAIL; } @@ -3229,13 +3246,13 @@ qf_jump_to_buffer( } /* - * jump to a quickfix line - * if dir == FORWARD go "errornr" valid entries forward - * if dir == BACKWARD go "errornr" valid entries backward - * if dir == FORWARD_FILE go "errornr" valid entries files backward - * if dir == BACKWARD_FILE go "errornr" valid entries files backward + * Jump to a quickfix line. + * If dir == FORWARD go "errornr" valid entries forward. + * If dir == BACKWARD go "errornr" valid entries backward. + * If dir == FORWARD_FILE go "errornr" valid entries files backward. + * If dir == BACKWARD_FILE go "errornr" valid entries files backward * else if "errornr" is zero, redisplay the same line - * else go to entry "errornr" + * else go to entry "errornr". */ void qf_jump(qf_info_T *qi, @@ -3243,6 +3260,20 @@ qf_jump(qf_info_T *qi, int errornr, int forceit) { + qf_jump_newwin(qi, dir, errornr, forceit, FALSE); +} + +/* + * As qf_info(). + * If 'newwin' is TRUE, then open the file in a new window. + */ + void +qf_jump_newwin(qf_info_T *qi, + int dir, + int errornr, + int forceit, + int newwin) +{ qf_list_T *qfl; qfline_T *qf_ptr; qfline_T *old_qf_ptr; @@ -3288,7 +3319,7 @@ qf_jump(qf_info_T *qi, // window print_message = FALSE; - retval = qf_jump_open_window(qi, qf_ptr, &opened_window); + retval = qf_jump_open_window(qi, qf_ptr, newwin, &opened_window); if (retval == FAIL) goto failed; if (retval == NOTDONE) @@ -3824,13 +3855,9 @@ qf_view_result(int split) if (split) { - char_u cmd[32]; - - vim_snprintf((char *)cmd, sizeof(cmd), "split +%ld%s", - (long)curwin->w_cursor.lnum, - IS_LL_WINDOW(curwin) ? "ll" : "cc"); - if (do_cmdline_cmd(cmd) == OK) - do_cmdline_cmd((char_u *) "clearjumps"); + // Open the selected entry in a new window + qf_jump_newwin(qi, 0, (long)curwin->w_cursor.lnum, FALSE, TRUE); + do_cmdline_cmd((char_u *) "clearjumps"); return; } |