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 -- b...@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    ///

-- 
-- 
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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui