changeset 30467:072c61082148 v9.0.0569

patch 9.0.0569: cannot easily get out when using "vim file | grep word" Commit: https://github.com/vim/vim/commit/5939c357431f8e43853ad80b03303167f39763df Author: Bram Moolenaar <Bram@vim.org> Date: Sat Sep 24 12:50:45 2022 +0100 patch 9.0.0569: cannot easily get out when using "vim file | grep word" Problem: Cannot easily get out when using "vim file | grep word". Solution: Without changes let CTRL-C exit Vim. Otherwise give a message on stderr. (closes #11209)
author Bram Moolenaar <Bram@vim.org>
date Sat, 24 Sep 2022 14:00:04 +0200
parents adb1bc2b3cb6
children bd5ffb8b2360
files src/normal.c src/testdir/test_startup.vim src/version.c
diffstat 3 files changed, 50 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/normal.c
+++ b/src/normal.c
@@ -6793,10 +6793,33 @@ nv_esc(cmdarg_T *cap)
 		&& !VIsual_active
 		&& no_reason)
 	{
+	    int	out_redir = !stdout_isatty
+#ifdef FEAT_GUI
+				&& !gui.in_use
+#endif
+				;
+	    // The user may accidentally do "vim file | grep word" and then
+	    // CTRL-C doesn't show anything.  With a changed buffer give the
+	    // message on stderr.  Without any changes might as well exit.
 	    if (anyBufIsChanged())
-		msg(_("Type  :qa!  and press <Enter> to abandon all changes and exit Vim"));
+	    {
+		char *ms = _("Type  :qa!  and press <Enter> to abandon all changes and exit Vim");
+
+		if (out_redir)
+		    mch_errmsg(ms);
+		else
+		    msg(ms);
+	    }
 	    else
-		msg(_("Type  :qa  and press <Enter> to exit Vim"));
+	    {
+		if (out_redir)
+		{
+		    got_int = FALSE;
+		    do_cmdline_cmd((char_u *)"qa");
+		}
+		else
+		    msg(_("Type  :qa  and press <Enter> to exit Vim"));
+	    }
 	}
 
 	if (restart_edit != 0)
--- a/src/testdir/test_startup.vim
+++ b/src/testdir/test_startup.vim
@@ -1109,6 +1109,29 @@ func Test_not_a_term()
   call delete('Xvimout')
 endfunc
 
+" Test quitting with CTRL-C when output is redirected.
+func Test_redirect_Ctrl_C()
+  CheckUnix
+  CheckNotGui
+  CheckRunVimInTerminal
+
+  let buf = Run_shell_in_terminal({})
+  " Wait for the shell to display a prompt
+  call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))})
+
+  call term_sendkeys(buf, GetVimProg() .. " | grep word\<CR>")
+  call WaitForAssert({-> assert_match("Output is not to a terminal", getline(1, 4)->join())})
+  " wait for the hard coded delay, otherwise the CTRL-C interrupts startup
+  sleep 2
+  call term_sendkeys(buf, "\<C-C>")
+  sleep 100m
+  call term_sendkeys(buf, "exit\<CR>")
+  call WaitForAssert({-> assert_equal('dead', job_status(g:job))})
+
+  exe buf . 'bwipe!'
+  unlet g:job
+endfunc
+
 
 " Test for the "-w scriptout" argument
 func Test_w_arg()
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    569,
+/**/
     568,
 /**/
     567,