Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
brammool committed Apr 24, 2018
1 parent b255b90 commit 46a53df
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 9 deletions.
20 changes: 15 additions & 5 deletions src/buffer.c
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down
10 changes: 7 additions & 3 deletions src/ex_cmds2.c
Expand Up @@ -2941,15 +2941,18 @@ 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;
#ifdef FEAT_TITLE
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)
Expand Down Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions src/proto/buffer.pro
Expand Up @@ -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);
Expand Down
12 changes: 12 additions & 0 deletions src/testdir/test_arglist.vim
Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion src/testdir/test_command_count.vim
Expand Up @@ -173,7 +173,6 @@ func Test_command_count_4()
only!

exe bufnr . 'buf'
bnext
let bufnr = bufnr('%')
let buffers = []
.,$-bufdo call add(buffers, bufnr('%'))
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -761,6 +761,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1763,
/**/
1762,
/**/
Expand Down

0 comments on commit 46a53df

Please sign in to comment.