# HG changeset patch # User Bram Moolenaar # Date 1664020804 -7200 # Node ID 072c61082148743296e9cd37f16b36a954c50ea8 # Parent adb1bc2b3cb6ae8332b53d6a84f404039fcffdc8 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 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) diff --git a/src/normal.c b/src/normal.c --- 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 to abandon all changes and exit Vim")); + { + char *ms = _("Type :qa! and press to abandon all changes and exit Vim"); + + if (out_redir) + mch_errmsg(ms); + else + msg(ms); + } else - msg(_("Type :qa and press to exit Vim")); + { + if (out_redir) + { + got_int = FALSE; + do_cmdline_cmd((char_u *)"qa"); + } + else + msg(_("Type :qa and press to exit Vim")); + } } if (restart_edit != 0) diff --git a/src/testdir/test_startup.vim b/src/testdir/test_startup.vim --- 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\") + 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, "\") + sleep 100m + call term_sendkeys(buf, "exit\") + 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() diff --git a/src/version.c b/src/version.c --- 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,