]> granicus.if.org Git - vim/commitdiff
patch 8.0.1763: :argedit does not reuse an empty unnamed buffer v8.0.1763
authorBram Moolenaar <Bram@vim.org>
Tue, 24 Apr 2018 19:58:51 +0000 (21:58 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 24 Apr 2018 19:58:51 +0000 (21:58 +0200)
Problem:    :argedit does not reuse an empty unnamed buffer.
Solution:   Add the BLN_CURBUF flag and fix all the side effects. (Christian
            Brabandt, closes #2713)

src/buffer.c
src/ex_cmds2.c
src/proto/buffer.pro
src/testdir/test_arglist.vim
src/testdir/test_command_count.vim
src/version.c

index c3d3d77b0fa9b0f01335df045256c053862b4f16..dd618337ef5bcb7aab486286f7678f9bca4bd874 100644 (file)
@@ -1841,6 +1841,20 @@ no_write_message_nobang(buf_T *buf UNUSED)
 
 static int  top_file_num = 1;          /* highest file number */
 
+/*
+ * Return TRUE if the current buffer is empty, unnamed, unmodified and used in
+ * only one window.  That means it can be re-used.
+ */
+    int
+curbuf_reusable(void)
+{
+    return (curbuf != NULL
+       && curbuf->b_ffname == NULL
+       && curbuf->b_nwindows <= 1
+       && (curbuf->b_ml.ml_mfp == NULL || BUFEMPTY())
+       && !curbufIsChanged());
+}
+
 /*
  * Add a file name to the buffer list.  Return a pointer to the buffer.
  * If the same file name already exists return a pointer to that buffer.
@@ -1921,11 +1935,7 @@ buflist_new(
      * buffer.)
      */
     buf = NULL;
-    if ((flags & BLN_CURBUF)
-           && curbuf != NULL
-           && curbuf->b_ffname == NULL
-           && curbuf->b_nwindows <= 1
-           && (curbuf->b_ml.ml_mfp == NULL || BUFEMPTY()))
+    if ((flags & BLN_CURBUF) && curbuf_reusable())
     {
        buf = curbuf;
        /* It's like this buffer is deleted.  Watch out for autocommands that
index 3e369a8a4fd2f8d5cf8531990b73de53a90a4c74..69283d693c560ef883a0c04a834bfdff4c08975a 100644 (file)
@@ -2941,6 +2941,8 @@ ex_next(exarg_T *eap)
 ex_argedit(exarg_T *eap)
 {
     int i = eap->addr_count ? (int)eap->line2 : curwin->w_arg_idx + 1;
+    // Whether curbuf will be reused, curbuf->b_ffname will be set.
+    int curbuf_is_reusable = curbuf_reusable();
 
     if (do_arglist(eap->arg, AL_ADD, i) == FAIL)
        return;
@@ -2948,8 +2950,9 @@ ex_argedit(exarg_T *eap)
     maketitle();
 #endif
 
-    if (curwin->w_arg_idx == 0 && (curbuf->b_ml.ml_flags & ML_EMPTY)
-           && curbuf->b_ffname == NULL)
+    if (curwin->w_arg_idx == 0
+           && (curbuf->b_ml.ml_flags & ML_EMPTY)
+           && (curbuf->b_ffname == NULL || curbuf_is_reusable))
        i = 0;
     /* Edit the argument. */
     if (i < ARGCOUNT)
@@ -3281,7 +3284,8 @@ alist_add_list(
        for (i = 0; i < count; ++i)
        {
            ARGLIST[after + i].ae_fname = files[i];
-           ARGLIST[after + i].ae_fnum = buflist_add(files[i], BLN_LISTED);
+           ARGLIST[after + i].ae_fnum =
+                               buflist_add(files[i], BLN_LISTED | BLN_CURBUF);
        }
        ALIST(curwin)->al_ga.ga_len += count;
        if (old_argcount > 0 && curwin->w_arg_idx >= after)
index 8b98843547ed3f6e00195e860a99b915d732f6e0..59bb2c201222aff717bd83fefbde723875b4a63a 100644 (file)
@@ -15,6 +15,7 @@ void enter_buffer(buf_T *buf);
 void do_autochdir(void);
 void no_write_message(void);
 void no_write_message_nobang(buf_T *buf);
+int curbuf_reusable(void);
 buf_T *buflist_new(char_u *ffname, char_u *sfname, linenr_T lnum, int flags);
 void free_buf_options(buf_T *buf, int free_p_ff);
 int buflist_getfile(int n, linenr_T lnum, int options, int forceit);
index 4b8d762e97d6cf4c6d1eda95b05ea76f368f6e9e..87bda700d10bc695dca3be00ab3d7b1950aa5216 100644 (file)
@@ -308,6 +308,18 @@ func Test_argedit()
   %argd
   bwipe! C
   bwipe! D
+
+  " :argedit reuses the current buffer if it is empty
+  %argd
+  " make sure to use a new buffer number for x when it is loaded
+  bw! x
+  new
+  let a = bufnr('')
+  argedit x
+  call assert_equal(a, bufnr(''))
+  call assert_equal('x', bufname(''))
+  %argd
+  bw! x
 endfunc
 
 " Test for the :argdelete command
index 2d793ed88fbdc9ddbd9d0db60727490ba3a3bca4..7262789ab42f039e0fc4d4f7bf5aea071d32ed21 100644 (file)
@@ -173,7 +173,6 @@ func Test_command_count_4()
   only!
 
   exe bufnr . 'buf'
-  bnext
   let bufnr = bufnr('%')
   let buffers = []
   .,$-bufdo call add(buffers, bufnr('%'))
index 778419ce5ef7e2c25dead0cb59d9b197e2995cd3..f5d4c5a2899812f25fb0d0c6a172a686b01ef192 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1763,
 /**/
     1762,
 /**/