0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 9.1.0046: :drop does not re-use empty buffer

Problem:  :drop does not re-use empty buffer
          (Rocco Mao)
Solution: Make :drop re-use an empty buffer
          (Rocco Mao)

fixes: #13851
closes: #13881

Signed-off-by: Rocco Mao <dapeng.mao@qq.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Rocco Mao
2024-01-23 21:27:19 +01:00
committed by Christian Brabandt
parent cc979b49dc
commit f96dc8d07f
5 changed files with 87 additions and 6 deletions

View File

@@ -502,7 +502,7 @@ do_arglist(
void void
set_arglist(char_u *str) set_arglist(char_u *str)
{ {
do_arglist(str, AL_SET, 0, FALSE); do_arglist(str, AL_SET, 0, TRUE);
} }
/* /*

View File

@@ -5425,8 +5425,7 @@ ex_smile(exarg_T *eap UNUSED)
/* /*
* ":drop" * ":drop"
* Opens the first argument in a window. When there are two or more arguments * Opens the first argument in a window, and the argument list is redefined.
* the argument list is redefined.
*/ */
void void
ex_drop(exarg_T *eap) ex_drop(exarg_T *eap)
@@ -5463,6 +5462,8 @@ ex_drop(exarg_T *eap)
// edited in a window yet. It's like ":tab all" but without closing // edited in a window yet. It's like ":tab all" but without closing
// windows or tabs. // windows or tabs.
ex_all(eap); ex_all(eap);
cmdmod.cmod_tab = 0;
ex_rewind(eap);
return; return;
} }
@@ -5486,6 +5487,7 @@ ex_drop(exarg_T *eap)
buf_check_timestamp(curbuf, FALSE); buf_check_timestamp(curbuf, FALSE);
curbuf->b_p_ar = save_ar; curbuf->b_p_ar = save_ar;
} }
ex_rewind(eap);
return; return;
} }
} }

View File

@@ -84,18 +84,27 @@ endfunc
" Test for the :drop command " Test for the :drop command
func Test_drop_cmd() func Test_drop_cmd()
call writefile(['L1', 'L2'], 'Xdropfile', 'D') call writefile(['L1', 'L2'], 'Xdropfile', 'D')
" Test for reusing the current buffer
enew | only enew | only
let expected_nr = bufnr()
drop Xdropfile drop Xdropfile
call assert_equal(expected_nr, bufnr())
call assert_equal('L2', getline(2)) call assert_equal('L2', getline(2))
" Test for switching to an existing window " Test for switching to an existing window
below new below new
drop Xdropfile drop Xdropfile
call assert_equal(1, winnr()) call assert_equal(1, winnr())
" Test for splitting the current window " Test for splitting the current window (set nohidden)
enew | only enew | only
set modified set modified
drop Xdropfile drop Xdropfile
call assert_equal(2, winnr('$')) call assert_equal(2, winnr('$'))
" Not splitting the current window even if modified (set hidden)
set hidden
enew | only
set modified
drop Xdropfile
call assert_equal(1, winnr('$'))
" Check for setting the argument list " Check for setting the argument list
call assert_equal(['Xdropfile'], argv()) call assert_equal(['Xdropfile'], argv())
enew | only! enew | only!

View File

@@ -164,6 +164,74 @@ func Test_tabpage_drop()
bwipe! bwipe!
bwipe! bwipe!
call assert_equal(1, tabpagenr('$')) call assert_equal(1, tabpagenr('$'))
call assert_equal(1, winnr('$'))
call assert_equal('', bufname(''))
call writefile(['L1', 'L2'], 'Xdropfile', 'D')
" Test for ':tab drop single-file': reuse current buffer
let expected_nr = bufnr()
tab drop Xdropfile
call assert_equal(1, tabpagenr('$'))
call assert_equal(expected_nr, bufnr())
call assert_equal('L2', getline(2))
bwipe!
" Test for ':tab drop single-file': not reuse modified buffer
set modified
let expected_nr = bufnr() + 1
tab drop Xdropfile
call assert_equal(2, tabpagenr())
call assert_equal(2, tabpagenr('$'))
call assert_equal(expected_nr, bufnr())
call assert_equal('L2', getline(2))
bwipe!
" Test for ':tab drop single-file': multiple tabs already exist
tab split f2
tab split f3
let expected_nr = bufnr() + 1
tab drop Xdropfile
call assert_equal(4, tabpagenr())
call assert_equal(4, tabpagenr('$'))
call assert_equal(expected_nr, bufnr())
call assert_equal('L2', getline(2))
%bwipe!
" Test for ':tab drop multi-files': reuse current buffer
let expected_nr = bufnr()
tab drop Xdropfile f1 f2 f3
call assert_equal(1, tabpagenr())
call assert_equal(4, tabpagenr('$'))
call assert_equal(expected_nr, bufnr())
call assert_equal('L2', getline(2))
%bwipe!
" Test for ':tab drop multi-files': not reuse modified buffer
set modified
let expected_nr = bufnr() + 1
tab drop Xdropfile f1 f2 f3
call assert_equal(2, tabpagenr())
call assert_equal(5, tabpagenr('$'))
call assert_equal(expected_nr, bufnr())
call assert_equal('L2', getline(2))
%bwipe!
" Test for ':tab drop multi-files': multiple tabs already exist
tab split f2
tab split f3
let expected_nr = bufnr() + 1
tab drop a b c
call assert_equal(4, tabpagenr())
call assert_equal(6, tabpagenr('$'))
call assert_equal(expected_nr, bufnr())
let expected_nr = bufnr() + 3
tab drop Xdropfile f1 f2 f3
call assert_equal(5, tabpagenr())
call assert_equal(8, tabpagenr('$'))
call assert_equal(expected_nr, bufnr())
call assert_equal('L2', getline(2))
%bwipe!
endfunc endfunc
" Test autocommands " Test autocommands
@@ -260,14 +328,14 @@ function Test_tabpage_with_autocmd_tab_drop()
let s:li = [] let s:li = []
tab drop test1 tab drop test1
call assert_equal(['BufLeave', 'BufEnter'], s:li) call assert_equal(['BufEnter'], s:li)
let s:li = [] let s:li = []
tab drop test2 test3 tab drop test2 test3
call assert_equal([ call assert_equal([
\ 'TabLeave', 'TabEnter', 'TabLeave', 'TabEnter', \ 'TabLeave', 'TabEnter', 'TabLeave', 'TabEnter',
\ 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter', \ 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter',
\ 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter'], s:li) \ 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter', 'BufEnter'], s:li)
autocmd! TestTabpageGroup autocmd! TestTabpageGroup
augroup! TestTabpageGroup augroup! TestTabpageGroup

View File

@@ -704,6 +704,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 */
/**/
46,
/**/ /**/
45, 45,
/**/ /**/