diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-05-13 08:40:06 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-13 08:40:06 +0800 |
commit | f76e1ac92eda9cb364a9de49422b45a035256ca6 (patch) | |
tree | 6cc375a9410c04d21392e5877513de831cf2f81f | |
parent | a6d63591f1fc61d570b646306d7c259b5ec2cace (diff) | |
download | rneovim-f76e1ac92eda9cb364a9de49422b45a035256ca6.tar.gz rneovim-f76e1ac92eda9cb364a9de49422b45a035256ca6.tar.bz2 rneovim-f76e1ac92eda9cb364a9de49422b45a035256ca6.zip |
vim-patch:9.0.1546: some commands for opening a file don't use 'switchbuf' (#23600)
Problem: Some commands for opening a file don't use 'switchbuf'.
Solution: Use 'switchbuf' for more commands. (Yegappan Lakshmanan,
closes vim/vim#12383, closes vim/vim#12381)
https://github.com/vim/vim/commit/54be5fb382d2bf25fd1b17ddab8b21f599019b81
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
-rw-r--r-- | runtime/doc/options.txt | 20 | ||||
-rw-r--r-- | src/nvim/window.c | 36 | ||||
-rw-r--r-- | test/old/testdir/test_gf.vim | 61 |
3 files changed, 103 insertions, 14 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index c87b6f1835..934e3353fa 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -6201,16 +6201,18 @@ A jump table for the options with a short description can be found at |Q_op|. 'switchbuf' 'swb' string (default "uselast") global This option controls the behavior when switching between buffers. - Mostly for |quickfix| commands some values are also used for other - commands, as mentioned below. + This option is checked, when + - 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): - useopen If included, jump to the first open window that - contains the specified buffer (if there is one). - Otherwise: Do not examine other windows. - This setting is checked with |quickfix| commands, when - jumping to errors (":cc", ":cn", "cp", etc.). It is - also used in all buffer related split commands, for - example ":sbuffer", ":sbnext", or ":sbrewind". + useopen If included, jump to the first open window in the + current tab page that contains the specified buffer + (if there is one). Otherwise: Do not examine other + windows. usetab Like "useopen", but also consider windows in other tab pages. split If included, split the current window before loading diff --git a/src/nvim/window.c b/src/nvim/window.c index fd6755a382..45a48f13cc 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -514,18 +514,44 @@ wingotofile: tabpage_T *oldtab = curtab; win_T *oldwin = curwin; 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. + win_T *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, ECMD_HIDE, NULL) == FAIL) { // Failed to open the file, close the window opened for it. win_close(curwin, false, 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); + } xfree(ptr); } break; diff --git a/test/old/testdir/test_gf.vim b/test/old/testdir/test_gf.vim index f09dbd72ce..9824c8276e 100644 --- a/test/old/testdir/test_gf.vim +++ b/test/old/testdir/test_gf.vim @@ -300,4 +300,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 |