To: vim_dev@googlegroups.com Subject: Patch 8.1.0523 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 + " 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 \\" + copen + exe "normal j\\" + " 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 \\" + 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\\" + 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 -- 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 ///