diff options
author | Bram Moolenaar <Bram@vim.org> | 2007-08-10 19:33:47 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2007-08-10 19:33:47 +0000 |
commit | 225d32b910b202fdacabb2c0daa6a2e24943cc43 (patch) | |
tree | b0ac5d0b1157b13563db61c3c19cd1943ae82897 /src/main.c | |
parent | abc9773580f74a0767da91af5f342de4ee12936f (diff) |
updated for version 7.1-059v7.1.059
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/main.c b/src/main.c index fdfc2b82f0..7d553f1558 100644 --- a/src/main.c +++ b/src/main.c @@ -954,7 +954,8 @@ main_loop(cmdwin, noexmode) int cmdwin; /* TRUE when working in the command-line window */ int noexmode; /* TRUE when return on entering Ex mode */ { - oparg_T oa; /* operator arguments */ + oparg_T oa; /* operator arguments */ + int previous_got_int = FALSE; /* "got_int" was TRUE */ #if defined(FEAT_X11) && defined(FEAT_XCLIPBOARD) /* Setup to catch a terminating error from the X server. Just ignore @@ -1015,12 +1016,32 @@ main_loop(cmdwin, noexmode) need_fileinfo = FALSE; } } - if (got_int && !global_busy) + + /* Reset "got_int" now that we got back to the main loop. Except when + * inside a ":g/pat/cmd" command, then the "got_int" needs to abort + * the ":g" command. + * For ":g/pat/vi" we reset "got_int" when used once. When used + * a second time we go back to Ex mode and abort the ":g" command. */ + if (got_int) { - if (!quit_more) - (void)vgetc(); /* flush all buffers */ - got_int = FALSE; + if (noexmode && global_busy && !exmode_active && previous_got_int) + { + /* Typed two CTRL-C in a row: go back to ex mode as if "Q" was + * used and keep "got_int" set, so that it aborts ":g". */ + exmode_active = EXMODE_NORMAL; + State = NORMAL; + } + else if (!global_busy || !exmode_active) + { + if (!quit_more) + (void)vgetc(); /* flush all buffers */ + got_int = FALSE; + } + previous_got_int = TRUE; } + else + previous_got_int = FALSE; + if (!exmode_active) msg_scroll = FALSE; quit_more = FALSE; |