changeset 18646:394abd397e15 v8.1.2315

patch 8.1.2315: not always using the right window when jumping to an error Commit: https://github.com/vim/vim/commit/539aa6b25eaea91dfd1a175cd053c0f259fa2e58 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Nov 17 18:09:38 2019 +0100 patch 8.1.2315: not always using the right window when jumping to an error Problem: Not always using the right window when jumping to an error. Solution: Add the "uselast" flag in 'switchbuf'. (closes https://github.com/vim/vim/issues/1652)
author Bram Moolenaar <Bram@vim.org>
date Sun, 17 Nov 2019 18:15:03 +0100
parents d07c730f4fd2
children 7fe816006953
files runtime/doc/options.txt src/option.h src/optionstr.c src/quickfix.c src/testdir/test_quickfix.vim src/version.c
diffstat 6 files changed, 21 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -7417,6 +7417,8 @@ A jump table for the options with a shor
 	   vsplit	Just like "split" but split vertically.
 	   newtab	Like "split", but open a new tab page.  Overrules
 			"split" when both are present.
+	   uselast	If included, jump to the previously used window when
+			jumping to errors with |quickfix| commands.
 
 						*'synmaxcol'* *'smc'*
 'synmaxcol' 'smc'	number	(default 3000)
--- a/src/option.h
+++ b/src/option.h
@@ -911,11 +911,13 @@ EXTERN char_u	*p_su;		// 'suffixes'
 EXTERN char_u	*p_sws;		// 'swapsync'
 EXTERN char_u	*p_swb;		// 'switchbuf'
 EXTERN unsigned	swb_flags;
+// Keep in sync with p_swb_values in optionstr.c
 #define SWB_USEOPEN		0x001
 #define SWB_USETAB		0x002
 #define SWB_SPLIT		0x004
 #define SWB_NEWTAB		0x008
 #define SWB_VSPLIT		0x010
+#define SWB_USELAST		0x020
 EXTERN char_u	*p_syn;		// 'syntax'
 EXTERN long	p_ts;		// 'tabstop'
 EXTERN int	p_tbs;		// 'tagbsearch'
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -39,7 +39,8 @@ static char *(p_ssop_values[]) = {"buffe
     "localoptions", "options", "help", "blank", "globals", "slash", "unix",
     "sesdir", "curdir", "folds", "cursor", "tabpages", "terminal", NULL};
 #endif
-static char *(p_swb_values[]) = {"useopen", "usetab", "split", "newtab", "vsplit", NULL};
+// Keep in sync with SWB_ flags in option.h
+static char *(p_swb_values[]) = {"useopen", "usetab", "split", "newtab", "vsplit", "uselast", NULL};
 static char *(p_tc_values[]) = {"followic", "ignore", "match", "followscs", "smart", NULL};
 #if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_MSWIN)
 static char *(p_toolbar_values[]) = {"text", "icons", "tooltips", "horiz", NULL};
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -3013,8 +3013,11 @@ qf_goto_win_with_qfl_file(int qf_fnum)
 	if (IS_QF_WINDOW(win))
 	{
 	    // Didn't find it, go to the window before the quickfix
-	    // window.
-	    if (altwin != NULL)
+	    // window, unless 'switchbuf' contains 'uselast': in this case we
+	    // try to jump to the previously used window first.
+	    if ((swb_flags & SWB_USELAST) && win_valid(prevwin))
+		win = prevwin;
+	    else if (altwin != NULL)
 		win = altwin;
 	    else if (curwin->w_prev != NULL)
 		win = curwin->w_prev;
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -1664,6 +1664,14 @@ func Test_switchbuf()
   call assert_equal(3, tabpagenr('$'))
   tabfirst | enew | tabonly | only
 
+  set switchbuf=uselast
+  split
+  let last_winid = win_getid()
+  copen
+  exe "normal 1G\<CR>"
+  call assert_equal(last_winid, win_getid())
+  enew | only
+
   set switchbuf=
   edit Xqftestfile1
   let file1_winid = win_getid()
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2315,
+/**/
     2314,
 /**/
     2313,