diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2023-05-12 17:49:13 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-05-12 17:49:13 +0100 |
commit | 54be5fb382d2bf25fd1b17ddab8b21f599019b81 (patch) | |
tree | 2f8247870b818760f7dac718281ed4067090baf5 /src | |
parent | 8667a5678f983ba899825b810ab849952d49bcb8 (diff) | |
download | vim-git-54be5fb382d2bf25fd1b17ddab8b21f599019b81.tar.gz |
patch 9.0.1546: some commands for opening a file don't use 'switchbuf'v9.0.1546
Problem: Some commands for opening a file don't use 'switchbuf'.
Solution: Use 'switchbuf' for more commands. (Yegappan Lakshmanan,
closes #12383, closes #12381)
Diffstat (limited to 'src')
-rw-r--r-- | src/buffer.c | 2 | ||||
-rw-r--r-- | src/testdir/test_gf.vim | 61 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/window.c | 39 |
4 files changed, 95 insertions, 9 deletions
diff --git a/src/buffer.c b/src/buffer.c index 174ca1efb..60b7c8097 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -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). * Returns NULL if not found. @@ -2586,7 +2585,6 @@ buflist_findname_exp(char_u *fname) } return buf; } -#endif /* * Find file in buffer list by name (it has to be for the current window). diff --git a/src/testdir/test_gf.vim b/src/testdir/test_gf.vim index 8317cb5df..cc12b3618 100644 --- a/src/testdir/test_gf.vim +++ b/src/testdir/test_gf.vim @@ -292,4 +292,65 @@ func Test_gf_subdirs_wildcard() set path& 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 diff --git a/src/version.c b/src/version.c index f13f8e093..a87317222 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1546, +/**/ 1545, /**/ 1544, diff --git a/src/window.c b/src/window.c index 27b353e17..b4b23d358 100644 --- a/src/window.c +++ b/src/window.c @@ -580,7 +580,29 @@ wingotofile: need_mouse_correct = TRUE; #endif 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); if (do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, @@ -591,12 +613,15 @@ wingotofile: win_close(curwin, FALSE); goto_tabpage_win(oldtab, oldwin); } - else if (nchar == 'F' && lnum >= 0) - { - curwin->w_cursor.lnum = lnum; - check_cursor_lnum(); - beginline(BL_SOL | BL_FIX); - } + else + wp = curwin; + } + + if (wp != NULL && nchar == 'F' && lnum >= 0) + { + curwin->w_cursor.lnum = lnum; + check_cursor_lnum(); + beginline(BL_SOL | BL_FIX); } vim_free(ptr); } |