0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 9.0.1546: some commands for opening a file don't use 'switchbuf'

Problem:    Some commands for opening a file don't use 'switchbuf'.
Solution:   Use 'switchbuf' for more commands. (Yegappan Lakshmanan,
            closes #12383, closes #12381)
This commit is contained in:
Yegappan Lakshmanan 2023-05-12 17:49:13 +01:00 committed by Bram Moolenaar
parent 8667a5678f
commit 54be5fb382
5 changed files with 106 additions and 18 deletions

View File

@ -7928,16 +7928,18 @@ A jump table for the options with a short description can be found at |Q_op|.
'switchbuf' 'swb' string (default "") 'switchbuf' 'swb' string (default "")
global global
This option controls the behavior when switching between buffers. This option controls the behavior when switching between buffers.
Mostly for |quickfix| commands some values are also used for other This option is checked, when
commands, as mentioned below. - jumping to errors with the |quickfix| commands (|:cc|, |:cn|, |:cp|,
etc.)
- jumping to a tag using the |:stag| command.
- opening a file using the |CTRL-W_f| or |CTRL-W_F| command.
- jumping to a buffer using a buffer split command (e.g. |:sbuffer|,
|:sbnext|, or |:sbrewind|).
Possible values (comma-separated list): Possible values (comma-separated list):
useopen If included, jump to the first open window that useopen If included, jump to the first open window in the
contains the specified buffer (if there is one). current tab page that contains the specified buffer
Otherwise: Do not examine other windows. (if there is one). Otherwise: Do not examine other
This setting is checked with |quickfix| commands, when windows.
jumping to errors (":cc", ":cn", "cp", etc.). It is
also used in all buffer related split commands, for
example ":sbuffer", ":sbnext", or ":sbrewind".
usetab Like "useopen", but also consider windows in other tab usetab Like "useopen", but also consider windows in other tab
pages. pages.
split If included, split the current window before loading split If included, split the current window before loading

View File

@ -2560,7 +2560,6 @@ buflist_getfpos(void)
} }
} }
#if defined(FEAT_QUICKFIX) || defined(FEAT_EVAL) || defined(FEAT_SPELL) || defined(PROTO)
/* /*
* Find file in buffer list by name (it has to be for the current window). * Find file in buffer list by name (it has to be for the current window).
* Returns NULL if not found. * Returns NULL if not found.
@ -2586,7 +2585,6 @@ buflist_findname_exp(char_u *fname)
} }
return buf; return buf;
} }
#endif
/* /*
* Find file in buffer list by name (it has to be for the current window). * Find file in buffer list by name (it has to be for the current window).

View File

@ -292,4 +292,65 @@ func Test_gf_subdirs_wildcard()
set path& set path&
endfunc endfunc
" Test for 'switchbuf' with gf and gF commands
func Test_gf_switchbuf()
call writefile(repeat(["aaa"], 10), "Xtest1", 'D')
edit Xtest1
new
call setline(1, ['Xtest1'])
" Test for 'useopen'
set switchbuf=useopen
call cursor(1, 1)
exe "normal \<C-W>f"
call assert_equal([2, 2], [winnr(), winnr('$')])
close
" If the file is opened in another tabpage, then it should not be considered
tabedit Xtest1
tabfirst
exe "normal \<C-W>f"
call assert_equal([1, 2], [winnr(), winnr('$')])
call assert_equal([1, 2], [tabpagenr(), tabpagenr('$')])
close
" Test for 'usetab'
set switchbuf=usetab
exe "normal \<C-W>f"
call assert_equal([1, 1], [winnr(), winnr('$')])
call assert_equal([2, 2], [tabpagenr(), tabpagenr('$')])
%bw!
" Test for CTRL-W_F with 'useopen'
set isfname-=:
call setline(1, ['Xtest1:5'])
set switchbuf=useopen
split +1 Xtest1
wincmd b
exe "normal \<C-W>F"
call assert_equal([1, 2], [winnr(), winnr('$')])
call assert_equal(5, line('.'))
close
" If the file is opened in another tabpage, then it should not be considered
tabedit +1 Xtest1
tabfirst
exe "normal \<C-W>F"
call assert_equal([1, 2], [winnr(), winnr('$')])
call assert_equal(5, line('.'))
call assert_equal([1, 2], [tabpagenr(), tabpagenr('$')])
close
" Test for CTRL_W_F with 'usetab'
set switchbuf=usetab
exe "normal \<C-W>F"
call assert_equal([2, 2], [tabpagenr(), tabpagenr('$')])
call assert_equal([1, 1], [winnr(), winnr('$')])
call assert_equal(5, line('.'))
set switchbuf=
set isfname&
%bw!
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@ -695,6 +695,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 */
/**/
1546,
/**/ /**/
1545, 1545,
/**/ /**/

View File

@ -580,7 +580,29 @@ wingotofile:
need_mouse_correct = TRUE; need_mouse_correct = TRUE;
#endif #endif
setpcmark(); setpcmark();
if (win_split(0, 0) == OK)
// If 'switchbuf' is set to 'useopen' or 'usetab' and the
// file is already opened in a window, then jump to it.
wp = NULL;
if ((swb_flags & (SWB_USEOPEN | SWB_USETAB))
&& cmdmod.cmod_tab == 0)
{
buf_T *existing_buf = buflist_findname_exp(ptr);
if (existing_buf != NULL)
{
if (swb_flags & SWB_USEOPEN)
wp = buf_jump_open_win(existing_buf);
// If 'switchbuf' contains "usetab": jump to first
// window in any tab page containing "existing_buf"
// if one exists.
if (wp == NULL && (swb_flags & SWB_USETAB))
wp = buf_jump_open_tab(existing_buf);
}
}
if (wp == NULL && win_split(0, 0) == OK)
{ {
RESET_BINDING(curwin); RESET_BINDING(curwin);
if (do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, if (do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL,
@ -591,12 +613,15 @@ wingotofile:
win_close(curwin, FALSE); win_close(curwin, FALSE);
goto_tabpage_win(oldtab, oldwin); goto_tabpage_win(oldtab, oldwin);
} }
else if (nchar == 'F' && lnum >= 0) else
{ wp = curwin;
curwin->w_cursor.lnum = lnum; }
check_cursor_lnum();
beginline(BL_SOL | BL_FIX); if (wp != NULL && nchar == 'F' && lnum >= 0)
} {
curwin->w_cursor.lnum = lnum;
check_cursor_lnum();
beginline(BL_SOL | BL_FIX);
} }
vim_free(ptr); vim_free(ptr);
} }