Patch 8.1.0523
Problem: Opening window from quickfix leaves empty buffer behind.
Solution: Add qf_jump_newwin(). (Yegappan Lakshmanan, closes #2574)
Files: src/proto/quickfix.pro, src/quickfix.c,
src/testdir/test_quickfix.vim
*** ../vim-8.1.0522/src/proto/quickfix.pro 2018-10-20 20:53:58.143284832
+0200
--- src/proto/quickfix.pro 2018-11-11 22:45:31.145846186 +0100
***************
*** 4,9 ****
--- 4,10 ----
void check_quickfix_busy(void);
void copy_loclist_stack(win_T *from, win_T *to);
void qf_jump(qf_info_T *qi, int dir, int errornr, int forceit);
+ void qf_jump_newwin(qf_info_T *qi, int dir, int errornr, int forceit, int
newwin);
void qf_list(exarg_T *eap);
void qf_age(exarg_T *eap);
void qf_history(exarg_T *eap);
*** ../vim-8.1.0522/src/quickfix.c 2018-10-28 14:36:04.222247691 +0100
--- src/quickfix.c 2018-11-11 22:46:08.525548009 +0100
***************
*** 2699,2713 ****
}
/*
! * Find a help window or open one.
*/
static int
! jump_to_help_window(qf_info_T *qi, int *opened_window)
{
win_T *wp;
int flags;
! if (cmdmod.tab != 0)
wp = NULL;
else
wp = qf_find_help_win();
--- 2699,2714 ----
}
/*
! * 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 newwin, int *opened_window)
{
win_T *wp;
int flags;
! if (cmdmod.tab != 0 || newwin)
wp = NULL;
else
wp = qf_find_help_win();
***************
*** 2721,2728 ****
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 (win_split(0, flags) == FAIL)
return FAIL;
--- 2722,2731 ----
if (cmdmod.split == 0 && curwin->w_width != Columns
&& curwin->w_width < 80)
flags |= WSP_TOP;
! // 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,2740 ****
if (curwin->w_height < p_hh)
win_setheight((int)p_hh);
! if (IS_LL_STACK(qi)) // not a quickfix list
{
- // The new window should use the supplied location list
curwin->w_llist = qi;
qi->qf_refcount++;
}
--- 2735,2745 ----
if (curwin->w_height < p_hh)
win_setheight((int)p_hh);
! // 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)
{
curwin->w_llist = qi;
qi->qf_refcount++;
}
***************
*** 2915,2934 ****
/*
* 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
--- 2920,2945 ----
/*
* 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. 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 newwin, int *opened_window)
{
win_T *usable_win_ptr = NULL;
int usable_win;
! qf_info_T *ll_ref = NULL;
win_T *win;
usable_win = 0;
! // 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,2958 ****
// 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;
--- 2963,2969 ----
// 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 || newwin)
{
if (qf_open_new_file_win(ll_ref) != OK)
return FAIL;
***************
*** 3146,3162 ****
/*
* Find a usable window for opening a file from the quickfix/location list. If
! * a window is not found 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)
{
// 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)
return FAIL;
// If currently in the quickfix window, find another window to show the
--- 3157,3178 ----
/*
* Find a usable window for opening a file from the quickfix/location list. If
! * 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 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, newwin, opened_window) == FAIL)
return FAIL;
// If currently in the quickfix window, find another window to show the
***************
*** 3168,3174 ****
if (qf_ptr->qf_fnum == 0)
return NOTDONE;
! if (qf_jump_to_usable_window(qf_ptr->qf_fnum, opened_window) == FAIL)
return FAIL;
}
--- 3184,3191 ----
if (qf_ptr->qf_fnum == 0)
return NOTDONE;
! if (qf_jump_to_usable_window(qf_ptr->qf_fnum, newwin,
! opened_window) == FAIL)
return FAIL;
}
***************
*** 3229,3241 ****
}
/*
! * 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"
*/
void
qf_jump(qf_info_T *qi,
--- 3246,3258 ----
}
/*
! * 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".
*/
void
qf_jump(qf_info_T *qi,
***************
*** 3243,3248 ****
--- 3260,3279 ----
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,3294 ****
// window
print_message = FALSE;
! retval = qf_jump_open_window(qi, qf_ptr, &opened_window);
if (retval == FAIL)
goto failed;
if (retval == NOTDONE)
--- 3319,3325 ----
// window
print_message = FALSE;
! retval = qf_jump_open_window(qi, qf_ptr, newwin, &opened_window);
if (retval == FAIL)
goto failed;
if (retval == NOTDONE)
***************
*** 3824,3836 ****
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");
return;
}
--- 3855,3863 ----
if (split)
{
! // 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;
}
*** ../vim-8.1.0522/src/testdir/test_quickfix.vim 2018-10-28
14:36:04.222247691 +0100
--- src/testdir/test_quickfix.vim 2018-11-11 22:46:08.525548009 +0100
***************
*** 3718,3720 ****
--- 3718,3766 ----
call assert_equal(getcurpos()[4], virtcol('.'))
cclose | helpclose
endfunc
+
+ " Test for opening a file from the quickfix window using CTRL-W <Enter>
+ " doesn't leave an empty buffer around.
+ func Test_splitview()
+ call s:create_test_file('Xtestfile1')
+ call s:create_test_file('Xtestfile2')
+ new | only
+ let last_bufnr = bufnr('Test_sv_1', 1)
+ let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
+ cgetexpr l
+ copen
+ let numbufs = len(getbufinfo())
+ exe "normal \<C-W>\<CR>"
+ copen
+ exe "normal j\<C-W>\<CR>"
+ " Make sure new empty buffers are not created
+ call assert_equal(numbufs, len(getbufinfo()))
+ " Creating a new buffer should use the next available buffer number
+ call assert_equal(last_bufnr + 4, bufnr("Test_sv_2", 1))
+ bwipe Test_sv_1
+ bwipe Test_sv_2
+ new | only
+
+ " When split opening files from location list window, make sure that two
+ " windows doesn't refer to the same location list
+ lgetexpr l
+ let locid = getloclist(0, {'id' : 0}).id
+ lopen
+ exe "normal \<C-W>\<CR>"
+ call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
+ call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
+ new | only
+
+ " When split opening files from a helpgrep location list window, a new help
+ " window should be opend with a copy of the location list.
+ lhelpgrep window
+ let locid = getloclist(0, {'id' : 0}).id
+ lwindow
+ exe "normal j\<C-W>\<CR>"
+ call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
+ call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
+ new | only
+
+ call delete('Xtestfile1')
+ call delete('Xtestfile2')
+ endfunc
*** ../vim-8.1.0522/src/version.c 2018-11-11 22:18:17.214948188 +0100
--- src/version.c 2018-11-11 22:49:25.382976159 +0100
***************
*** 794,795 ****
--- 794,797 ----
{ /* Add new patch number below this line */
+ /**/
+ 523,
/**/
--
ARTHUR: Bloody peasant!
DENNIS: Oh, what a give away. Did you hear that, did you hear that, eh?
That's what I'm on about -- did you see him repressing me, you saw it
didn't you?
The Quest for the Holy Grail (Monty Python)
/// Bram Moolenaar -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.