changeset 13782:3be5e8306a3e v8.0.1763

patch 8.0.1763: :argedit does not reuse an empty unnamed buffer commit https://github.com/vim/vim/commit/46a53dfc29689c6a0d80e3820e8b0a48dba6b6ec Author: Bram Moolenaar <Bram@vim.org> Date: Tue Apr 24 21:58:51 2018 +0200 patch 8.0.1763: :argedit does not reuse an empty unnamed buffer 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)
author Christian Brabandt <cb@256bit.org>
date Tue, 24 Apr 2018 22:00:07 +0200
parents 37bcbeae1a03
children 2984931f7503
files 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
diffstat 6 files changed, 37 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1842,6 +1842,20 @@ no_write_message_nobang(buf_T *buf UNUSE
 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.
  * If it does not exist, or if fname == NULL, a new entry is created.
@@ -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
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -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)
--- a/src/proto/buffer.pro
+++ b/src/proto/buffer.pro
@@ -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);
--- a/src/testdir/test_arglist.vim
+++ b/src/testdir/test_arglist.vim
@@ -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
--- a/src/testdir/test_command_count.vim
+++ b/src/testdir/test_command_count.vim
@@ -173,7 +173,6 @@ func Test_command_count_4()
   only!
 
   exe bufnr . 'buf'
-  bnext
   let bufnr = bufnr('%')
   let buffers = []
   .,$-bufdo call add(buffers, bufnr('%'))
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1763,
+/**/
     1762,
 /**/
     1761,