changeset 34500:4da97f213d15 v9.1.0156

patch 9.1.0156: Make 'wfb' failing to split still report E1513 Commit: https://github.com/vim/vim/commit/769eb2d0c3614f9ea6fffa82329558f1a4af384f Author: Sean Dewar <6256228+seandewar@users.noreply.github.com> Date: Thu Mar 7 21:37:50 2024 +0100 patch 9.1.0156: Make 'wfb' failing to split still report E1513 Problem: may not be clear why failing to split causes an ":Xdo" command to abort if 'wfb' is set. Solution: do not return immediately if win_split fails, so E1513 is still given. Expect both errors in the test. Also fix tests to pass CI. (Sean Dewar) closes: #14152 Signed-off-by: Sean Dewar <6256228+seandewar@users.noreply.github.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Thu, 07 Mar 2024 21:45:09 +0100
parents 2b64ae7b046c
children 70ab092d64b3
files src/ex_cmds2.c src/quickfix.c src/testdir/test_winfixbuf.vim src/version.c
diffstat 4 files changed, 50 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -475,13 +475,12 @@ ex_listdo(exarg_T *eap)
 	{
 	    // Split the window, which will be 'nowinfixbuf', and set curwin to
 	    // that
-	    if (win_split(0, 0) == FAIL)
-		return; // error message already given
+	    (void)win_split(0, 0);
 
 	    if (curwin->w_p_wfb)
 	    {
 		// Autocommands set 'winfixbuf' or sent us to another window
-		// with it set.  Give up.
+		// with it set, or we failed to split the window.  Give up.
 		emsg(_(e_winfixbuf_cannot_go_to_buffer));
 		return;
 	    }
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -3293,8 +3293,9 @@ qf_jump_edit_buffer(
 		if (curwin->w_p_wfb)
 		{
 		    // Autocommands set 'winfixbuf' or sent us to another window
-		    // with it set.  Give up, but don't return immediately, as
-		    // they may have messed with the list.
+		    // with it set, or we failed to split the window.  Give up,
+		    // but don't return immediately, as they may have messed
+		    // with the list.
 		    emsg(_(e_winfixbuf_cannot_go_to_buffer));
 		    retval = FAIL;
 		}
--- a/src/testdir/test_winfixbuf.vim
+++ b/src/testdir/test_winfixbuf.vim
@@ -479,6 +479,9 @@ endfunc
 
 " Fail :browse edit but :browse edit! is allowed
 func Test_browse_edit_fail()
+  " A GUI dialog may stall the test.
+  CheckNotGui
+
   call s:reset_all_buffers()
 
   let l:other = s:make_buffer_pairs()
@@ -487,18 +490,31 @@ func Test_browse_edit_fail()
   call assert_fails("browse edit other", "E1513:")
   call assert_equal(l:current, bufnr())
 
-  browse edit! other
-  call assert_equal(l:other, bufnr())
+  try
+    browse edit! other
+    call assert_equal(l:other, bufnr())
+  catch /E338:/
+    " Ignore E338, which occurs if console Vim is built with +browse.
+    " Console Vim without +browse will treat this as a regular :edit.
+  endtry
 endfunc
 
 " Allow :browse w because it doesn't change the buffer in the current file
 func Test_browse_edit_pass()
+  " A GUI dialog may stall the test.
+  CheckNotGui
+
   call s:reset_all_buffers()
 
   let l:other = s:make_buffer_pairs()
   let l:current = bufnr()
 
-  browse write other
+  try
+    browse write other
+  catch /E338:/
+    " Ignore E338, which occurs if console Vim is built with +browse.
+    " Console Vim without +browse will treat this as a regular :write.
+  endtry
 
   call delete("other")
 endfunc
@@ -1145,6 +1161,7 @@ func Test_find()
   let l:current = bufnr()
   let l:file = tempname()
   call writefile([], l:file)
+  let l:file = fnamemodify(l:file, ':p')  " In case it's Windows 8.3-style.
   let l:directory = fnamemodify(l:file, ":p:h")
   let l:name = fnamemodify(l:file, ":p:t")
 
@@ -1514,6 +1531,7 @@ func Test_lnfile()
   call assert_equal(l:current, bufnr())
 
   call assert_fails("lnfile", "E1513:")
+  " Ensure the entry didn't change.
   call assert_equal(2, getloclist(0, #{idx: 0}).idx)
   call assert_equal(l:current, bufnr())
 
@@ -2490,8 +2508,8 @@ func Test_previous()
   call assert_equal(l:first, bufnr())
 endfunc
 
-" Fail pydo if it changes a window with 'winfixbuf' is set
-func Test_python_pydo()
+" Fail pyxdo if it changes a window with 'winfixbuf' is set
+func Test_pythonx_pyxdo()
   CheckFeature pythonx
   call s:reset_all_buffers()
 
@@ -2504,17 +2522,17 @@ func Test_python_pydo()
 
   set winfixbuf
 
-  python << EOF
+  pythonx << EOF
 import vim
 
-def test_winfixbuf_Test_python_pydo_set_buffer():
+def test_winfixbuf_Test_pythonx_pyxdo_set_buffer():
     buffer = vim.vars['_previous_buffer']
     vim.current.buffer = vim.buffers[buffer]
 EOF
 
   try
-    pydo test_winfixbuf_Test_python_pydo_set_buffer()
-  catch /Vim(pydo):vim.error: Vim:E1513: Cannot edit buffer. 'winfixbuf' is enabled/
+    pyxdo test_winfixbuf_Test_pythonx_pyxdo_set_buffer()
+  catch /Vim(pyxdo):vim.error: Vim:E1513: Cannot edit buffer. 'winfixbuf' is enabled/
     let l:caught = 1
   endtry
 
@@ -2523,8 +2541,8 @@ EOF
   unlet g:_previous_buffer
 endfunc
 
-" Fail pyfile if it changes a window with 'winfixbuf' is set
-func Test_python_pyfile()
+" Fail pyxfile if it changes a window with 'winfixbuf' is set
+func Test_pythonx_pyxfile()
   CheckFeature pythonx
   call s:reset_all_buffers()
 
@@ -2544,8 +2562,8 @@ func Test_python_pyfile()
         \ "file.py")
 
   try
-    pyfile file.py
-  catch /Vim(pyfile):vim.error: Vim:E1513: Cannot edit buffer. 'winfixbuf' is enabled/
+    pyxfile file.py
+  catch /Vim(pyxfile):vim.error: Vim:E1513: Cannot edit buffer. 'winfixbuf' is enabled/
     let l:caught = 1
   endtry
 
@@ -2556,7 +2574,7 @@ func Test_python_pyfile()
 endfunc
 
 " Fail vim.current.buffer if 'winfixbuf' is set
-func Test_python_vim_current_buffer()
+func Test_pythonx_vim_current_buffer()
   CheckFeature pythonx
   call s:reset_all_buffers()
 
@@ -2572,13 +2590,13 @@ func Test_python_vim_current_buffer()
   set winfixbuf
 
   try
-    python << EOF
+    pythonx << EOF
 import vim
 
 buffer = vim.vars["_previous_buffer"]
 vim.current.buffer = vim.buffers[buffer]
 EOF
-  catch /Vim(python):vim\.error: Vim:E1513: Cannot edit buffer. 'winfixbuf' is enabled/
+  catch /Vim(pythonx):vim\.error: Vim:E1513: Cannot edit buffer. 'winfixbuf' is enabled/
     let l:caught = 1
   endtry
 
@@ -3248,14 +3266,20 @@ func Test_quickfix_changed_split_failed(
   augroup! QfChanged
 endfunc
 
-func Test_bufdo_splitwin_fails()
+func Test_bufdo_cnext_splitwin_fails()
   call s:reset_all_buffers()
-  let other = s:make_buffer_pairs()
+  call s:make_simple_quickfix()
+  call assert_equal(1, getqflist(#{idx: 0}).idx)
   " Make sure there is not enough room to
   " split the winfixedbuf window
   let &winheight=&lines
   let &winminheight=&lines-2
-  call assert_fails(':bufdo echo 1', 'E36:')
+  " Still want E1513, or it may not be clear why a split was attempted and why
+  " it failing caused the commands to abort.
+  call assert_fails(':bufdo echo 1', ['E36:', 'E1513:'])
+  call assert_fails(':cnext', ['E36:', 'E1513:'])
+  " Ensure the entry didn't change.
+  call assert_equal(1, getqflist(#{idx: 0}).idx)
   set winminheight&vim winheight&vim
 endfunc
 
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    156,
+/**/
     155,
 /**/
     154,