mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
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)
This commit is contained in:
parent
b255b90503
commit
46a53dfc29
20
src/buffer.c
20
src/buffer.c
@ -1841,6 +1841,20 @@ no_write_message_nobang(buf_T *buf UNUSED)
|
|||||||
|
|
||||||
static int top_file_num = 1; /* highest file number */
|
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.
|
* 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 the same file name already exists return a pointer to that buffer.
|
||||||
@ -1921,11 +1935,7 @@ buflist_new(
|
|||||||
* buffer.)
|
* buffer.)
|
||||||
*/
|
*/
|
||||||
buf = NULL;
|
buf = NULL;
|
||||||
if ((flags & BLN_CURBUF)
|
if ((flags & BLN_CURBUF) && curbuf_reusable())
|
||||||
&& curbuf != NULL
|
|
||||||
&& curbuf->b_ffname == NULL
|
|
||||||
&& curbuf->b_nwindows <= 1
|
|
||||||
&& (curbuf->b_ml.ml_mfp == NULL || BUFEMPTY()))
|
|
||||||
{
|
{
|
||||||
buf = curbuf;
|
buf = curbuf;
|
||||||
/* It's like this buffer is deleted. Watch out for autocommands that
|
/* It's like this buffer is deleted. Watch out for autocommands that
|
||||||
|
@ -2941,6 +2941,8 @@ ex_next(exarg_T *eap)
|
|||||||
ex_argedit(exarg_T *eap)
|
ex_argedit(exarg_T *eap)
|
||||||
{
|
{
|
||||||
int i = eap->addr_count ? (int)eap->line2 : curwin->w_arg_idx + 1;
|
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)
|
if (do_arglist(eap->arg, AL_ADD, i) == FAIL)
|
||||||
return;
|
return;
|
||||||
@ -2948,8 +2950,9 @@ ex_argedit(exarg_T *eap)
|
|||||||
maketitle();
|
maketitle();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (curwin->w_arg_idx == 0 && (curbuf->b_ml.ml_flags & ML_EMPTY)
|
if (curwin->w_arg_idx == 0
|
||||||
&& curbuf->b_ffname == NULL)
|
&& (curbuf->b_ml.ml_flags & ML_EMPTY)
|
||||||
|
&& (curbuf->b_ffname == NULL || curbuf_is_reusable))
|
||||||
i = 0;
|
i = 0;
|
||||||
/* Edit the argument. */
|
/* Edit the argument. */
|
||||||
if (i < ARGCOUNT)
|
if (i < ARGCOUNT)
|
||||||
@ -3281,7 +3284,8 @@ alist_add_list(
|
|||||||
for (i = 0; i < count; ++i)
|
for (i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
ARGLIST[after + i].ae_fname = files[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;
|
ALIST(curwin)->al_ga.ga_len += count;
|
||||||
if (old_argcount > 0 && curwin->w_arg_idx >= after)
|
if (old_argcount > 0 && curwin->w_arg_idx >= after)
|
||||||
|
@ -15,6 +15,7 @@ void enter_buffer(buf_T *buf);
|
|||||||
void do_autochdir(void);
|
void do_autochdir(void);
|
||||||
void no_write_message(void);
|
void no_write_message(void);
|
||||||
void no_write_message_nobang(buf_T *buf);
|
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);
|
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);
|
void free_buf_options(buf_T *buf, int free_p_ff);
|
||||||
int buflist_getfile(int n, linenr_T lnum, int options, int forceit);
|
int buflist_getfile(int n, linenr_T lnum, int options, int forceit);
|
||||||
|
@ -308,6 +308,18 @@ func Test_argedit()
|
|||||||
%argd
|
%argd
|
||||||
bwipe! C
|
bwipe! C
|
||||||
bwipe! D
|
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
|
endfunc
|
||||||
|
|
||||||
" Test for the :argdelete command
|
" Test for the :argdelete command
|
||||||
|
@ -173,7 +173,6 @@ func Test_command_count_4()
|
|||||||
only!
|
only!
|
||||||
|
|
||||||
exe bufnr . 'buf'
|
exe bufnr . 'buf'
|
||||||
bnext
|
|
||||||
let bufnr = bufnr('%')
|
let bufnr = bufnr('%')
|
||||||
let buffers = []
|
let buffers = []
|
||||||
.,$-bufdo call add(buffers, bufnr('%'))
|
.,$-bufdo call add(buffers, bufnr('%'))
|
||||||
|
@ -761,6 +761,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1763,
|
||||||
/**/
|
/**/
|
||||||
1762,
|
1762,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user