]> granicus.if.org Git - vim/commitdiff
patch 9.0.0569: cannot easily get out when using "vim file | grep word" v9.0.0569
authorBram Moolenaar <Bram@vim.org>
Sat, 24 Sep 2022 11:50:45 +0000 (12:50 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 24 Sep 2022 11:50:45 +0000 (12:50 +0100)
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)

src/normal.c
src/testdir/test_startup.vim
src/version.c

index 35f7610c310c6ad2a68ebf413e052b7c54fc9ef8..be578ae27ee643a9b45d6e19b1928c8ddd3037e0 100644 (file)
@@ -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)
index 6cc62ad015f50e5ddaa6422523e3950a121edd46..7995cd2e5bb044827d6b577612325964db830eca 100644 (file)
@@ -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()
index e8d6253e09af774815e75fa7c69b9643ea02f92c..09b05187ea8afceed5999b659f70c0ccef1189b3 100644 (file)
@@ -699,6 +699,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    569,
 /**/
     568,
 /**/